Skip to content

Commit 2a7e8eb

Browse files
Iouri Tarassovchessturo
authored andcommitted
drivers: hv: dxgkrnl: Query video memory information
Implement the ioctl to query video memory information from the host (LX_DXQUERYVIDEOMEMORYINFO). Signed-off-by: Iouri Tarassov <iourit@linux.microsoft.com> [kms: forward port to 6.6 from 6.1. No code changes made.] Signed-off-by: Kelsey Steele <kelseysteele@microsoft.com>
1 parent 65fdb5a commit 2a7e8eb

5 files changed

Lines changed: 145 additions & 1 deletion

File tree

drivers/hv/dxgkrnl/dxgkrnl.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -894,6 +894,11 @@ int dxgvmb_send_query_alloc_residency(struct dxgprocess *process,
894894
struct dxgadapter *adapter,
895895
struct d3dkmt_queryallocationresidency
896896
*args);
897+
int dxgvmb_send_query_vidmem_info(struct dxgprocess *process,
898+
struct dxgadapter *adapter,
899+
struct d3dkmt_queryvideomemoryinfo *args,
900+
struct d3dkmt_queryvideomemoryinfo
901+
*__user iargs);
897902
int dxgvmb_send_get_device_state(struct dxgprocess *process,
898903
struct dxgadapter *adapter,
899904
struct d3dkmt_getdevicestate *args,

drivers/hv/dxgkrnl/dxgvmbus.c

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1925,6 +1925,70 @@ int dxgvmb_send_query_alloc_residency(struct dxgprocess *process,
19251925
return ret;
19261926
}
19271927

1928+
int dxgvmb_send_query_vidmem_info(struct dxgprocess *process,
1929+
struct dxgadapter *adapter,
1930+
struct d3dkmt_queryvideomemoryinfo *args,
1931+
struct d3dkmt_queryvideomemoryinfo *__user
1932+
output)
1933+
{
1934+
int ret;
1935+
struct dxgkvmb_command_queryvideomemoryinfo *command;
1936+
struct dxgkvmb_command_queryvideomemoryinfo_return result = { };
1937+
struct dxgvmbusmsg msg = {.hdr = NULL};
1938+
1939+
ret = init_message(&msg, adapter, process, sizeof(*command));
1940+
if (ret)
1941+
goto cleanup;
1942+
command = (void *)msg.msg;
1943+
command_vgpu_to_host_init2(&command->hdr,
1944+
dxgk_vmbcommand_queryvideomemoryinfo,
1945+
process->host_handle);
1946+
command->adapter = args->adapter;
1947+
command->memory_segment_group = args->memory_segment_group;
1948+
command->physical_adapter_index = args->physical_adapter_index;
1949+
1950+
ret = dxgvmb_send_sync_msg(msg.channel, msg.hdr, msg.size,
1951+
&result, sizeof(result));
1952+
if (ret < 0)
1953+
goto cleanup;
1954+
1955+
ret = copy_to_user(&output->budget, &result.budget,
1956+
sizeof(output->budget));
1957+
if (ret) {
1958+
pr_err("%s failed to copy budget", __func__);
1959+
ret = -EINVAL;
1960+
goto cleanup;
1961+
}
1962+
ret = copy_to_user(&output->current_usage, &result.current_usage,
1963+
sizeof(output->current_usage));
1964+
if (ret) {
1965+
pr_err("%s failed to copy current usage", __func__);
1966+
ret = -EINVAL;
1967+
goto cleanup;
1968+
}
1969+
ret = copy_to_user(&output->current_reservation,
1970+
&result.current_reservation,
1971+
sizeof(output->current_reservation));
1972+
if (ret) {
1973+
pr_err("%s failed to copy reservation", __func__);
1974+
ret = -EINVAL;
1975+
goto cleanup;
1976+
}
1977+
ret = copy_to_user(&output->available_for_reservation,
1978+
&result.available_for_reservation,
1979+
sizeof(output->available_for_reservation));
1980+
if (ret) {
1981+
pr_err("%s failed to copy avail reservation", __func__);
1982+
ret = -EINVAL;
1983+
}
1984+
1985+
cleanup:
1986+
free_message(&msg, process);
1987+
if (ret)
1988+
dev_dbg(DXGDEV, "err: %d", ret);
1989+
return ret;
1990+
}
1991+
19281992
int dxgvmb_send_get_device_state(struct dxgprocess *process,
19291993
struct dxgadapter *adapter,
19301994
struct d3dkmt_getdevicestate *args,

drivers/hv/dxgkrnl/dxgvmbus.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -664,6 +664,20 @@ struct dxgkvmb_command_queryallocationresidency_return {
664664
/* d3dkmt_allocationresidencystatus[NumAllocations] */
665665
};
666666

667+
struct dxgkvmb_command_queryvideomemoryinfo {
668+
struct dxgkvmb_command_vgpu_to_host hdr;
669+
struct d3dkmthandle adapter;
670+
enum d3dkmt_memory_segment_group memory_segment_group;
671+
u32 physical_adapter_index;
672+
};
673+
674+
struct dxgkvmb_command_queryvideomemoryinfo_return {
675+
u64 budget;
676+
u64 current_usage;
677+
u64 current_reservation;
678+
u64 available_for_reservation;
679+
};
680+
667681
struct dxgkvmb_command_getdevicestate {
668682
struct dxgkvmb_command_vgpu_to_host hdr;
669683
struct d3dkmt_getdevicestate args;

drivers/hv/dxgkrnl/ioctl.c

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3547,6 +3547,54 @@ dxgkio_flush_heap_transitions(struct dxgprocess *process, void *__user inargs)
35473547
return ret;
35483548
}
35493549

3550+
static int
3551+
dxgkio_query_vidmem_info(struct dxgprocess *process, void *__user inargs)
3552+
{
3553+
struct d3dkmt_queryvideomemoryinfo args;
3554+
int ret;
3555+
struct dxgadapter *adapter = NULL;
3556+
bool adapter_locked = false;
3557+
3558+
ret = copy_from_user(&args, inargs, sizeof(args));
3559+
if (ret) {
3560+
DXG_ERR("failed to copy input args");
3561+
ret = -EINVAL;
3562+
goto cleanup;
3563+
}
3564+
3565+
if (args.process != 0) {
3566+
DXG_ERR("query vidmem info from another process");
3567+
ret = -EINVAL;
3568+
goto cleanup;
3569+
}
3570+
3571+
adapter = dxgprocess_adapter_by_handle(process, args.adapter);
3572+
if (adapter == NULL) {
3573+
ret = -EINVAL;
3574+
goto cleanup;
3575+
}
3576+
3577+
ret = dxgadapter_acquire_lock_shared(adapter);
3578+
if (ret < 0) {
3579+
adapter = NULL;
3580+
goto cleanup;
3581+
}
3582+
adapter_locked = true;
3583+
3584+
args.adapter = adapter->host_handle;
3585+
ret = dxgvmb_send_query_vidmem_info(process, adapter, &args, inargs);
3586+
3587+
cleanup:
3588+
3589+
if (adapter_locked)
3590+
dxgadapter_release_lock_shared(adapter);
3591+
if (adapter)
3592+
kref_put(&adapter->adapter_kref, dxgadapter_release);
3593+
if (ret < 0)
3594+
DXG_ERR("failed: %x", ret);
3595+
return ret;
3596+
}
3597+
35503598
static int
35513599
dxgkio_get_device_state(struct dxgprocess *process, void *__user inargs)
35523600
{
@@ -4287,7 +4335,7 @@ static struct ioctl_desc ioctls[] = {
42874335
/* 0x07 */ {dxgkio_create_paging_queue, LX_DXCREATEPAGINGQUEUE},
42884336
/* 0x08 */ {},
42894337
/* 0x09 */ {dxgkio_query_adapter_info, LX_DXQUERYADAPTERINFO},
4290-
/* 0x0a */ {},
4338+
/* 0x0a */ {dxgkio_query_vidmem_info, LX_DXQUERYVIDEOMEMORYINFO},
42914339
/* 0x0b */ {},
42924340
/* 0x0c */ {},
42934341
/* 0x0d */ {},

include/uapi/misc/d3dkmthk.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -897,6 +897,17 @@ enum d3dkmt_memory_segment_group {
897897
_D3DKMT_MEMORY_SEGMENT_GROUP_NON_LOCAL = 1
898898
};
899899

900+
struct d3dkmt_queryvideomemoryinfo {
901+
__u64 process;
902+
struct d3dkmthandle adapter;
903+
enum d3dkmt_memory_segment_group memory_segment_group;
904+
__u64 budget;
905+
__u64 current_usage;
906+
__u64 current_reservation;
907+
__u64 available_for_reservation;
908+
__u32 physical_adapter_index;
909+
};
910+
900911
struct d3dkmt_adaptertype {
901912
union {
902913
struct {
@@ -1204,6 +1215,8 @@ struct d3dkmt_shareobjectwithhost {
12041215
_IOWR(0x47, 0x07, struct d3dkmt_createpagingqueue)
12051216
#define LX_DXQUERYADAPTERINFO \
12061217
_IOWR(0x47, 0x09, struct d3dkmt_queryadapterinfo)
1218+
#define LX_DXQUERYVIDEOMEMORYINFO \
1219+
_IOWR(0x47, 0x0a, struct d3dkmt_queryvideomemoryinfo)
12071220
#define LX_DXGETDEVICESTATE \
12081221
_IOWR(0x47, 0x0e, struct d3dkmt_getdevicestate)
12091222
#define LX_DXSUBMITCOMMAND \

0 commit comments

Comments
 (0)