Lines Matching refs:ids

38  *  The ids->rwsem must be taken when:

75 int ids;
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)
116 ids->in_use = 0;
117 ids->seq = 0;
118 init_rwsem(&ids->rwsem);
119 rhashtable_init(&ids->key_ht, &ipc_kht_params);
120 idr_init(&ids->ipcs_idr);
121 ids->max_idx = -1;
122 ids->last_idx = -1;
124 ids->next_id = -1;
134 * @ids: ipc id table to iterate.
137 void __init ipc_init_proc_interface(const char *path, const char *header, int ids,
149 iface->ids = ids;
163 * @ids: ipc identifier set
171 static struct kern_ipc_perm *ipc_findkey(struct ipc_ids *ids, key_t key)
175 ipcp = rhashtable_lookup_fast(&ids->key_ht, &key, ipc_kht_params);
201 static inline int ipc_idr_alloc(struct ipc_ids *ids, struct kern_ipc_perm *new)
206 next_id = ids->next_id;
207 ids->next_id = -1;
225 max_idx = max(ids->in_use * 0x3 / 0x2, ipc_min_cycle);
229 idx = idr_alloc_cyclic(&ids->ipcs_idr, NULL, 0, max_idx, GFP_NOWAIT);
236 if (idx <= ids->last_idx) {
237 ids->seq++;
238 if (ids->seq >= ipcid_seq_max()) {
239 ids->seq = 0;
242 ids->last_idx = idx;
244 new->seq = ids->seq;
249 idr_replace(&ids->ipcs_idr, new, idx);
253 idx = idr_alloc(&ids->ipcs_idr, new, ipcid_to_idx(next_id), 0, GFP_NOWAIT);
263 * @ids: ipc identifier set
265 * @limit: limit for the number of used ids
267 * Add an entry 'new' to the ipc ids idr. The permissions object is
276 int ipc_addid(struct ipc_ids *ids, struct kern_ipc_perm *new, int limit)
289 if (ids->in_use >= limit) {
305 idx = ipc_idr_alloc(ids, new);
309 err = rhashtable_insert_fast(&ids->key_ht, &new->khtnode, ipc_kht_params);
311 idr_remove(&ids->ipcs_idr, idx);
322 ids->in_use++;
323 if (idx > ids->max_idx) {
324 ids->max_idx = idx;
332 * @ids: ipc identifier set
339 static int ipcget_new(struct ipc_namespace *ns, struct ipc_ids *ids, const struct ipc_ops *ops,
344 down_write(&ids->rwsem);
346 up_write(&ids->rwsem);
385 * @ids: ipc identifier set
396 static int ipcget_public(struct ipc_namespace *ns, struct ipc_ids *ids, const struct ipc_ops *ops,
407 down_write(&ids->rwsem);
408 ipcp = ipc_findkey(ids, params->key);
436 up_write(&ids->rwsem);
443 * @ids: ipc identifier set
449 static void ipc_kht_remove(struct ipc_ids *ids, struct kern_ipc_perm *ipcp)
452 WARN_ON_ONCE(rhashtable_remove_fast(&ids->key_ht, &ipcp->khtnode, ipc_kht_params));
458 * @ids: ipc identifier set
464 void ipc_rmid(struct ipc_ids *ids, struct kern_ipc_perm *ipcp)
468 WARN_ON_ONCE(idr_remove(&ids->ipcs_idr, idx) != ipcp);
469 ipc_kht_remove(ids, ipcp);
470 ids->in_use--;
473 if (unlikely(idx == ids->max_idx)) {
479 } while (!idr_find(&ids->ipcs_idr, idx));
480 ids->max_idx = idx;
486 * @ids: ipc identifier set
492 void ipc_set_key_private(struct ipc_ids *ids, struct kern_ipc_perm *ipcp)
494 ipc_kht_remove(ids, ipcp);
589 * @ids: ipc identifier set
592 * Look for an id in the ipc ids idr and return associated ipc object.
597 struct kern_ipc_perm *ipc_obtain_object_idr(struct ipc_ids *ids, int id)
602 out = idr_find(&ids->ipcs_idr, idx);
612 * @ids: ipc identifier set
621 struct kern_ipc_perm *ipc_obtain_object_check(struct ipc_ids *ids, int id)
623 struct kern_ipc_perm *out = ipc_obtain_object_idr(ids, id);
639 * @ids: ipc identifier set
646 int ipcget(struct ipc_namespace *ns, struct ipc_ids *ids, const struct ipc_ops *ops, struct ipc_params *params)
649 return ipcget_new(ns, ids, ops, params);
651 return ipcget_public(ns, ids, ops, params);
678 * @ids: the table of ids where to look for the ipc
695 struct kern_ipc_perm *ipcctl_obtain_check(struct ipc_namespace *ns, struct ipc_ids *ids, int id, int cmd,
702 ipcp = ipc_obtain_object_check(ids, id);
759 static struct kern_ipc_perm *sysvipc_find_ipc(struct ipc_ids *ids, loff_t pos, loff_t *new_pos)
765 for (id = 0; id < pos && total < ids->in_use; id++) {
766 ipc = idr_find(&ids->ipcs_idr, id);
773 if (total >= ids->in_use) {
778 ipc = idr_find(&ids->ipcs_idr, pos);
801 return sysvipc_find_ipc(&iter->ns->ids[iface->ids], *pos, pos);
812 struct ipc_ids *ids;
814 ids = &iter->ns->ids[iface->ids];
820 down_read(&ids->rwsem);
833 return sysvipc_find_ipc(ids, *pos - 1, pos);
841 struct ipc_ids *ids;
848 ids = &iter->ns->ids[iface->ids];
850 up_read(&ids->rwsem);