On Thu, Jul 5, 2018 at 5:12 PM, Manfred Spraul <manf...@colorfullife.com> wrote: > Hi Dmitry, > > On 07/05/2018 10:36 AM, Dmitry Vyukov wrote: >> >> [...] >> Hi Manfred, >> >> The series looks like a significant improvement to me. Thanks! >> >> I feel that this code can be further simplified (unless I am missing >> something here). Please take a look at this version: >> >> >> https://github.com/dvyukov/linux/commit/f77aeaf80f3c4ab524db92184d874b03063fea3a?diff=split >> >> This is on top of your patches. It basically does the same as your >> code, but consolidates all id/seq assignment and dealing with next_id, >> and deduplicates code re CONFIG_CHECKPOINT_RESTORE. Currently it's a >> bit tricky to follow e.g. where exactly next_id is consumed and where >> it needs to be left intact. >> The only difference is that my code assigns new->id earlier. Not sure >> if it can lead to anything bad. But if yes, then it seems that >> currently uninitialized new->id is exposed. If necessary (?) we could >> reset new->id in the same place where we set new->deleted. > > Everything looks correct for me, it is better than the current code. > Except that you didn't sign off your last patch.
It was meant more like a review comment expressed in code. But I signed it now. > As next step: Who can merge the patches towards linux-next? > The only open point that I see are stress tests of the error codepaths. > > And: > I don't think that the patches are relevant for linux-stable, correct? I don't have a pressing need for stable (simply because KMSAN/KTSAN are not backported to any stable releases, so we won't discover it there).
commit 2395f6462596b298d3a4eeb1614b1a67686b6fc5 Author: Dmitry Vyukov <dvyu...@google.com> Date: Thu Jul 5 10:15:26 2018 +0200 ipc_idr_alloc refactoring Signed-off-by: Dmitry Vyukov <dvyu...@google.com> diff --git a/ipc/util.c b/ipc/util.c index 776a9ce2905ff..c98675d8612e2 100644 --- a/ipc/util.c +++ b/ipc/util.c @@ -193,52 +193,32 @@ static struct kern_ipc_perm *ipc_findkey(struct ipc_ids *ids, key_t key) return NULL; } -#ifdef CONFIG_CHECKPOINT_RESTORE /* * Specify desired id for next allocated IPC object. */ -static inline int ipc_idr_alloc(struct ipc_ids *ids, - struct kern_ipc_perm *new) +static inline int ipc_idr_alloc(struct ipc_ids *ids, struct kern_ipc_perm *new) { - int key; + int key, next_id = -1; - if (ids->next_id < 0) { - key = idr_alloc(&ids->ipcs_idr, new, 0, 0, GFP_NOWAIT); - } else { - key = idr_alloc(&ids->ipcs_idr, new, - ipcid_to_idx(ids->next_id), - 0, GFP_NOWAIT); - ids->next_id = -1; - } - return key; -} +#ifdef CONFIG_CHECKPOINT_RESTORE + next_id = ids->next_id; + ids->next_id = -1; +#endif -static inline void ipc_set_seq(struct ipc_ids *ids, - struct kern_ipc_perm *new) -{ - if (ids->next_id < 0) { /* default, behave as !CHECKPOINT_RESTORE */ + if (next_id < 0) { /* !CHECKPOINT_RESTORE or next_id is unset */ new->seq = ids->seq++; if (ids->seq > IPCID_SEQ_MAX) ids->seq = 0; + key = idr_alloc(&ids->ipcs_idr, new, 0, 0, GFP_NOWAIT); } else { - new->seq = ipcid_to_seqx(ids->next_id); + new->seq = ipcid_to_seqx(next_id); + key = idr_alloc(&ids->ipcs_idr, new, ipcid_to_idx(next_id), + 0, GFP_NOWAIT); } + new->id = SEQ_MULTIPLIER * new->seq + key; + return key; } -#else -#define ipc_idr_alloc(ids, new) \ - idr_alloc(&(ids)->ipcs_idr, (new), 0, 0, GFP_NOWAIT) - -static inline void ipc_set_seq(struct ipc_ids *ids, - struct kern_ipc_perm *new) -{ - new->seq = ids->seq++; - if (ids->seq > IPCID_SEQ_MAX) - ids->seq = 0; -} - -#endif /* CONFIG_CHECKPOINT_RESTORE */ - /** * ipc_addid - add an ipc identifier * @ids: ipc identifier set @@ -278,8 +258,6 @@ int ipc_addid(struct ipc_ids *ids, struct kern_ipc_perm *new, int limit) current_euid_egid(&euid, &egid); new->cuid = new->uid = euid; new->gid = new->cgid = egid; - - ipc_set_seq(ids, new); new->deleted = false; /* @@ -317,9 +295,6 @@ int ipc_addid(struct ipc_ids *ids, struct kern_ipc_perm *new, int limit) ids->in_use++; if (id > ids->max_id) ids->max_id = id; - - new->id = SEQ_MULTIPLIER * new->seq + id; - return id; }