Lines Matching refs:ids

76 	int ids;  member
115 void ipc_init_ids(struct ipc_ids *ids) in ipc_init_ids() argument
117 ids->in_use = 0; in ipc_init_ids()
118 ids->seq = 0; in ipc_init_ids()
119 init_rwsem(&ids->rwsem); in ipc_init_ids()
120 rhashtable_init(&ids->key_ht, &ipc_kht_params); in ipc_init_ids()
121 idr_init(&ids->ipcs_idr); in ipc_init_ids()
122 ids->max_idx = -1; in ipc_init_ids()
123 ids->last_idx = -1; in ipc_init_ids()
125 ids->next_id = -1; in ipc_init_ids()
139 int ids, int (*show)(struct seq_file *, void *)) in ipc_init_proc_interface() argument
149 iface->ids = ids; in ipc_init_proc_interface()
172 static struct kern_ipc_perm *ipc_findkey(struct ipc_ids *ids, key_t key) in ipc_findkey() argument
176 ipcp = rhashtable_lookup_fast(&ids->key_ht, &key, in ipc_findkey()
202 static inline int ipc_idr_alloc(struct ipc_ids *ids, struct kern_ipc_perm *new) in ipc_idr_alloc() argument
207 next_id = ids->next_id; in ipc_idr_alloc()
208 ids->next_id = -1; in ipc_idr_alloc()
226 max_idx = max(ids->in_use*3/2, ipc_min_cycle); in ipc_idr_alloc()
230 idx = idr_alloc_cyclic(&ids->ipcs_idr, NULL, 0, max_idx, in ipc_idr_alloc()
239 if (idx <= ids->last_idx) { in ipc_idr_alloc()
240 ids->seq++; in ipc_idr_alloc()
241 if (ids->seq >= ipcid_seq_max()) in ipc_idr_alloc()
242 ids->seq = 0; in ipc_idr_alloc()
244 ids->last_idx = idx; in ipc_idr_alloc()
246 new->seq = ids->seq; in ipc_idr_alloc()
251 idr_replace(&ids->ipcs_idr, new, idx); in ipc_idr_alloc()
255 idx = idr_alloc(&ids->ipcs_idr, new, ipcid_to_idx(next_id), in ipc_idr_alloc()
278 int ipc_addid(struct ipc_ids *ids, struct kern_ipc_perm *new, int limit) in ipc_addid() argument
290 if (ids->in_use >= limit) in ipc_addid()
305 idx = ipc_idr_alloc(ids, new); in ipc_addid()
309 err = rhashtable_insert_fast(&ids->key_ht, &new->khtnode, in ipc_addid()
312 idr_remove(&ids->ipcs_idr, idx); in ipc_addid()
323 ids->in_use++; in ipc_addid()
324 if (idx > ids->max_idx) in ipc_addid()
325 ids->max_idx = idx; in ipc_addid()
339 static int ipcget_new(struct ipc_namespace *ns, struct ipc_ids *ids, in ipcget_new() argument
344 down_write(&ids->rwsem); in ipcget_new()
346 up_write(&ids->rwsem); in ipcget_new()
397 static int ipcget_public(struct ipc_namespace *ns, struct ipc_ids *ids, in ipcget_public() argument
408 down_write(&ids->rwsem); in ipcget_public()
409 ipcp = ipc_findkey(ids, params->key); in ipcget_public()
434 up_write(&ids->rwsem); in ipcget_public()
447 static void ipc_kht_remove(struct ipc_ids *ids, struct kern_ipc_perm *ipcp) in ipc_kht_remove() argument
450 WARN_ON_ONCE(rhashtable_remove_fast(&ids->key_ht, &ipcp->khtnode, in ipc_kht_remove()
467 static int ipc_search_maxidx(struct ipc_ids *ids, int limit) in ipc_search_maxidx() argument
483 if (idr_get_next(&ids->ipcs_idr, &tmpidx)) in ipc_search_maxidx()
497 void ipc_rmid(struct ipc_ids *ids, struct kern_ipc_perm *ipcp) in ipc_rmid() argument
501 WARN_ON_ONCE(idr_remove(&ids->ipcs_idr, idx) != ipcp); in ipc_rmid()
502 ipc_kht_remove(ids, ipcp); in ipc_rmid()
503 ids->in_use--; in ipc_rmid()
506 if (unlikely(idx == ids->max_idx)) { in ipc_rmid()
507 idx = ids->max_idx-1; in ipc_rmid()
509 idx = ipc_search_maxidx(ids, idx); in ipc_rmid()
510 ids->max_idx = idx; in ipc_rmid()
522 void ipc_set_key_private(struct ipc_ids *ids, struct kern_ipc_perm *ipcp) in ipc_set_key_private() argument
524 ipc_kht_remove(ids, ipcp); in ipc_set_key_private()
627 struct kern_ipc_perm *ipc_obtain_object_idr(struct ipc_ids *ids, int id) in ipc_obtain_object_idr() argument
632 out = idr_find(&ids->ipcs_idr, idx); in ipc_obtain_object_idr()
650 struct kern_ipc_perm *ipc_obtain_object_check(struct ipc_ids *ids, int id) in ipc_obtain_object_check() argument
652 struct kern_ipc_perm *out = ipc_obtain_object_idr(ids, id); in ipc_obtain_object_check()
673 int ipcget(struct ipc_namespace *ns, struct ipc_ids *ids, in ipcget() argument
677 return ipcget_new(ns, ids, ops, params); in ipcget()
679 return ipcget_public(ns, ids, ops, params); in ipcget()
723 struct ipc_ids *ids, int id, int cmd, in ipcctl_obtain_check() argument
730 ipcp = ipc_obtain_object_check(ids, id); in ipcctl_obtain_check()
800 static struct kern_ipc_perm *sysvipc_find_ipc(struct ipc_ids *ids, loff_t *pos) in sysvipc_find_ipc() argument
808 ipc = idr_get_next(&ids->ipcs_idr, &tmpidx); in sysvipc_find_ipc()
831 return sysvipc_find_ipc(&iter->ns->ids[iface->ids], pos); in sysvipc_proc_next()
842 struct ipc_ids *ids; in sysvipc_proc_start() local
844 ids = &iter->ns->ids[iface->ids]; in sysvipc_proc_start()
850 down_read(&ids->rwsem); in sysvipc_proc_start()
861 return sysvipc_find_ipc(ids, pos); in sysvipc_proc_start()
869 struct ipc_ids *ids; in sysvipc_proc_stop() local
875 ids = &iter->ns->ids[iface->ids]; in sysvipc_proc_stop()
877 up_read(&ids->rwsem); in sysvipc_proc_stop()