Skip to content

Commit 2a8901a

Browse files
Iouri Tarassovchessturo
authored andcommitted
drivers: hv: dxgkrnl: Implement D3DKMTWaitSyncFile
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 0831e3f commit 2a8901a

8 files changed

Lines changed: 396 additions & 16 deletions

File tree

drivers/hv/dxgkrnl/dxgkrnl.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,10 @@ void dxgsharedsyncobj_add_syncobj(struct dxgsharedsyncobject *sharedsyncobj,
254254
struct dxgsyncobject *syncobj);
255255
void dxgsharedsyncobj_remove_syncobj(struct dxgsharedsyncobject *sharedsyncobj,
256256
struct dxgsyncobject *syncobj);
257+
int dxgsharedsyncobj_get_host_nt_handle(struct dxgsharedsyncobject *syncobj,
258+
struct dxgprocess *process,
259+
struct d3dkmthandle objecthandle);
260+
void dxgsharedsyncobj_put(struct dxgsharedsyncobject *syncobj);
257261

258262
struct dxgsyncobject *dxgsyncobject_create(struct dxgprocess *process,
259263
struct dxgdevice *device,
@@ -384,6 +388,8 @@ struct dxgprocess {
384388
pid_t tgid;
385389
/* how many time the process was opened */
386390
struct kref process_kref;
391+
/* protects the object memory */
392+
struct kref process_mem_kref;
387393
/*
388394
* This handle table is used for all objects except dxgadapter
389395
* The handle table lock order is higher than the local_handle_table
@@ -405,6 +411,7 @@ struct dxgprocess {
405411
struct dxgprocess *dxgprocess_create(void);
406412
void dxgprocess_destroy(struct dxgprocess *process);
407413
void dxgprocess_release(struct kref *refcount);
414+
void dxgprocess_mem_release(struct kref *refcount);
408415
int dxgprocess_open_adapter(struct dxgprocess *process,
409416
struct dxgadapter *adapter,
410417
struct d3dkmthandle *handle);
@@ -932,6 +939,10 @@ int dxgvmb_send_open_sync_object_nt(struct dxgprocess *process,
932939
struct d3dkmt_opensyncobjectfromnthandle2
933940
*args,
934941
struct dxgsyncobject *syncobj);
942+
int dxgvmb_send_open_sync_object(struct dxgprocess *process,
943+
struct d3dkmthandle device,
944+
struct d3dkmthandle host_shared_syncobj,
945+
struct d3dkmthandle *syncobj);
935946
int dxgvmb_send_query_alloc_residency(struct dxgprocess *process,
936947
struct dxgadapter *adapter,
937948
struct d3dkmt_queryallocationresidency

drivers/hv/dxgkrnl/dxgmodule.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,10 +149,11 @@ void dxgglobal_remove_host_event(struct dxghostevent *event)
149149
spin_unlock_irq(&dxgglobal->host_event_list_mutex);
150150
}
151151

152-
static void signal_dma_fence(struct dxghostevent *eventhdr)
152+
static void dxg_signal_dma_fence(struct dxghostevent *eventhdr)
153153
{
154154
struct dxgsyncpoint *event = (struct dxgsyncpoint *)eventhdr;
155155

156+
DXG_TRACE("syncpoint: %px, fence: %lld", event, event->fence_value);
156157
event->fence_value++;
157158
list_del(&eventhdr->host_event_list_entry);
158159
dma_fence_signal(&event->base);
@@ -198,7 +199,7 @@ void dxgglobal_signal_host_event(u64 event_id)
198199
if (event->event_type == dxghostevent_cpu_event)
199200
signal_host_cpu_event(event);
200201
else if (event->event_type == dxghostevent_dma_fence)
201-
signal_dma_fence(event);
202+
dxg_signal_dma_fence(event);
202203
else
203204
DXG_ERR("Unknown host event type");
204205
break;
@@ -355,6 +356,7 @@ static struct dxgprocess *dxgglobal_get_current_process(void)
355356
if (entry->tgid == current->tgid) {
356357
if (kref_get_unless_zero(&entry->process_kref)) {
357358
process = entry;
359+
kref_get(&entry->process_mem_kref);
358360
DXG_TRACE("found dxgprocess");
359361
} else {
360362
DXG_TRACE("process is destroyed");
@@ -405,6 +407,7 @@ static int dxgk_release(struct inode *n, struct file *f)
405407
return -EINVAL;
406408

407409
kref_put(&process->process_kref, dxgprocess_release);
410+
kref_put(&process->process_mem_kref, dxgprocess_mem_release);
408411

409412
f->private_data = NULL;
410413
return 0;

drivers/hv/dxgkrnl/dxgprocess.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ struct dxgprocess *dxgprocess_create(void)
3939
} else {
4040
INIT_LIST_HEAD(&process->plistentry);
4141
kref_init(&process->process_kref);
42+
kref_init(&process->process_mem_kref);
4243

4344
mutex_lock(&dxgglobal->plistmutex);
4445
list_add_tail(&process->plistentry,
@@ -117,8 +118,17 @@ void dxgprocess_release(struct kref *refcount)
117118

118119
dxgprocess_destroy(process);
119120

120-
if (process->host_handle.v)
121+
if (process->host_handle.v) {
121122
dxgvmb_send_destroy_process(process->host_handle);
123+
process->host_handle.v = 0;
124+
}
125+
}
126+
127+
void dxgprocess_mem_release(struct kref *refcount)
128+
{
129+
struct dxgprocess *process;
130+
131+
process = container_of(refcount, struct dxgprocess, process_mem_kref);
122132
kfree(process);
123133
}
124134

0 commit comments

Comments
 (0)