Skip to content

Commit db6a94b

Browse files
en4bzzackr
authored andcommitted
drm/vmwgfx: Implement dma_fence_ops properly
vmwgfx's fencing predates dma_fence and as a result dma_fence_ops was never properly implemented, especially with respect to enabling signaling. Because of this dma_fence callbacks don't work properly. This change implements enable_signaling properly so that dma_fence callbacks now work as expected. It also removes vmwgfx's custom implementation of fence callbacks and removes vmwgfx's custom dma_fence_ops::wait function which is no longer necessary now that enable_signaling works. Signed-off-by: Ian Forbes <[email protected]> Signed-off-by: Zack Rusin <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent c82f55f commit db6a94b

File tree

5 files changed

+97
-500
lines changed

5 files changed

+97
-500
lines changed

drivers/gpu/drm/vmwgfx/vmwgfx_drv.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1006,14 +1006,14 @@ extern int vmw_fallback_wait(struct vmw_private *dev_priv,
10061006
uint32_t seqno,
10071007
bool interruptible,
10081008
unsigned long timeout);
1009-
extern void vmw_seqno_waiter_add(struct vmw_private *dev_priv);
1010-
extern void vmw_seqno_waiter_remove(struct vmw_private *dev_priv);
1011-
extern void vmw_goal_waiter_add(struct vmw_private *dev_priv);
1012-
extern void vmw_goal_waiter_remove(struct vmw_private *dev_priv);
1013-
extern void vmw_generic_waiter_add(struct vmw_private *dev_priv, u32 flag,
1014-
int *waiter_count);
1015-
extern void vmw_generic_waiter_remove(struct vmw_private *dev_priv,
1016-
u32 flag, int *waiter_count);
1009+
bool vmw_seqno_waiter_add(struct vmw_private *dev_priv);
1010+
bool vmw_seqno_waiter_remove(struct vmw_private *dev_priv);
1011+
bool vmw_goal_waiter_add(struct vmw_private *dev_priv);
1012+
bool vmw_goal_waiter_remove(struct vmw_private *dev_priv);
1013+
bool vmw_generic_waiter_add(struct vmw_private *dev_priv, u32 flag,
1014+
int *waiter_count);
1015+
bool vmw_generic_waiter_remove(struct vmw_private *dev_priv,
1016+
u32 flag, int *waiter_count);
10171017

10181018
/**
10191019
* Kernel modesetting - vmwgfx_kms.c

drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4067,23 +4067,6 @@ static int vmw_execbuf_tie_context(struct vmw_private *dev_priv,
40674067
return 0;
40684068
}
40694069

4070-
/*
4071-
* DMA fence callback to remove a seqno_waiter
4072-
*/
4073-
struct seqno_waiter_rm_context {
4074-
struct dma_fence_cb base;
4075-
struct vmw_private *dev_priv;
4076-
};
4077-
4078-
static void seqno_waiter_rm_cb(struct dma_fence *f, struct dma_fence_cb *cb)
4079-
{
4080-
struct seqno_waiter_rm_context *ctx =
4081-
container_of(cb, struct seqno_waiter_rm_context, base);
4082-
4083-
vmw_seqno_waiter_remove(ctx->dev_priv);
4084-
kfree(ctx);
4085-
}
4086-
40874070
int vmw_execbuf_process(struct drm_file *file_priv,
40884071
struct vmw_private *dev_priv,
40894072
void __user *user_commands, void *kernel_commands,
@@ -4264,15 +4247,6 @@ int vmw_execbuf_process(struct drm_file *file_priv,
42644247
} else {
42654248
/* Link the fence with the FD created earlier */
42664249
fd_install(out_fence_fd, sync_file->file);
4267-
struct seqno_waiter_rm_context *ctx =
4268-
kmalloc(sizeof(*ctx), GFP_KERNEL);
4269-
ctx->dev_priv = dev_priv;
4270-
vmw_seqno_waiter_add(dev_priv);
4271-
if (dma_fence_add_callback(&fence->base, &ctx->base,
4272-
seqno_waiter_rm_cb) < 0) {
4273-
vmw_seqno_waiter_remove(dev_priv);
4274-
kfree(ctx);
4275-
}
42764250
}
42774251
}
42784252

0 commit comments

Comments
 (0)