Hi Waiman, On 3/18/19 7:46 PM, Waiman Long wrote: > --- a/ipc/util.c >> +++ b/ipc/util.c >> @@ -221,9 +221,17 @@ static inline int ipc_idr_alloc(struct ipc_ids *ids, struct kern_ipc_perm *new) >> */ >> >> if (next_id < 0) { /* !CHECKPOINT_RESTORE or next_id is unset */ >> + int max_idx; >> + >> + max_idx = ids->in_use*3/2; >> + if (max_idx > ipc_mni) >> + max_idx = ipc_mni; >> + if (max_idx < ipc_min_cycle) >> + max_idx = ipc_min_cycle; > > Why don't you use the min() and max() macros which will make it easier > to read? > Changed. >> >> /* allocate the idx, with a NULL struct kern_ipc_perm */ >> - idx = idr_alloc(&ids->ipcs_idr, NULL, 0, 0, GFP_NOWAIT); >> + idx = idr_alloc_cyclic(&ids->ipcs_idr, NULL, 0, max_idx, >> + GFP_NOWAIT); >> >> if (idx >= 0) { >> /* >> diff --git a/ipc/util.h b/ipc/util.h >> index 8c834ed39012..ef4e86bb2db8 100644 >> --- a/ipc/util.h >> +++ b/ipc/util.h >> @@ -27,12 +27,14 @@ >> */ >> #define IPCMNI_SHIFT 15 >> #define IPCMNI_EXTEND_SHIFT 24 >> +#define IPCMNI_EXTEND_MIN_CYCLE (2 << 12) > > How about > > #define IPCMNI_EXTEND_MIN_CYCLE    (RADIX_TREE_MAP_SIZE * > RADIX_TREE_MAP_SIZE) > Good idea. Actually, "2<<12" was the initial guess. And then I noticed that this ends up as a two level radix tree during testing :-) Updated patch attached. --     Manfred