int static_node_info_init() { krg_static_node_info_t *static_node_info; register_io_linker(STATIC_NODE_INFO_LINKER, &static_node_info_io_linker); /* Create the static node info kddm set */ static_node_info_kddm_set = create_new_kddm_set(kddm_def_ns, STATIC_NODE_INFO_KDDM_ID, STATIC_NODE_INFO_LINKER, KDDM_CUSTOM_DEF_OWNER, sizeof(krg_static_node_info_t), 0); if (IS_ERR(static_node_info_kddm_set)) OOM; static_node_info = _kddm_grab_object(static_node_info_kddm_set, kerrighed_node_id); static_node_info->nr_cpu = num_online_cpus(); static_node_info->totalram = totalram_pages; static_node_info->totalhigh = totalhigh_pages; _kddm_put_object(static_node_info_kddm_set, kerrighed_node_id); return 0; }
/** Notify the creation of a new shm segment to Kerrighed. * * @author Renaud Lottiaux */ int krg_ipc_shm_newseg (struct ipc_namespace *ns, struct shmid_kernel *shp) { shmid_object_t *shp_object; struct kddm_set *kddm; long *key_index; int index, err; BUG_ON(!shm_ids(ns).krgops); index = ipcid_to_idx(shp->shm_perm.id); shp_object = _kddm_grab_object_manual_ft( shm_ids(ns).krgops->data_kddm_set, index); BUG_ON(shp_object); shp_object = kmem_cache_alloc(shmid_object_cachep, GFP_KERNEL); if (!shp_object) { err = -ENOMEM; goto err_put; } /* Create a KDDM set to host segment pages */ kddm = _create_new_kddm_set (kddm_def_ns, 0, SHM_MEMORY_LINKER, kerrighed_node_id, PAGE_SIZE, &shp->shm_perm.id, sizeof(int), 0); if (IS_ERR(kddm)) { err = PTR_ERR(kddm); goto err_put; } shp->shm_file->f_dentry->d_inode->i_mapping->kddm_set = kddm; shp->shm_file->f_op = &krg_shm_file_operations; shp_object->set_id = kddm->id; shp_object->local_shp = shp; _kddm_set_object(shm_ids(ns).krgops->data_kddm_set, index, shp_object); if (shp->shm_perm.key != IPC_PRIVATE) { key_index = _kddm_grab_object(shm_ids(ns).krgops->key_kddm_set, shp->shm_perm.key); *key_index = index; _kddm_put_object (shm_ids(ns).krgops->key_kddm_set, shp->shm_perm.key); } shp->shm_perm.krgops = shm_ids(ns).krgops; err_put: _kddm_put_object(shm_ids(ns).krgops->data_kddm_set, index); return 0; }
static int create_pid_kddm_object(struct pid *pid, int early) { int nr = pid_knr(pid); struct pid_kddm_object *obj; struct task_kddm_object *task_obj; obj = _kddm_grab_object(pid_kddm_set, nr); if (IS_ERR(obj)) { _kddm_put_object(pid_kddm_set, nr); return PTR_ERR(obj); } BUG_ON(!obj); task_obj = krg_task_readlock(nr); spin_lock(&pid_kddm_lock); BUG_ON(early && pid->kddm_obj); if (!pid->kddm_obj) { obj->pid = pid; obj->active = 1; if (early) obj->attach_pending = 1; BUG_ON(obj->task_obj); if (task_obj) { BUG_ON(task_obj->pid_obj); /* * These rcu_assign_pointer are not really needed, * but are cleaner :) */ rcu_assign_pointer(obj->task_obj, task_obj); rcu_assign_pointer(obj->task_obj->pid_obj, obj); } pid->kddm_obj = obj; } BUG_ON(pid->kddm_obj != obj); spin_unlock(&pid_kddm_lock); krg_task_unlock(nr); _kddm_put_object(pid_kddm_set, nr); return 0; }
/** * @author Louis Rilling */ struct task_kddm_object *krg_task_create_writelock(pid_t pid) { struct task_kddm_object *obj; /* Filter well known cases of no task kddm object. */ /* The exact filter is expected to be implemented by the caller. */ BUG_ON(!(pid & GLOBAL_PID_MASK)); obj = _kddm_grab_object(task_kddm_set, pid); if (likely(obj && !IS_ERR(obj))) { down_write(&obj->sem); /* No dying object race or this is really smelly */ BUG_ON(obj->write_locked == 2); /* Marker for unlock. Dirty but temporary. */ obj->write_locked = 1; } else { _kddm_put_object(task_kddm_set, pid); } return obj; }
int static_cpu_info_init(void) { krg_static_cpu_info_t *static_cpu_info; int cpu_id, i; register_io_linker(STATIC_CPU_INFO_LINKER, &static_cpu_info_io_linker); /* Create the CPU info kddm set */ static_cpu_info_kddm_set = create_new_kddm_set(kddm_def_ns, STATIC_CPU_INFO_KDDM_ID, STATIC_CPU_INFO_LINKER, KDDM_CUSTOM_DEF_OWNER, sizeof(krg_static_cpu_info_t), 0); if (IS_ERR(static_cpu_info_kddm_set)) OOM; for_each_online_cpu (i) { cpu_id = krg_cpu_id(i); cpu_data(i).krg_cpu_id = cpu_id; static_cpu_info = _kddm_grab_object(static_cpu_info_kddm_set, cpu_id); static_cpu_info->info = cpu_data(i); #ifndef CONFIG_USERMODE static_cpu_info->info.cpu_khz = cpu_khz; #endif _kddm_put_object(static_cpu_info_kddm_set, cpu_id); } return 0; }