diff options
author | Ilija Hadzic <ihadzic@research.bell-labs.com> | 2012-05-15 16:40:10 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2012-07-25 00:09:30 -0400 |
commit | 949c4a34afacfe800fc442afac117aba15284962 (patch) | |
tree | ee7c6ebc5d8b05fbca1113b8c9147fbee7e26321 /drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | |
parent | b97ce28e9f6d65a800e5c2ee3a2a99c7795bef65 (diff) |
drm: track dev_mapping in more robust and flexible way
Setting dev_mapping (pointer to the address_space structure
used for memory mappings) to the address_space of the first
opener's inode and then failing if other openers come in
through a different inode has a few restrictions that are
eliminated by this patch.
If we already have valid dev_mapping and we spot an opener
with different i_node, we force its i_mapping pointer to the
already established address_space structure (first opener's
inode). This will make all mappings from drm device hang off
the same address_space object.
Some benefits (things that now work and didn't work
before) of this patch are:
* user space can mknod and use any number of device
nodes and they will all work fine as long as the major
device number is that of the drm module.
* user space can even remove the first opener's device
nodes and mknod the new one and the applications and
windowing system will still work.
* GPU drivers can safely assume that dev->dev_mapping is
correct address_space and just blindly copy it
into their (private) bdev.dev_mapping
For reference, some discussion that lead to this patch can
be found here:
http://lists.freedesktop.org/archives/dri-devel/2012-April/022283.html
Signed-off-by: Ilija Hadzic <ihadzic@research.bell-labs.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/vmwgfx/vmwgfx_drv.c')
-rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | 5 |
1 files changed, 1 insertions, 4 deletions
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c index 5d5632f5265b..4d9edead01ac 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | |||
@@ -769,10 +769,7 @@ static int vmw_driver_open(struct drm_device *dev, struct drm_file *file_priv) | |||
769 | goto out_no_tfile; | 769 | goto out_no_tfile; |
770 | 770 | ||
771 | file_priv->driver_priv = vmw_fp; | 771 | file_priv->driver_priv = vmw_fp; |
772 | 772 | dev_priv->bdev.dev_mapping = dev->dev_mapping; | |
773 | if (unlikely(dev_priv->bdev.dev_mapping == NULL)) | ||
774 | dev_priv->bdev.dev_mapping = | ||
775 | file_priv->filp->f_path.dentry->d_inode->i_mapping; | ||
776 | 773 | ||
777 | return 0; | 774 | return 0; |
778 | 775 | ||