Lines Matching full:ids

38  *  The ids->rwsem must be taken when:
75 int ids; member
109 * @ids: ipc identifier set
112 * below ipc_mni) then initialise the keys hashtable and ids idr.
114 void ipc_init_ids(struct ipc_ids *ids) in ipc_init_ids() argument
116 ids->in_use = 0; in ipc_init_ids()
117 ids->seq = 0; in ipc_init_ids()
118 init_rwsem(&ids->rwsem); in ipc_init_ids()
119 rhashtable_init(&ids->key_ht, &ipc_kht_params); in ipc_init_ids()
120 idr_init(&ids->ipcs_idr); in ipc_init_ids()
121 ids->max_idx = -1; in ipc_init_ids()
122 ids->last_idx = -1; in ipc_init_ids()
124 ids->next_id = -1; in ipc_init_ids()
134 * @ids: ipc id table to iterate.
138 int ids, int (*show)(struct seq_file *, void *)) in ipc_init_proc_interface() argument
148 iface->ids = ids; in ipc_init_proc_interface()
163 * @ids: ipc identifier set
171 static struct kern_ipc_perm *ipc_findkey(struct ipc_ids *ids, key_t key) in ipc_findkey() argument
175 ipcp = rhashtable_lookup_fast(&ids->key_ht, &key, in ipc_findkey()
201 static inline int ipc_idr_alloc(struct ipc_ids *ids, struct kern_ipc_perm *new) in ipc_idr_alloc() argument
206 next_id = ids->next_id; in ipc_idr_alloc()
207 ids->next_id = -1; in ipc_idr_alloc()
225 max_idx = max(ids->in_use*3/2, ipc_min_cycle); in ipc_idr_alloc()
229 idx = idr_alloc_cyclic(&ids->ipcs_idr, NULL, 0, max_idx, in ipc_idr_alloc()
238 if (idx <= ids->last_idx) { in ipc_idr_alloc()
239 ids->seq++; in ipc_idr_alloc()
240 if (ids->seq >= ipcid_seq_max()) in ipc_idr_alloc()
241 ids->seq = 0; in ipc_idr_alloc()
243 ids->last_idx = idx; in ipc_idr_alloc()
245 new->seq = ids->seq; in ipc_idr_alloc()
250 idr_replace(&ids->ipcs_idr, new, idx); in ipc_idr_alloc()
254 idx = idr_alloc(&ids->ipcs_idr, new, ipcid_to_idx(next_id), in ipc_idr_alloc()
264 * @ids: ipc identifier set
266 * @limit: limit for the number of used ids
268 * Add an entry 'new' to the ipc ids idr. The permissions object is
277 int ipc_addid(struct ipc_ids *ids, struct kern_ipc_perm *new, int limit) in ipc_addid() argument
289 if (ids->in_use >= limit) in ipc_addid()
304 idx = ipc_idr_alloc(ids, new); in ipc_addid()
308 err = rhashtable_insert_fast(&ids->key_ht, &new->khtnode, in ipc_addid()
311 idr_remove(&ids->ipcs_idr, idx); in ipc_addid()
322 ids->in_use++; in ipc_addid()
323 if (idx > ids->max_idx) in ipc_addid()
324 ids->max_idx = idx; in ipc_addid()
331 * @ids: ipc identifier set
338 static int ipcget_new(struct ipc_namespace *ns, struct ipc_ids *ids, in ipcget_new() argument
343 down_write(&ids->rwsem); in ipcget_new()
345 up_write(&ids->rwsem); in ipcget_new()
385 * @ids: ipc identifier set
396 static int ipcget_public(struct ipc_namespace *ns, struct ipc_ids *ids, in ipcget_public() argument
407 down_write(&ids->rwsem); in ipcget_public()
408 ipcp = ipc_findkey(ids, params->key); in ipcget_public()
433 up_write(&ids->rwsem); in ipcget_public()
440 * @ids: ipc identifier set
446 static void ipc_kht_remove(struct ipc_ids *ids, struct kern_ipc_perm *ipcp) in ipc_kht_remove() argument
449 rhashtable_remove_fast(&ids->key_ht, &ipcp->khtnode, in ipc_kht_remove()
455 * @ids: ipc identifier set
461 void ipc_rmid(struct ipc_ids *ids, struct kern_ipc_perm *ipcp) in ipc_rmid() argument
465 idr_remove(&ids->ipcs_idr, idx); in ipc_rmid()
466 ipc_kht_remove(ids, ipcp); in ipc_rmid()
467 ids->in_use--; in ipc_rmid()
470 if (unlikely(idx == ids->max_idx)) { in ipc_rmid()
475 } while (!idr_find(&ids->ipcs_idr, idx)); in ipc_rmid()
476 ids->max_idx = idx; in ipc_rmid()
482 * @ids: ipc identifier set
488 void ipc_set_key_private(struct ipc_ids *ids, struct kern_ipc_perm *ipcp) in ipc_set_key_private() argument
490 ipc_kht_remove(ids, ipcp); in ipc_set_key_private()
585 * @ids: ipc identifier set
588 * Look for an id in the ipc ids idr and return associated ipc object.
593 struct kern_ipc_perm *ipc_obtain_object_idr(struct ipc_ids *ids, int id) in ipc_obtain_object_idr() argument
598 out = idr_find(&ids->ipcs_idr, idx); in ipc_obtain_object_idr()
607 * @ids: ipc identifier set
616 struct kern_ipc_perm *ipc_obtain_object_check(struct ipc_ids *ids, int id) in ipc_obtain_object_check() argument
618 struct kern_ipc_perm *out = ipc_obtain_object_idr(ids, id); in ipc_obtain_object_check()
632 * @ids: ipc identifier set
639 int ipcget(struct ipc_namespace *ns, struct ipc_ids *ids, in ipcget() argument
643 return ipcget_new(ns, ids, ops, params); in ipcget()
645 return ipcget_public(ns, ids, ops, params); in ipcget()
671 * @ids: the table of ids where to look for the ipc
689 struct ipc_ids *ids, int id, int cmd, in ipcctl_obtain_check() argument
696 ipcp = ipc_obtain_object_check(ids, id); in ipcctl_obtain_check()
754 static struct kern_ipc_perm *sysvipc_find_ipc(struct ipc_ids *ids, loff_t pos, in sysvipc_find_ipc() argument
761 for (id = 0; id < pos && total < ids->in_use; id++) { in sysvipc_find_ipc()
762 ipc = idr_find(&ids->ipcs_idr, id); in sysvipc_find_ipc()
768 if (total >= ids->in_use) in sysvipc_find_ipc()
772 ipc = idr_find(&ids->ipcs_idr, pos); in sysvipc_find_ipc()
794 return sysvipc_find_ipc(&iter->ns->ids[iface->ids], *pos, pos); in sysvipc_proc_next()
805 struct ipc_ids *ids; in sysvipc_proc_start() local
807 ids = &iter->ns->ids[iface->ids]; in sysvipc_proc_start()
813 down_read(&ids->rwsem); in sysvipc_proc_start()
824 return sysvipc_find_ipc(ids, *pos - 1, pos); in sysvipc_proc_start()
832 struct ipc_ids *ids; in sysvipc_proc_stop() local
838 ids = &iter->ns->ids[iface->ids]; in sysvipc_proc_stop()
840 up_read(&ids->rwsem); in sysvipc_proc_stop()