long get_appid_from_pid(pid_t pid) { struct rpc_desc *desc; kerrighed_node_t n = KERRIGHED_NODE_ID_NONE; struct getappid_request_msg msg; long app_id; int err = 0; /* lock the task to be sure it does not exit */ n = krg_lock_pid_location(pid); if (n == KERRIGHED_NODE_ID_NONE) return -ESRCH; /* the task is local */ if (n == kerrighed_node_id) { app_id = __get_appid_from_local_pid(pid); if (app_id < 0) err = app_id; goto out_unlock; } err = -ENOMEM; msg.requester = kerrighed_node_id; msg.pid = pid; desc = rpc_begin(APP_REMOTE_CHKPT, n); if (!desc) goto out_unlock; err = rpc_pack_type(desc, msg); if (err) goto err; err = pack_creds(desc, current_cred()); if (err) goto err; err = rpc_unpack_type(desc, app_id); if (err) goto err; out_end: rpc_end(desc, 0); out_unlock: krg_unlock_pid_location(pid); if (err) return err; return app_id; err: rpc_cancel(desc); goto out_end; }
int cluster_barrier(struct cluster_barrier *barrier, krgnodemask_t *nodes, kerrighed_node_t master) { struct cluster_barrier_core *core_bar; struct cluster_barrier_id id; struct rpc_desc *desc; int err = 0; BUG_ON (!__krgnode_isset(kerrighed_node_id, nodes)); BUG_ON (!__krgnode_isset(master, nodes)); spin_lock(&barrier->lock); barrier->id.toggle = (barrier->id.toggle + 1) % 2; id = barrier->id; core_bar = &barrier->core[id.toggle]; if (core_bar->in_barrier) err = -EBUSY; core_bar->in_barrier = 1; spin_unlock(&barrier->lock); if (err) return err; desc = rpc_begin(RPC_ENTER_BARRIER, master); rpc_pack_type (desc, id); rpc_pack(desc, 0, nodes, sizeof(krgnodemask_t)); rpc_end(desc, 0); /* Wait for the barrier to complete */ wait_event (core_bar->waiting_tsk, (core_bar->in_barrier == 0)); return 0; }