提交 d9a1f0b4 编写于 作者: D David Herrmann 提交者: Daniel Vetter

drm: use drm_file to tag vm-bos

Rather than using "struct file*", use "struct drm_file*" as tag VM tag for
BOs. This will pave the way for "struct drm_file*" without any "struct
file*" back-pointer.
Signed-off-by: NDavid Herrmann <dh.herrmann@gmail.com>
Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
Link: http://patchwork.freedesktop.org/patch/msgid/20160901124837.680-3-dh.herrmann@gmail.com
上级 75ae95a7
...@@ -226,7 +226,8 @@ static int amdgpu_verify_access(struct ttm_buffer_object *bo, struct file *filp) ...@@ -226,7 +226,8 @@ static int amdgpu_verify_access(struct ttm_buffer_object *bo, struct file *filp)
if (amdgpu_ttm_tt_get_usermm(bo->ttm)) if (amdgpu_ttm_tt_get_usermm(bo->ttm))
return -EPERM; return -EPERM;
return drm_vma_node_verify_access(&rbo->gem_base.vma_node, filp); return drm_vma_node_verify_access(&rbo->gem_base.vma_node,
filp->private_data);
} }
static void amdgpu_move_null(struct ttm_buffer_object *bo, static void amdgpu_move_null(struct ttm_buffer_object *bo,
......
...@@ -150,7 +150,8 @@ static int ast_bo_verify_access(struct ttm_buffer_object *bo, struct file *filp) ...@@ -150,7 +150,8 @@ static int ast_bo_verify_access(struct ttm_buffer_object *bo, struct file *filp)
{ {
struct ast_bo *astbo = ast_bo(bo); struct ast_bo *astbo = ast_bo(bo);
return drm_vma_node_verify_access(&astbo->gem.vma_node, filp); return drm_vma_node_verify_access(&astbo->gem.vma_node,
filp->private_data);
} }
static int ast_ttm_io_mem_reserve(struct ttm_bo_device *bdev, static int ast_ttm_io_mem_reserve(struct ttm_bo_device *bdev,
......
...@@ -128,7 +128,8 @@ static int bochs_bo_verify_access(struct ttm_buffer_object *bo, ...@@ -128,7 +128,8 @@ static int bochs_bo_verify_access(struct ttm_buffer_object *bo,
{ {
struct bochs_bo *bochsbo = bochs_bo(bo); struct bochs_bo *bochsbo = bochs_bo(bo);
return drm_vma_node_verify_access(&bochsbo->gem.vma_node, filp); return drm_vma_node_verify_access(&bochsbo->gem.vma_node,
filp->private_data);
} }
static int bochs_ttm_io_mem_reserve(struct ttm_bo_device *bdev, static int bochs_ttm_io_mem_reserve(struct ttm_bo_device *bdev,
......
...@@ -150,7 +150,8 @@ static int cirrus_bo_verify_access(struct ttm_buffer_object *bo, struct file *fi ...@@ -150,7 +150,8 @@ static int cirrus_bo_verify_access(struct ttm_buffer_object *bo, struct file *fi
{ {
struct cirrus_bo *cirrusbo = cirrus_bo(bo); struct cirrus_bo *cirrusbo = cirrus_bo(bo);
return drm_vma_node_verify_access(&cirrusbo->gem.vma_node, filp); return drm_vma_node_verify_access(&cirrusbo->gem.vma_node,
filp->private_data);
} }
static int cirrus_ttm_io_mem_reserve(struct ttm_bo_device *bdev, static int cirrus_ttm_io_mem_reserve(struct ttm_bo_device *bdev,
......
...@@ -257,7 +257,7 @@ drm_gem_object_release_handle(int id, void *ptr, void *data) ...@@ -257,7 +257,7 @@ drm_gem_object_release_handle(int id, void *ptr, void *data)
if (drm_core_check_feature(dev, DRIVER_PRIME)) if (drm_core_check_feature(dev, DRIVER_PRIME))
drm_gem_remove_prime_handles(obj, file_priv); drm_gem_remove_prime_handles(obj, file_priv);
drm_vma_node_revoke(&obj->vma_node, file_priv->filp); drm_vma_node_revoke(&obj->vma_node, file_priv);
if (dev->driver->gem_close_object) if (dev->driver->gem_close_object)
dev->driver->gem_close_object(obj, file_priv); dev->driver->gem_close_object(obj, file_priv);
...@@ -372,7 +372,7 @@ drm_gem_handle_create_tail(struct drm_file *file_priv, ...@@ -372,7 +372,7 @@ drm_gem_handle_create_tail(struct drm_file *file_priv,
handle = ret; handle = ret;
ret = drm_vma_node_allow(&obj->vma_node, file_priv->filp); ret = drm_vma_node_allow(&obj->vma_node, file_priv);
if (ret) if (ret)
goto err_remove; goto err_remove;
...@@ -386,7 +386,7 @@ drm_gem_handle_create_tail(struct drm_file *file_priv, ...@@ -386,7 +386,7 @@ drm_gem_handle_create_tail(struct drm_file *file_priv,
return 0; return 0;
err_revoke: err_revoke:
drm_vma_node_revoke(&obj->vma_node, file_priv->filp); drm_vma_node_revoke(&obj->vma_node, file_priv);
err_remove: err_remove:
spin_lock(&file_priv->table_lock); spin_lock(&file_priv->table_lock);
idr_remove(&file_priv->object_idr, handle); idr_remove(&file_priv->object_idr, handle);
...@@ -991,7 +991,7 @@ int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma) ...@@ -991,7 +991,7 @@ int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma)
if (!obj) if (!obj)
return -EINVAL; return -EINVAL;
if (!drm_vma_node_is_allowed(node, filp)) { if (!drm_vma_node_is_allowed(node, priv)) {
drm_gem_object_unreference_unlocked(obj); drm_gem_object_unreference_unlocked(obj);
return -EACCES; return -EACCES;
} }
......
...@@ -25,7 +25,6 @@ ...@@ -25,7 +25,6 @@
#include <drm/drmP.h> #include <drm/drmP.h>
#include <drm/drm_mm.h> #include <drm/drm_mm.h>
#include <drm/drm_vma_manager.h> #include <drm/drm_vma_manager.h>
#include <linux/fs.h>
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/rbtree.h> #include <linux/rbtree.h>
...@@ -252,9 +251,9 @@ EXPORT_SYMBOL(drm_vma_offset_remove); ...@@ -252,9 +251,9 @@ EXPORT_SYMBOL(drm_vma_offset_remove);
/** /**
* drm_vma_node_allow - Add open-file to list of allowed users * drm_vma_node_allow - Add open-file to list of allowed users
* @node: Node to modify * @node: Node to modify
* @filp: Open file to add * @tag: Tag of file to remove
* *
* Add @filp to the list of allowed open-files for this node. If @filp is * Add @tag to the list of allowed open-files for this node. If @tag is
* already on this list, the ref-count is incremented. * already on this list, the ref-count is incremented.
* *
* The list of allowed-users is preserved across drm_vma_offset_add() and * The list of allowed-users is preserved across drm_vma_offset_add() and
...@@ -269,7 +268,7 @@ EXPORT_SYMBOL(drm_vma_offset_remove); ...@@ -269,7 +268,7 @@ EXPORT_SYMBOL(drm_vma_offset_remove);
* RETURNS: * RETURNS:
* 0 on success, negative error code on internal failure (out-of-mem) * 0 on success, negative error code on internal failure (out-of-mem)
*/ */
int drm_vma_node_allow(struct drm_vma_offset_node *node, struct file *filp) int drm_vma_node_allow(struct drm_vma_offset_node *node, struct drm_file *tag)
{ {
struct rb_node **iter; struct rb_node **iter;
struct rb_node *parent = NULL; struct rb_node *parent = NULL;
...@@ -290,10 +289,10 @@ int drm_vma_node_allow(struct drm_vma_offset_node *node, struct file *filp) ...@@ -290,10 +289,10 @@ int drm_vma_node_allow(struct drm_vma_offset_node *node, struct file *filp)
parent = *iter; parent = *iter;
entry = rb_entry(*iter, struct drm_vma_offset_file, vm_rb); entry = rb_entry(*iter, struct drm_vma_offset_file, vm_rb);
if (filp == entry->vm_filp) { if (tag == entry->vm_tag) {
entry->vm_count++; entry->vm_count++;
goto unlock; goto unlock;
} else if (filp > entry->vm_filp) { } else if (tag > entry->vm_tag) {
iter = &(*iter)->rb_right; iter = &(*iter)->rb_right;
} else { } else {
iter = &(*iter)->rb_left; iter = &(*iter)->rb_left;
...@@ -305,7 +304,7 @@ int drm_vma_node_allow(struct drm_vma_offset_node *node, struct file *filp) ...@@ -305,7 +304,7 @@ int drm_vma_node_allow(struct drm_vma_offset_node *node, struct file *filp)
goto unlock; goto unlock;
} }
new->vm_filp = filp; new->vm_tag = tag;
new->vm_count = 1; new->vm_count = 1;
rb_link_node(&new->vm_rb, parent, iter); rb_link_node(&new->vm_rb, parent, iter);
rb_insert_color(&new->vm_rb, &node->vm_files); rb_insert_color(&new->vm_rb, &node->vm_files);
...@@ -321,17 +320,18 @@ EXPORT_SYMBOL(drm_vma_node_allow); ...@@ -321,17 +320,18 @@ EXPORT_SYMBOL(drm_vma_node_allow);
/** /**
* drm_vma_node_revoke - Remove open-file from list of allowed users * drm_vma_node_revoke - Remove open-file from list of allowed users
* @node: Node to modify * @node: Node to modify
* @filp: Open file to remove * @tag: Tag of file to remove
* *
* Decrement the ref-count of @filp in the list of allowed open-files on @node. * Decrement the ref-count of @tag in the list of allowed open-files on @node.
* If the ref-count drops to zero, remove @filp from the list. You must call * If the ref-count drops to zero, remove @tag from the list. You must call
* this once for every drm_vma_node_allow() on @filp. * this once for every drm_vma_node_allow() on @tag.
* *
* This is locked against concurrent access internally. * This is locked against concurrent access internally.
* *
* If @filp is not on the list, nothing is done. * If @tag is not on the list, nothing is done.
*/ */
void drm_vma_node_revoke(struct drm_vma_offset_node *node, struct file *filp) void drm_vma_node_revoke(struct drm_vma_offset_node *node,
struct drm_file *tag)
{ {
struct drm_vma_offset_file *entry; struct drm_vma_offset_file *entry;
struct rb_node *iter; struct rb_node *iter;
...@@ -341,13 +341,13 @@ void drm_vma_node_revoke(struct drm_vma_offset_node *node, struct file *filp) ...@@ -341,13 +341,13 @@ void drm_vma_node_revoke(struct drm_vma_offset_node *node, struct file *filp)
iter = node->vm_files.rb_node; iter = node->vm_files.rb_node;
while (likely(iter)) { while (likely(iter)) {
entry = rb_entry(iter, struct drm_vma_offset_file, vm_rb); entry = rb_entry(iter, struct drm_vma_offset_file, vm_rb);
if (filp == entry->vm_filp) { if (tag == entry->vm_tag) {
if (!--entry->vm_count) { if (!--entry->vm_count) {
rb_erase(&entry->vm_rb, &node->vm_files); rb_erase(&entry->vm_rb, &node->vm_files);
kfree(entry); kfree(entry);
} }
break; break;
} else if (filp > entry->vm_filp) { } else if (tag > entry->vm_tag) {
iter = iter->rb_right; iter = iter->rb_right;
} else { } else {
iter = iter->rb_left; iter = iter->rb_left;
...@@ -361,9 +361,9 @@ EXPORT_SYMBOL(drm_vma_node_revoke); ...@@ -361,9 +361,9 @@ EXPORT_SYMBOL(drm_vma_node_revoke);
/** /**
* drm_vma_node_is_allowed - Check whether an open-file is granted access * drm_vma_node_is_allowed - Check whether an open-file is granted access
* @node: Node to check * @node: Node to check
* @filp: Open-file to check for * @tag: Tag of file to remove
* *
* Search the list in @node whether @filp is currently on the list of allowed * Search the list in @node whether @tag is currently on the list of allowed
* open-files (see drm_vma_node_allow()). * open-files (see drm_vma_node_allow()).
* *
* This is locked against concurrent access internally. * This is locked against concurrent access internally.
...@@ -372,7 +372,7 @@ EXPORT_SYMBOL(drm_vma_node_revoke); ...@@ -372,7 +372,7 @@ EXPORT_SYMBOL(drm_vma_node_revoke);
* true iff @filp is on the list * true iff @filp is on the list
*/ */
bool drm_vma_node_is_allowed(struct drm_vma_offset_node *node, bool drm_vma_node_is_allowed(struct drm_vma_offset_node *node,
struct file *filp) struct drm_file *tag)
{ {
struct drm_vma_offset_file *entry; struct drm_vma_offset_file *entry;
struct rb_node *iter; struct rb_node *iter;
...@@ -382,9 +382,9 @@ bool drm_vma_node_is_allowed(struct drm_vma_offset_node *node, ...@@ -382,9 +382,9 @@ bool drm_vma_node_is_allowed(struct drm_vma_offset_node *node,
iter = node->vm_files.rb_node; iter = node->vm_files.rb_node;
while (likely(iter)) { while (likely(iter)) {
entry = rb_entry(iter, struct drm_vma_offset_file, vm_rb); entry = rb_entry(iter, struct drm_vma_offset_file, vm_rb);
if (filp == entry->vm_filp) if (tag == entry->vm_tag)
break; break;
else if (filp > entry->vm_filp) else if (tag > entry->vm_tag)
iter = iter->rb_right; iter = iter->rb_right;
else else
iter = iter->rb_left; iter = iter->rb_left;
......
...@@ -150,7 +150,8 @@ static int mgag200_bo_verify_access(struct ttm_buffer_object *bo, struct file *f ...@@ -150,7 +150,8 @@ static int mgag200_bo_verify_access(struct ttm_buffer_object *bo, struct file *f
{ {
struct mgag200_bo *mgabo = mgag200_bo(bo); struct mgag200_bo *mgabo = mgag200_bo(bo);
return drm_vma_node_verify_access(&mgabo->gem.vma_node, filp); return drm_vma_node_verify_access(&mgabo->gem.vma_node,
filp->private_data);
} }
static int mgag200_ttm_io_mem_reserve(struct ttm_bo_device *bdev, static int mgag200_ttm_io_mem_reserve(struct ttm_bo_device *bdev,
......
...@@ -1315,7 +1315,8 @@ nouveau_bo_verify_access(struct ttm_buffer_object *bo, struct file *filp) ...@@ -1315,7 +1315,8 @@ nouveau_bo_verify_access(struct ttm_buffer_object *bo, struct file *filp)
{ {
struct nouveau_bo *nvbo = nouveau_bo(bo); struct nouveau_bo *nvbo = nouveau_bo(bo);
return drm_vma_node_verify_access(&nvbo->gem.vma_node, filp); return drm_vma_node_verify_access(&nvbo->gem.vma_node,
filp->private_data);
} }
static int static int
......
...@@ -210,7 +210,8 @@ static int qxl_verify_access(struct ttm_buffer_object *bo, struct file *filp) ...@@ -210,7 +210,8 @@ static int qxl_verify_access(struct ttm_buffer_object *bo, struct file *filp)
{ {
struct qxl_bo *qbo = to_qxl_bo(bo); struct qxl_bo *qbo = to_qxl_bo(bo);
return drm_vma_node_verify_access(&qbo->gem_base.vma_node, filp); return drm_vma_node_verify_access(&qbo->gem_base.vma_node,
filp->private_data);
} }
static int qxl_ttm_io_mem_reserve(struct ttm_bo_device *bdev, static int qxl_ttm_io_mem_reserve(struct ttm_bo_device *bdev,
......
...@@ -237,7 +237,8 @@ static int radeon_verify_access(struct ttm_buffer_object *bo, struct file *filp) ...@@ -237,7 +237,8 @@ static int radeon_verify_access(struct ttm_buffer_object *bo, struct file *filp)
if (radeon_ttm_tt_has_userptr(bo->ttm)) if (radeon_ttm_tt_has_userptr(bo->ttm))
return -EPERM; return -EPERM;
return drm_vma_node_verify_access(&rbo->gem_base.vma_node, filp); return drm_vma_node_verify_access(&rbo->gem_base.vma_node,
filp->private_data);
} }
static void radeon_move_null(struct ttm_buffer_object *bo, static void radeon_move_null(struct ttm_buffer_object *bo,
......
...@@ -24,16 +24,17 @@ ...@@ -24,16 +24,17 @@
*/ */
#include <drm/drm_mm.h> #include <drm/drm_mm.h>
#include <linux/fs.h>
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/rbtree.h> #include <linux/rbtree.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/types.h> #include <linux/types.h>
struct drm_file;
struct drm_vma_offset_file { struct drm_vma_offset_file {
struct rb_node vm_rb; struct rb_node vm_rb;
struct file *vm_filp; struct drm_file *vm_tag;
unsigned long vm_count; unsigned long vm_count;
}; };
...@@ -60,10 +61,11 @@ int drm_vma_offset_add(struct drm_vma_offset_manager *mgr, ...@@ -60,10 +61,11 @@ int drm_vma_offset_add(struct drm_vma_offset_manager *mgr,
void drm_vma_offset_remove(struct drm_vma_offset_manager *mgr, void drm_vma_offset_remove(struct drm_vma_offset_manager *mgr,
struct drm_vma_offset_node *node); struct drm_vma_offset_node *node);
int drm_vma_node_allow(struct drm_vma_offset_node *node, struct file *filp); int drm_vma_node_allow(struct drm_vma_offset_node *node, struct drm_file *tag);
void drm_vma_node_revoke(struct drm_vma_offset_node *node, struct file *filp); void drm_vma_node_revoke(struct drm_vma_offset_node *node,
struct drm_file *tag);
bool drm_vma_node_is_allowed(struct drm_vma_offset_node *node, bool drm_vma_node_is_allowed(struct drm_vma_offset_node *node,
struct file *filp); struct drm_file *tag);
/** /**
* drm_vma_offset_exact_lookup_locked() - Look up node by exact address * drm_vma_offset_exact_lookup_locked() - Look up node by exact address
...@@ -214,9 +216,9 @@ static inline void drm_vma_node_unmap(struct drm_vma_offset_node *node, ...@@ -214,9 +216,9 @@ static inline void drm_vma_node_unmap(struct drm_vma_offset_node *node,
/** /**
* drm_vma_node_verify_access() - Access verification helper for TTM * drm_vma_node_verify_access() - Access verification helper for TTM
* @node: Offset node * @node: Offset node
* @filp: Open-file * @tag: Tag of file to check
* *
* This checks whether @filp is granted access to @node. It is the same as * This checks whether @tag is granted access to @node. It is the same as
* drm_vma_node_is_allowed() but suitable as drop-in helper for TTM * drm_vma_node_is_allowed() but suitable as drop-in helper for TTM
* verify_access() callbacks. * verify_access() callbacks.
* *
...@@ -224,9 +226,9 @@ static inline void drm_vma_node_unmap(struct drm_vma_offset_node *node, ...@@ -224,9 +226,9 @@ static inline void drm_vma_node_unmap(struct drm_vma_offset_node *node,
* 0 if access is granted, -EACCES otherwise. * 0 if access is granted, -EACCES otherwise.
*/ */
static inline int drm_vma_node_verify_access(struct drm_vma_offset_node *node, static inline int drm_vma_node_verify_access(struct drm_vma_offset_node *node,
struct file *filp) struct drm_file *tag)
{ {
return drm_vma_node_is_allowed(node, filp) ? 0 : -EACCES; return drm_vma_node_is_allowed(node, tag) ? 0 : -EACCES;
} }
#endif /* __DRM_VMA_MANAGER_H__ */ #endif /* __DRM_VMA_MANAGER_H__ */
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册