/** 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;
}
示例#2
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;
}
示例#3
0
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;
}
示例#4
0
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;
}
示例#5
0
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;
}
示例#6
0
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;
}
示例#8
0
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;
}