drm: use anon-inode instead of relying on cdevs
DRM drivers share a common address_space across all character-devices of a single DRM device. This allows simple buffer eviction and mapping-control. However, DRM core currently waits for the first ->open() on any char-dev to mark the underlying inode as backing inode of the device. This delayed initialization causes ugly conditions all over the place: if (dev->dev_mapping) do_sth(); To avoid delayed initialization and to stop reusing the inode of the char-dev, we allocate an anonymous inode for each DRM device and reset filp->f_mapping to it on ->open(). Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
This commit is contained in:
@@ -153,24 +153,24 @@ static struct {
|
||||
static void evict_entry(struct drm_gem_object *obj,
|
||||
enum tiler_fmt fmt, struct usergart_entry *entry)
|
||||
{
|
||||
if (obj->dev->dev_mapping) {
|
||||
struct omap_gem_object *omap_obj = to_omap_bo(obj);
|
||||
int n = usergart[fmt].height;
|
||||
size_t size = PAGE_SIZE * n;
|
||||
loff_t off = mmap_offset(obj) +
|
||||
(entry->obj_pgoff << PAGE_SHIFT);
|
||||
const int m = 1 + ((omap_obj->width << fmt) / PAGE_SIZE);
|
||||
if (m > 1) {
|
||||
int i;
|
||||
/* if stride > than PAGE_SIZE then sparse mapping: */
|
||||
for (i = n; i > 0; i--) {
|
||||
unmap_mapping_range(obj->dev->dev_mapping,
|
||||
off, PAGE_SIZE, 1);
|
||||
off += PAGE_SIZE * m;
|
||||
}
|
||||
} else {
|
||||
unmap_mapping_range(obj->dev->dev_mapping, off, size, 1);
|
||||
struct omap_gem_object *omap_obj = to_omap_bo(obj);
|
||||
int n = usergart[fmt].height;
|
||||
size_t size = PAGE_SIZE * n;
|
||||
loff_t off = mmap_offset(obj) +
|
||||
(entry->obj_pgoff << PAGE_SHIFT);
|
||||
const int m = 1 + ((omap_obj->width << fmt) / PAGE_SIZE);
|
||||
|
||||
if (m > 1) {
|
||||
int i;
|
||||
/* if stride > than PAGE_SIZE then sparse mapping: */
|
||||
for (i = n; i > 0; i--) {
|
||||
unmap_mapping_range(obj->dev->anon_inode->i_mapping,
|
||||
off, PAGE_SIZE, 1);
|
||||
off += PAGE_SIZE * m;
|
||||
}
|
||||
} else {
|
||||
unmap_mapping_range(obj->dev->anon_inode->i_mapping,
|
||||
off, size, 1);
|
||||
}
|
||||
|
||||
entry->obj = NULL;
|
||||
|
Reference in New Issue
Block a user