mirror of https://gitee.com/openkylin/linux.git
vmwgfx: Wrap drm_read and drm_poll
Make sure the device is processing the fifo when these functions are called in case they might sleep waiting for an event. Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
57c5ee79ac
commit
5438ae88d0
|
@ -1085,7 +1085,8 @@ static struct drm_driver driver = {
|
|||
.release = drm_release,
|
||||
.unlocked_ioctl = vmw_unlocked_ioctl,
|
||||
.mmap = vmw_mmap,
|
||||
.poll = drm_poll,
|
||||
.poll = vmw_fops_poll,
|
||||
.read = vmw_fops_read,
|
||||
.fasync = drm_fasync,
|
||||
#if defined(CONFIG_COMPAT)
|
||||
.compat_ioctl = drm_compat_ioctl,
|
||||
|
|
|
@ -469,6 +469,10 @@ extern int vmw_present_ioctl(struct drm_device *dev, void *data,
|
|||
struct drm_file *file_priv);
|
||||
extern int vmw_present_readback_ioctl(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv);
|
||||
extern unsigned int vmw_fops_poll(struct file *filp,
|
||||
struct poll_table_struct *wait);
|
||||
extern ssize_t vmw_fops_read(struct file *filp, char __user *buffer,
|
||||
size_t count, loff_t *offset);
|
||||
|
||||
/**
|
||||
* Fifo utilities - vmwgfx_fifo.c
|
||||
|
|
|
@ -282,3 +282,46 @@ int vmw_present_readback_ioctl(struct drm_device *dev, void *data,
|
|||
out_clips:
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* vmw_fops_poll - wrapper around the drm_poll function
|
||||
*
|
||||
* @filp: See the linux fops poll documentation.
|
||||
* @wait: See the linux fops poll documentation.
|
||||
*
|
||||
* Wrapper around the drm_poll function that makes sure the device is
|
||||
* processing the fifo if drm_poll decides to wait.
|
||||
*/
|
||||
unsigned int vmw_fops_poll(struct file *filp, struct poll_table_struct *wait)
|
||||
{
|
||||
struct drm_file *file_priv = filp->private_data;
|
||||
struct vmw_private *dev_priv =
|
||||
vmw_priv(file_priv->minor->dev);
|
||||
|
||||
vmw_fifo_ping_host(dev_priv, SVGA_SYNC_GENERIC);
|
||||
return drm_poll(filp, wait);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* vmw_fops_read - wrapper around the drm_read function
|
||||
*
|
||||
* @filp: See the linux fops read documentation.
|
||||
* @buffer: See the linux fops read documentation.
|
||||
* @count: See the linux fops read documentation.
|
||||
* offset: See the linux fops read documentation.
|
||||
*
|
||||
* Wrapper around the drm_read function that makes sure the device is
|
||||
* processing the fifo if drm_read decides to wait.
|
||||
*/
|
||||
ssize_t vmw_fops_read(struct file *filp, char __user *buffer,
|
||||
size_t count, loff_t *offset)
|
||||
{
|
||||
struct drm_file *file_priv = filp->private_data;
|
||||
struct vmw_private *dev_priv =
|
||||
vmw_priv(file_priv->minor->dev);
|
||||
|
||||
vmw_fifo_ping_host(dev_priv, SVGA_SYNC_GENERIC);
|
||||
return drm_read(filp, buffer, count, offset);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue