From nobody Mon Apr 6 10:42:16 2026 Received: from mail-wr1-f42.google.com (mail-wr1-f42.google.com [209.85.221.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 17D4B3FE37D for ; Thu, 19 Mar 2026 20:26:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773951967; cv=none; b=SB+nCGUqjLZHem4IAGqaTSQ8yfwdrF9nG9RKVa7IRWQZ3liwOUYfPPhxW/kVYKtDAq39djDVuHw6z0Wdicp2ntCk+q5g3tdloUex/6jTkw5jMHF9rBqsSemX4qe59hwCpEg/e+fLvCOL/x5B87SKqXW3Sqv38GgRuKacx6/bFvQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773951967; c=relaxed/simple; bh=5GYgyHAPPb/c4TuOt/FovFbs4KdkJcctdoNSZgSBCI0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=LN6GyKtmXxIobPufxIsUSEdhrTgiJ/LuweEvtq6+UjgUifoN2zwSoVZHpOc20iFcokMfapFZE6Ttrc+vijwfyO1W4p4wGDiJP5ABsPT35B2FatNB1XYOiZUJZqhXGssw8SHzcgIRRbzHTQ9yf9j3XIvtvXoERJItyQKT8rO8J5w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Z1omyZ3+; arc=none smtp.client-ip=209.85.221.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Z1omyZ3+" Received: by mail-wr1-f42.google.com with SMTP id ffacd0b85a97d-439b611274bso598558f8f.3 for ; Thu, 19 Mar 2026 13:26:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773951960; x=1774556760; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=GxByceTa1YltExdfah9Lq3qXbpogAji5TptAgxuELUc=; b=Z1omyZ3+dWSDCnB+sTdM6BZTxwibX42H8JzDqMs7LXfbqsp0B2Wu4w96T8E86UbxYN CzNEjbfUykgrrf7Uk//pw1pY6bG+m0KgBbXHCeNcsGu0RwsAtYfI+V1YVQtN4gRIB3U/ ymNWouJlWSAqsYYU3ThkecLlhZI2dI2iR94eeLpayt5U3b3d7uCf98y7wLOSbcGRRY3s SXpnt398S1qyU1WKcWGDJLMzdhm0i/hwfFgGyLJh4D2aXa21brzrIH2dTfJpYiqg8A+P SPEORwPG4/970YzcPgMpynSMAJ5bNiJ0WcMvl+N46iqHTyi59TpCg11IiJDq17QXOVt4 CCig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773951960; x=1774556760; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=GxByceTa1YltExdfah9Lq3qXbpogAji5TptAgxuELUc=; b=sOCgDSzNEW0QnjfoTHMmsG2DOz+25ptxl2pRaWNXC/0nFKBpmXQ0pkHyrg1FEmoCAZ vUELBKyTv5cnMegKLiGQ8kAOBWVuGcrOUCFvYXvg85gHBJKfzsMkzkGKEkUzjKks6N6o 6Smx4bBKAf/qEoHHS075KpuxDl+GRtkvdoB5lmqT+gpD4tE1jBaZ86MiFKKkfm/r/HgM kZAAq2I0jypetqmyl/wKnJLW0j5dISqWI0Asfu70fv+lip7XV2UwpEazVrxG2VQXOC+i AUKnoOllttedi49QK0cxHwqcpRc8Dsc1drcWBDGB2e336rQ2fzk7CD8sPiYn/fb8p6jV clsA== X-Gm-Message-State: AOJu0YwiL9fpMLDWAgmGzCt9sbwJ9hGWFvibV2gXmU0UMjKDS34zL2nl XfPEJY52pL3BRER7ZXnG9KT7y4STLsJGroMH07mKWmTtlA37g3qI80a9 X-Gm-Gg: ATEYQzzqxdXABiWfORz0pCz7zBHBfNSS/hKa0T38aTGYntUdVj3U3+OHqQomznHBJ57 EqDocr+Gczm8jTtYTF5U2dmjrbgGCwNeElT53yu+iJpf8/yI2yK5eX/NmRKBPF0fp8ys0TMsPYy XEDFkGVcrnOwt0BDhxbHjZPzo9jv0nI1OlAPLvqJcd/i6e47CJJ3cCDqb0HkjtyBwcP7BmmbBPs avdnZiZofoCLByJQKTbRqb+aorcqZHL6a3/1h+X3HDnTYY9Cvdd2nDJ/97ioZ5pzyxnWz/5YMy3 jQO6sIRGCZVxhfEsAhTQOer69qftQit2CwgGbYnyNUILaOIxZnx+u3+uixBdRZr3QHNkAVPoDN7 Cw59aKHrAFaFHQqdQDHeFrpstkIlgKR67OJ6AsCSVau/YwndWEjl3+Ki/lwOWzJNE4pp9mJrQC/ mGd7Fk54D25PIiTo83j//1KMk3VsqdSbkiRsrOLcl2w8n6YqZV X-Received: by 2002:a05:6000:40c7:b0:439:bcc2:bf0a with SMTP id ffacd0b85a97d-43b6424f867mr1134796f8f.23.1773951959951; Thu, 19 Mar 2026 13:25:59 -0700 (PDT) Received: from LQ5W56KC4T ([2001:8a0:672f:7800:e0e1:55cd:f0b:b1e5]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-43b644ae16fsm1347544f8f.8.2026.03.19.13.25.58 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Thu, 19 Mar 2026 13:25:59 -0700 (PDT) From: Eric Curtin X-Google-Original-From: Eric Curtin To: linux-hyperv@vger.kernel.org Cc: linux-kernel@vger.kernel.org, iourit@linux.microsoft.com, wei.liu@kernel.org, decui@microsoft.com, haiyangz@microsoft.com Subject: [PATCH 41/55] drivers: hv: dxgkrnl: Handle process ID in D3DKMTQueryStatistics Date: Thu, 19 Mar 2026 20:24:55 +0000 Message-ID: <20260319202509.63802-42-eric.curtin@docker.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260319202509.63802-1-eric.curtin@docker.com> References: <20260319202509.63802-1-eric.curtin@docker.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Iouri Tarassov When D3DKMTQueryStatistics specifies a non-zero process ID, it needs to be translated to the host process handle before sending a message to the host. Signed-off-by: Iouri Tarassov [kms: forward port to 6.6 from 6.1. No code changes made.] Signed-off-by: Kelsey Steele --- drivers/hv/dxgkrnl/dxgkrnl.h | 3 +- drivers/hv/dxgkrnl/dxgprocess.c | 2 + drivers/hv/dxgkrnl/dxgvmbus.c | 140 ++++++++++++++++---------------- drivers/hv/dxgkrnl/ioctl.c | 39 ++++++++- 4 files changed, 111 insertions(+), 73 deletions(-) diff --git a/drivers/hv/dxgkrnl/dxgkrnl.h b/drivers/hv/dxgkrnl/dxgkrnl.h index e7d8919b3c01..6af1e59b0a31 100644 --- a/drivers/hv/dxgkrnl/dxgkrnl.h +++ b/drivers/hv/dxgkrnl/dxgkrnl.h @@ -386,6 +386,7 @@ struct dxgprocess { struct list_head plistentry; pid_t pid; pid_t tgid; + pid_t vpid; /* pdi from the current namespace */ /* how many time the process was opened */ struct kref process_kref; /* protects the object memory */ @@ -981,7 +982,7 @@ int dxgvmb_send_get_stdalloc_data(struct dxgdevice *dev= ice, void *prive_alloc_data, u32 *res_priv_data_size, void *priv_res_data); -int dxgvmb_send_query_statistics(struct dxgprocess *process, +int dxgvmb_send_query_statistics(struct d3dkmthandle host_process_handle, struct dxgadapter *adapter, struct d3dkmt_querystatistics *args); int dxgvmb_send_async_msg(struct dxgvmbuschannel *channel, diff --git a/drivers/hv/dxgkrnl/dxgprocess.c b/drivers/hv/dxgkrnl/dxgproces= s.c index fd51fd968049..5a4c4cb0c2e8 100644 --- a/drivers/hv/dxgkrnl/dxgprocess.c +++ b/drivers/hv/dxgkrnl/dxgprocess.c @@ -12,6 +12,7 @@ */ =20 #include "dxgkrnl.h" +#include "linux/sched.h" =20 #undef dev_fmt #define dev_fmt(fmt) "dxgk: " fmt @@ -31,6 +32,7 @@ struct dxgprocess *dxgprocess_create(void) DXG_TRACE("new dxgprocess created"); process->pid =3D current->pid; process->tgid =3D current->tgid; + process->vpid =3D task_pid_vnr(current); ret =3D dxgvmb_send_create_process(process); if (ret < 0) { DXG_TRACE("send_create_process failed"); diff --git a/drivers/hv/dxgkrnl/dxgvmbus.c b/drivers/hv/dxgkrnl/dxgvmbus.c index 487804ca731a..916ed9071656 100644 --- a/drivers/hv/dxgkrnl/dxgvmbus.c +++ b/drivers/hv/dxgkrnl/dxgvmbus.c @@ -22,6 +22,8 @@ #include "dxgkrnl.h" #include "dxgvmbus.h" =20 +#pragma GCC diagnostic ignored "-Warray-bounds" + #undef dev_fmt #define dev_fmt(fmt) "dxgk: " fmt =20 @@ -113,7 +115,6 @@ static int init_message(struct dxgvmbusmsg *msg, struct= dxgadapter *adapter, =20 static int init_message_res(struct dxgvmbusmsgres *msg, struct dxgadapter *adapter, - struct dxgprocess *process, u32 size, u32 result_size) { @@ -146,7 +147,7 @@ static int init_message_res(struct dxgvmbusmsgres *msg, return 0; } =20 -static void free_message(struct dxgvmbusmsg *msg, struct dxgprocess *proce= ss) +static void free_message(struct dxgvmbusmsg *msg) { if (msg->hdr && (char *)msg->hdr !=3D msg->msg_on_stack) vfree(msg->hdr); @@ -646,7 +647,7 @@ int dxgvmb_send_set_iospace_region(u64 start, u64 len) =20 dxgglobal_release_channel_lock(); cleanup: - free_message(&msg, NULL); + free_message(&msg); if (ret) DXG_TRACE("Error: %d", ret); return ret; @@ -699,7 +700,7 @@ int dxgvmb_send_create_process(struct dxgprocess *proce= ss) dxgglobal_release_channel_lock(); =20 cleanup: - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -727,7 +728,7 @@ int dxgvmb_send_destroy_process(struct d3dkmthandle pro= cess) dxgglobal_release_channel_lock(); =20 cleanup: - free_message(&msg, NULL); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -790,7 +791,7 @@ int dxgvmb_send_open_sync_object_nt(struct dxgprocess *= process, } =20 cleanup: - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -839,7 +840,7 @@ int dxgvmb_send_open_sync_object(struct dxgprocess *pro= cess, *syncobj =3D result.sync_object; =20 cleanup: - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -881,7 +882,7 @@ int dxgvmb_send_create_nt_shared_object(struct dxgproce= ss *process, } =20 cleanup: - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -912,7 +913,7 @@ int dxgvmb_send_destroy_nt_shared_object(struct d3dkmth= andle shared_handle) dxgglobal_release_channel_lock(); =20 cleanup: - free_message(&msg, NULL); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -945,7 +946,7 @@ int dxgvmb_send_destroy_sync_object(struct dxgprocess *= process, dxgglobal_release_channel_lock(); =20 cleanup: - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -989,7 +990,7 @@ int dxgvmb_send_share_object_with_host(struct dxgproces= s *process, args->object_vail_nt_handle =3D result.vail_nt_handle; =20 cleanup: - free_message(&msg, process); + free_message(&msg); if (ret) DXG_ERR("err: %d", ret); return ret; @@ -1026,7 +1027,7 @@ int dxgvmb_send_open_adapter(struct dxgadapter *adapt= er) adapter->host_handle =3D result.host_adapter_handle; =20 cleanup: - free_message(&msg, NULL); + free_message(&msg); if (ret) DXG_ERR("Failed to open adapter: %d", ret); return ret; @@ -1048,7 +1049,7 @@ int dxgvmb_send_close_adapter(struct dxgadapter *adap= ter) =20 ret =3D dxgvmb_send_sync_msg(msg.channel, msg.hdr, msg.size, NULL, 0); - free_message(&msg, NULL); + free_message(&msg); if (ret) DXG_ERR("Failed to close adapter: %d", ret); return ret; @@ -1084,7 +1085,7 @@ int dxgvmb_send_get_internal_adapter_info(struct dxga= dapter *adapter) sizeof(adapter->device_instance_id) / sizeof(u16)); dxgglobal->async_msg_enabled =3D result.async_msg_enabled !=3D 0; } - free_message(&msg, NULL); + free_message(&msg); if (ret) DXG_ERR("Failed to get adapter info: %d", ret); return ret; @@ -1114,7 +1115,7 @@ struct d3dkmthandle dxgvmb_send_create_device(struct = dxgadapter *adapter, &result, sizeof(result)); if (ret < 0) result.device.v =3D 0; - free_message(&msg, process); + free_message(&msg); cleanup: if (ret) DXG_TRACE("err: %d", ret); @@ -1140,7 +1141,7 @@ int dxgvmb_send_destroy_device(struct dxgadapter *ada= pter, =20 ret =3D dxgvmb_send_sync_msg_ntstatus(msg.channel, msg.hdr, msg.size); cleanup: - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -1167,7 +1168,7 @@ int dxgvmb_send_flush_device(struct dxgdevice *device, ret =3D dxgvmb_send_sync_msg_ntstatus(msg.channel, msg.hdr, msg.size); =20 cleanup: - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -1239,7 +1240,7 @@ dxgvmb_send_create_context(struct dxgadapter *adapter, } =20 cleanup: - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return context; @@ -1265,7 +1266,7 @@ int dxgvmb_send_destroy_context(struct dxgadapter *ad= apter, =20 ret =3D dxgvmb_send_sync_msg_ntstatus(msg.channel, msg.hdr, msg.size); cleanup: - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -1312,7 +1313,7 @@ int dxgvmb_send_create_paging_queue(struct dxgprocess= *process, pqueue->handle =3D args->paging_queue; =20 cleanup: - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -1339,7 +1340,7 @@ int dxgvmb_send_destroy_paging_queue(struct dxgproces= s *process, ret =3D dxgvmb_send_sync_msg(msg.channel, msg.hdr, msg.size, NULL, 0); =20 cleanup: - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -1550,7 +1551,7 @@ int create_existing_sysmem(struct dxgdevice *device, cleanup: if (kmem) vunmap(kmem); - free_message(&msg, device->process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -1783,7 +1784,7 @@ create_local_allocations(struct dxgprocess *process, dxgdevice_release_alloc_list_lock(device); } =20 - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -1908,7 +1909,7 @@ int dxgvmb_send_create_allocation(struct dxgprocess *= process, =20 if (result) vfree(result); - free_message(&msg, process); + free_message(&msg); =20 if (ret) DXG_TRACE("err: %d", ret); @@ -1950,7 +1951,7 @@ int dxgvmb_send_destroy_allocation(struct dxgprocess = *process, =20 cleanup: =20 - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -1992,7 +1993,7 @@ int dxgvmb_send_query_clock_calibration(struct dxgpro= cess *process, ret =3D ntstatus2int(result.status); =20 cleanup: - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -2015,7 +2016,7 @@ int dxgvmb_send_flush_heap_transitions(struct dxgproc= ess *process, process->host_handle); ret =3D dxgvmb_send_sync_msg_ntstatus(msg.channel, msg.hdr, msg.size); cleanup: - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -2042,7 +2043,7 @@ int dxgvmb_send_invalidate_cache(struct dxgprocess *p= rocess, command->length =3D args->length; ret =3D dxgvmb_send_sync_msg_ntstatus(msg.channel, msg.hdr, msg.size); cleanup: - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -2078,7 +2079,7 @@ int dxgvmb_send_query_alloc_residency(struct dxgproce= ss *process, } result_size +=3D result_allocation_size; =20 - ret =3D init_message_res(&msg, adapter, process, cmd_size, result_size); + ret =3D init_message_res(&msg, adapter, cmd_size, result_size); if (ret) goto cleanup; command =3D (void *)msg.msg; @@ -2115,7 +2116,7 @@ int dxgvmb_send_query_alloc_residency(struct dxgproce= ss *process, } =20 cleanup: - free_message((struct dxgvmbusmsg *)&msg, process); + free_message((struct dxgvmbusmsg *)&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -2179,7 +2180,7 @@ int dxgvmb_send_escape(struct dxgprocess *process, } =20 cleanup: - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -2243,7 +2244,7 @@ int dxgvmb_send_query_vidmem_info(struct dxgprocess *= process, } =20 cleanup: - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -2288,7 +2289,7 @@ int dxgvmb_send_get_device_state(struct dxgprocess *p= rocess, args->execution_state =3D result.args.execution_state; =20 cleanup: - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -2312,8 +2313,7 @@ int dxgvmb_send_open_resource(struct dxgprocess *proc= ess, sizeof(*result); struct dxgvmbusmsgres msg =3D {.hdr =3D NULL}; =20 - ret =3D init_message_res(&msg, adapter, process, sizeof(*command), - result_size); + ret =3D init_message_res(&msg, adapter, sizeof(*command), result_size); if (ret) goto cleanup; command =3D msg.msg; @@ -2342,7 +2342,7 @@ int dxgvmb_send_open_resource(struct dxgprocess *proc= ess, alloc_handles[i] =3D handles[i]; =20 cleanup: - free_message((struct dxgvmbusmsg *)&msg, process); + free_message((struct dxgvmbusmsg *)&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -2367,7 +2367,7 @@ int dxgvmb_send_get_stdalloc_data(struct dxgdevice *d= evice, result_size +=3D *alloc_priv_driver_size; if (priv_res_data) result_size +=3D *res_priv_data_size; - ret =3D init_message_res(&msg, device->adapter, device->process, + ret =3D init_message_res(&msg, device->adapter, sizeof(*command), result_size); if (ret) goto cleanup; @@ -2427,7 +2427,7 @@ int dxgvmb_send_get_stdalloc_data(struct dxgdevice *d= evice, =20 cleanup: =20 - free_message((struct dxgvmbusmsg *)&msg, device->process); + free_message((struct dxgvmbusmsg *)&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -2479,7 +2479,7 @@ int dxgvmb_send_make_resident(struct dxgprocess *proc= ess, =20 cleanup: =20 - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -2525,7 +2525,7 @@ int dxgvmb_send_evict(struct dxgprocess *process, =20 cleanup: =20 - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -2580,7 +2580,7 @@ int dxgvmb_send_submit_command(struct dxgprocess *pro= cess, =20 cleanup: =20 - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -2617,7 +2617,7 @@ int dxgvmb_send_map_gpu_va(struct dxgprocess *process, =20 cleanup: =20 - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -2647,7 +2647,7 @@ int dxgvmb_send_reserve_gpu_va(struct dxgprocess *pro= cess, args->virtual_address =3D result.virtual_address; =20 cleanup: - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -2674,7 +2674,7 @@ int dxgvmb_send_free_gpu_va(struct dxgprocess *proces= s, ret =3D dxgvmb_send_sync_msg_ntstatus(msg.channel, msg.hdr, msg.size); =20 cleanup: - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -2730,7 +2730,7 @@ int dxgvmb_send_update_gpu_va(struct dxgprocess *proc= ess, ret =3D dxgvmb_send_sync_msg_ntstatus(msg.channel, msg.hdr, msg.size); =20 cleanup: - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -2816,7 +2816,7 @@ dxgvmb_send_create_sync_object(struct dxgprocess *pro= cess, } =20 cleanup: - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -2910,7 +2910,7 @@ int dxgvmb_send_signal_sync_object(struct dxgprocess = *process, } =20 cleanup: - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -2970,7 +2970,7 @@ int dxgvmb_send_wait_sync_object_cpu(struct dxgproces= s *process, ret =3D dxgvmb_send_sync_msg_ntstatus(msg.channel, msg.hdr, msg.size); =20 cleanup: - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -3023,7 +3023,7 @@ int dxgvmb_send_wait_sync_object_gpu(struct dxgproces= s *process, } =20 cleanup: - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -3103,7 +3103,7 @@ int dxgvmb_send_lock2(struct dxgprocess *process, hmgrtable_unlock(&process->handle_table, DXGLOCK_EXCL); =20 cleanup: - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -3130,7 +3130,7 @@ int dxgvmb_send_unlock2(struct dxgprocess *process, ret =3D dxgvmb_send_sync_msg_ntstatus(msg.channel, msg.hdr, msg.size); =20 cleanup: - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -3175,7 +3175,7 @@ int dxgvmb_send_update_alloc_property(struct dxgproce= ss *process, } } cleanup: - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -3200,7 +3200,7 @@ int dxgvmb_send_mark_device_as_error(struct dxgproces= s *process, command->args =3D *args; ret =3D dxgvmb_send_sync_msg_ntstatus(msg.channel, msg.hdr, msg.size); cleanup: - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -3270,7 +3270,7 @@ int dxgvmb_send_set_allocation_priority(struct dxgpro= cess *process, ret =3D dxgvmb_send_sync_msg_ntstatus(msg.channel, msg.hdr, msg.size); =20 cleanup: - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -3312,7 +3312,7 @@ int dxgvmb_send_get_allocation_priority(struct dxgpro= cess *process, } result_size =3D sizeof(*result) + priority_size; =20 - ret =3D init_message_res(&msg, adapter, process, cmd_size, result_size); + ret =3D init_message_res(&msg, adapter, cmd_size, result_size); if (ret) goto cleanup; command =3D (void *)msg.msg; @@ -3352,7 +3352,7 @@ int dxgvmb_send_get_allocation_priority(struct dxgpro= cess *process, } =20 cleanup: - free_message((struct dxgvmbusmsg *)&msg, process); + free_message((struct dxgvmbusmsg *)&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -3381,7 +3381,7 @@ int dxgvmb_send_set_context_sch_priority(struct dxgpr= ocess *process, command->in_process =3D in_process; ret =3D dxgvmb_send_sync_msg_ntstatus(msg.channel, msg.hdr, msg.size); cleanup: - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -3415,7 +3415,7 @@ int dxgvmb_send_get_context_sch_priority(struct dxgpr= ocess *process, *priority =3D result.priority; } cleanup: - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -3461,7 +3461,7 @@ int dxgvmb_send_offer_allocations(struct dxgprocess *= process, ret =3D dxgvmb_send_sync_msg_ntstatus(msg.channel, msg.hdr, msg.size); =20 cleanup: - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -3486,7 +3486,7 @@ int dxgvmb_send_reclaim_allocations(struct dxgprocess= *process, result_size +=3D (args->allocation_count - 1) * sizeof(enum d3dddi_reclaim_result); =20 - ret =3D init_message_res(&msg, adapter, process, cmd_size, result_size); + ret =3D init_message_res(&msg, adapter, cmd_size, result_size); if (ret) goto cleanup; command =3D (void *)msg.msg; @@ -3537,7 +3537,7 @@ int dxgvmb_send_reclaim_allocations(struct dxgprocess= *process, } =20 cleanup: - free_message((struct dxgvmbusmsg *)&msg, process); + free_message((struct dxgvmbusmsg *)&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -3567,7 +3567,7 @@ int dxgvmb_send_change_vidmem_reservation(struct dxgp= rocess *process, =20 ret =3D dxgvmb_send_sync_msg_ntstatus(msg.channel, msg.hdr, msg.size); cleanup: - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -3706,7 +3706,7 @@ int dxgvmb_send_create_hwqueue(struct dxgprocess *pro= cess, dxgvmb_send_destroy_hwqueue(process, adapter, command->hwqueue); } - free_message(&msg, process); + free_message(&msg); return ret; } =20 @@ -3731,7 +3731,7 @@ int dxgvmb_send_destroy_hwqueue(struct dxgprocess *pr= ocess, ret =3D dxgvmb_send_sync_msg_ntstatus(msg.channel, msg.hdr, msg.size); =20 cleanup: - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -3815,7 +3815,7 @@ int dxgvmb_send_query_adapter_info(struct dxgprocess = *process, } =20 cleanup: - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; @@ -3873,13 +3873,13 @@ int dxgvmb_send_submit_command_hwqueue(struct dxgpr= ocess *process, } =20 cleanup: - free_message(&msg, process); + free_message(&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; } =20 -int dxgvmb_send_query_statistics(struct dxgprocess *process, +int dxgvmb_send_query_statistics(struct d3dkmthandle host_process_handle, struct dxgadapter *adapter, struct d3dkmt_querystatistics *args) { @@ -3888,7 +3888,7 @@ int dxgvmb_send_query_statistics(struct dxgprocess *p= rocess, int ret; struct dxgvmbusmsgres msg =3D {.hdr =3D NULL}; =20 - ret =3D init_message_res(&msg, adapter, process, sizeof(*command), + ret =3D init_message_res(&msg, adapter, sizeof(*command), sizeof(*result)); if (ret) goto cleanup; @@ -3897,7 +3897,7 @@ int dxgvmb_send_query_statistics(struct dxgprocess *p= rocess, =20 command_vgpu_to_host_init2(&command->hdr, DXGK_VMBCOMMAND_QUERYSTATISTICS, - process->host_handle); + host_process_handle); command->args =3D *args; =20 ret =3D dxgvmb_send_sync_msg(msg.channel, msg.hdr, msg.size, @@ -3909,7 +3909,7 @@ int dxgvmb_send_query_statistics(struct dxgprocess *p= rocess, ret =3D ntstatus2int(result->status); =20 cleanup: - free_message((struct dxgvmbusmsg *)&msg, process); + free_message((struct dxgvmbusmsg *)&msg); if (ret) DXG_TRACE("err: %d", ret); return ret; diff --git a/drivers/hv/dxgkrnl/ioctl.c b/drivers/hv/dxgkrnl/ioctl.c index 56b838a87f09..466bef6c14b3 100644 --- a/drivers/hv/dxgkrnl/ioctl.c +++ b/drivers/hv/dxgkrnl/ioctl.c @@ -147,6 +147,23 @@ static int dxgkio_open_adapter_from_luid(struct dxgpro= cess *process, return ret; } =20 +static struct d3dkmthandle find_dxgprocess_handle(u64 pid) +{ + struct dxgglobal *dxgglobal =3D dxggbl(); + struct dxgprocess *entry; + struct d3dkmthandle host_handle =3D {}; + + mutex_lock(&dxgglobal->plistmutex); + list_for_each_entry(entry, &dxgglobal->plisthead, plistentry) { + if (entry->vpid =3D=3D pid) { + host_handle.v =3D entry->host_handle.v; + break; + } + } + mutex_unlock(&dxgglobal->plistmutex); + return host_handle; +} + static int dxgkio_query_statistics(struct dxgprocess *process, void __user *inargs) { @@ -156,6 +173,8 @@ static int dxgkio_query_statistics(struct dxgprocess *p= rocess, struct dxgadapter *adapter =3D NULL; struct winluid tmp; struct dxgglobal *dxgglobal =3D dxggbl(); + struct d3dkmthandle host_process_handle =3D process->host_handle; + u64 pid; =20 args =3D vzalloc(sizeof(struct d3dkmt_querystatistics)); if (args =3D=3D NULL) { @@ -170,6 +189,18 @@ static int dxgkio_query_statistics(struct dxgprocess *= process, goto cleanup; } =20 + /* Find the host process handle when needed */ + pid =3D args->process; + if (pid) { + host_process_handle =3D find_dxgprocess_handle(pid); + if (host_process_handle.v =3D=3D 0) { + DXG_ERR("Invalid process ID is specified: %lld", pid); + ret =3D -EINVAL; + goto cleanup; + } + args->process =3D 0; + } + dxgglobal_acquire_adapter_list_lock(DXGLOCK_SHARED); list_for_each_entry(entry, &dxgglobal->adapter_list_head, adapter_list_entry) { @@ -186,7 +217,8 @@ static int dxgkio_query_statistics(struct dxgprocess *p= rocess, if (adapter) { tmp =3D args->adapter_luid; args->adapter_luid =3D adapter->host_adapter_luid; - ret =3D dxgvmb_send_query_statistics(process, adapter, args); + ret =3D dxgvmb_send_query_statistics(host_process_handle, adapter, + args); if (ret >=3D 0) { args->adapter_luid =3D tmp; ret =3D copy_to_user(inargs, args, sizeof(*args)); @@ -280,7 +312,10 @@ dxgkp_enum_adapters(struct dxgprocess *process, dxgglobal_release_adapter_list_lock(DXGLOCK_SHARED); =20 if (adapter_count > adapter_count_max) { - ret =3D STATUS_BUFFER_TOO_SMALL; + struct ntstatus status; + + status.v =3D STATUS_BUFFER_TOO_SMALL; + ret =3D ntstatus2int(status); DXG_TRACE("Too many adapters"); ret =3D copy_to_user(adapter_count_out, &dxgglobal->num_adapters, sizeof(u32));