/** Import an MM struct * @author Renaud Lottiaux * * @param obj_entry Object entry of the object to import. * @param _buffer Data to import in the object. */ int mm_import_object (struct rpc_desc *desc, struct kddm_set *_set, struct kddm_obj *obj_entry, objid_t objid, int flags) { struct mm_struct *mm; krgsyms_val_t unmap_id, get_unmap_id; struct kddm_set *set; unique_id_t mm_id, kddm_id; void *context_vdso; int r; mm = obj_entry->object; r = rpc_unpack (desc, 0, &mm_id, sizeof(unique_id_t)); if (r) return r; r = rpc_unpack (desc, 0, &kddm_id, sizeof(unique_id_t)); if (r) return r; r = rpc_unpack (desc, 0, &context_vdso, sizeof(void*)); if (r) return r; if (mm == NULL) { /* First import */ set = _find_get_kddm_set(kddm_def_ns, kddm_id); BUG_ON (set == NULL); mm = set->obj_set; mm->mm_id = mm_id; atomic_inc(&mm->mm_users); obj_entry->object = mm; put_kddm_set(set); mm->context.vdso = context_vdso; } r = rpc_unpack(desc, 0, &mm->copyset, sizeof(krgnodemask_t)); if (r) return r; r = rpc_unpack_type(desc, get_unmap_id); if (r) return r; mm->get_unmapped_area = krgsyms_import (get_unmap_id); r = rpc_unpack_type(desc, unmap_id); if (r) return r; mm->unmap_area = krgsyms_import (unmap_id); return 0; }
void *kddm_get_object(struct kddm_ns *ns, kddm_set_id_t set_id, objid_t objid) { struct kddm_set *set; void *obj; set = _find_get_kddm_set (ns, set_id); obj = generic_kddm_get_object(set, objid, 0); put_kddm_set(set); return obj; }
void *kddm_get_object_no_lock(struct kddm_ns *ns, kddm_set_id_t set_id, objid_t objid) { struct kddm_set *set; void *obj; set = _find_get_kddm_set (ns, set_id); obj = generic_kddm_get_object(set, objid, KDDM_NO_FREEZE); put_kddm_set(set); return obj; }
void *kddm_try_grab_object(struct kddm_ns *ns, kddm_set_id_t set_id, objid_t objid) { struct kddm_set *set; void *obj; set = _find_get_kddm_set (ns, set_id); obj = generic_kddm_grab_object(set, objid, KDDM_TRY_GRAB); put_kddm_set(set); return obj; }
void *async_kddm_grab_object(struct kddm_ns *ns, kddm_set_id_t set_id, objid_t objid) { struct kddm_set *set; void *obj; set = _find_get_kddm_set (ns, set_id); obj = generic_kddm_grab_object(set, objid, KDDM_ASYNC_REQ); put_kddm_set(set); return obj; }
void *fkddm_grab_object(struct kddm_ns *ns, kddm_set_id_t set_id, objid_t objid, int flags) { struct kddm_set *set; void *obj; set = _find_get_kddm_set (ns, set_id); obj = generic_kddm_grab_object(set, objid, flags); put_kddm_set(set); return obj; }
int kddm_set_object(struct kddm_ns *ns, kddm_set_id_t set_id, objid_t objid, void *object) { struct kddm_set *set; int res; set = _find_get_kddm_set (ns, set_id); res = _kddm_set_object_state(set, objid, object, WRITE_OWNER); put_kddm_set(set); return res; }
void *kddm_get_object_manual_ft(struct kddm_ns *ns, kddm_set_id_t set_id, objid_t objid) { struct kddm_set *set; void *obj; set = _find_get_kddm_set (ns, set_id); obj = generic_kddm_get_object(set, objid, KDDM_NO_FT_REQ | KDDM_SEND_OWNERSHIP); put_kddm_set(set); return obj; }