mmo
struct i915_mmap_offset *mmo, *mn;
spin_lock(&obj->mmo.lock);
rbtree_postorder_for_each_entry_safe(mmo, mn,
&obj->mmo.offsets, offset) {
if (mmo->mmap_type == I915_MMAP_TYPE_GTT)
spin_unlock(&obj->mmo.lock);
drm_vma_node_unmap(&mmo->vma_node,
spin_lock(&obj->mmo.lock);
spin_unlock(&obj->mmo.lock);
spin_lock(&obj->mmo.lock);
rb = obj->mmo.offsets.rb_node;
struct i915_mmap_offset *mmo =
rb_entry(rb, typeof(*mmo), offset);
if (mmo->mmap_type == mmap_type) {
spin_unlock(&obj->mmo.lock);
return mmo;
if (mmo->mmap_type < mmap_type)
spin_unlock(&obj->mmo.lock);
insert_mmo(struct drm_i915_gem_object *obj, struct i915_mmap_offset *mmo)
spin_lock(&obj->mmo.lock);
p = &obj->mmo.offsets.rb_node;
if (pos->mmap_type == mmo->mmap_type) {
spin_unlock(&obj->mmo.lock);
&mmo->vma_node);
kfree(mmo);
if (pos->mmap_type < mmo->mmap_type)
rb_link_node(&mmo->offset, rb, p);
rb_insert_color(&mmo->offset, &obj->mmo.offsets);
spin_unlock(&obj->mmo.lock);
return mmo;
struct i915_mmap_offset *mmo;
mmo = lookup_mmo(obj, mmap_type);
if (mmo)
mmo = kmalloc(sizeof(*mmo), GFP_KERNEL);
if (!mmo)
mmo->obj = obj;
mmo->mmap_type = mmap_type;
drm_vma_node_reset(&mmo->vma_node);
&mmo->vma_node, obj->base.size / PAGE_SIZE);
&mmo->vma_node, obj->base.size / PAGE_SIZE);
mmo = insert_mmo(obj, mmo);
GEM_BUG_ON(lookup_mmo(obj, mmap_type) != mmo);
drm_vma_node_allow_once(&mmo->vma_node, file);
return mmo;
kfree(mmo);
struct i915_mmap_offset *mmo;
mmo = mmap_offset_attach(obj, mmap_type, file);
if (IS_ERR(mmo))
return PTR_ERR(mmo);
*offset = drm_vma_node_offset_addr(&mmo->vma_node);
struct i915_mmap_offset *mmo = vma->vm_private_data;
struct drm_i915_gem_object *obj = mmo->obj;
struct i915_mmap_offset *mmo = vma->vm_private_data;
struct drm_i915_gem_object *obj = mmo->obj;
struct i915_mmap_offset *mmo,
vma->vm_private_data = mmo;
switch (mmo->mmap_type) {
struct i915_mmap_offset *mmo = NULL;
mmo = container_of(node, struct i915_mmap_offset, vma_node);
obj = i915_gem_object_get_rcu(mmo->obj);
return i915_gem_object_mmap(obj, mmo, vma);
struct i915_mmap_offset *mmo = NULL;
mmo = container_of(node, struct i915_mmap_offset, vma_node);
obj = i915_gem_object_get_rcu(mmo->obj);
struct i915_mmap_offset *mmo = NULL;
mmo = mmap_offset_attach(obj, mmap_type, NULL);
if (IS_ERR(mmo))
return PTR_ERR(mmo);
vma->vm_pgoff += drm_vma_node_start(&mmo->vma_node);
return i915_gem_object_mmap(obj, mmo, vma);
struct i915_mmap_offset *mmo = area->vm_private_data;
struct drm_i915_gem_object *obj = mmo->obj;
obj_offset = area->vm_pgoff - drm_vma_node_start(&mmo->vma_node);
struct i915_mmap_offset *mmo = area->vm_private_data;
struct drm_i915_gem_object *obj = mmo->obj;
obj_offset = area->vm_pgoff - drm_vma_node_start(&mmo->vma_node);
vma->mmo = mmo;
struct i915_mmap_offset *mmo = area->vm_private_data;
struct drm_i915_gem_object *obj = mmo->obj;
vm_fault_cpu(struct i915_mmap_offset *mmo, struct uvm_faultinfo *ufi,
struct drm_i915_gem_object *obj = mmo->obj;
switch (mmo->mmap_type) {
vm_fault_gtt(struct i915_mmap_offset *mmo, struct uvm_faultinfo *ufi,
struct drm_i915_gem_object *obj = mmo->obj;
obj_offset = (entry->offset >> PAGE_SHIFT) - drm_vma_node_start(&mmo->vma_node);
vma->mmo = mmo;
struct i915_mmap_offset *mmo = NULL;
mmo = container_of(node, struct i915_mmap_offset, vma_node);
if (!mmo) {
KASSERT(gem_obj == &mmo->obj->base);
if (mmo->mmap_type == I915_MMAP_TYPE_GTT)
return vm_fault_gtt(mmo, ufi, vaddr, access_type);
return vm_fault_cpu(mmo, ufi, access_type);
mtx_init(&obj->mmo.lock, IPL_NONE);
obj->mmo.offsets = RB_ROOT;
struct i915_mmap_offset *mmo, *mn;
spin_lock(&obj->mmo.lock);
rbtree_postorder_for_each_entry_safe(mmo, mn, &obj->mmo.offsets, offset)
drm_vma_node_revoke(&mmo->vma_node, file);
spin_unlock(&obj->mmo.lock);
if (!RB_EMPTY_ROOT(&obj->mmo.offsets)) {
struct i915_mmap_offset *mmo, *mn;
rbtree_postorder_for_each_entry_safe(mmo, mn,
&obj->mmo.offsets,
&mmo->vma_node);
kfree(mmo);
obj->mmo.offsets = RB_ROOT;
} mmo;
if (!vma->mmo)
node = &vma->mmo->vma_node;
node = &vma->mmo->vma_node;
struct i915_mmap_offset *mmo;
struct mmo *mo;
static struct mmo mmo[] = {
#define NMMO (sizeof mmo / sizeof *mmo)
for (mo = mmo; mo < &mmo[NMMO]; mo++) {