Re: + fork-use-this_cpu_try_cmpxchg-in-try_release_thread_stack_to_cache.patch added to mm-nonmm-unstable branch

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, May 23, 2024 at 10:45 PM Oleg Nesterov <oleg@xxxxxxxxxx> wrote:
>
> > From: Uros Bizjak <ubizjak@xxxxxxxxx>
> > Subject: fork: use this_cpu_try_cmpxchg() in try_release_thread_stack_to_cache()
> > Date: Thu, 23 May 2024 09:35:14 +0200
> >
> > Use this_cpu_try_cmpxchg() instead of this_cpu_cmpxchg (*ptr, old, new) ==
> > old in try_release_thread_stack_to_cache.  x86 CMPXCHG instruction returns
> > success in ZF flag, so this change saves a compare after cmpxchg (and
> > related move instruction in front of cmpxchg).
> >
> > No functional change intended.
>
> Sorry, cosmetic nit...
>
> > @@ -205,7 +205,9 @@ static bool try_release_thread_stack_to_
> >       unsigned int i;
> >
> >       for (i = 0; i < NR_CACHED_STACKS; i++) {
> > -             if (this_cpu_cmpxchg(cached_stacks[i], NULL, vm) != NULL)
> > +             struct vm_struct *tmp = NULL;
> > +
> > +             if (!this_cpu_try_cmpxchg(cached_stacks[i], &tmp, vm))
> >                       continue;
> >               return true;
> >       }
>
> Why not
>
>         static bool try_release_thread_stack_to_cache(struct vm_struct *vm)
>         {
>                 unsigned int i;
>
>                 for (i = 0; i < NR_CACHED_STACKS; i++) {
>                         struct vm_struct *tmp = NULL;
>
>                         if (this_cpu_try_cmpxchg(cached_stacks[i], &tmp, vm))
>                                 return true;
>                 }
>                 return false;
>         }
>
> ?
>
> To me this "continue" just adds the unnecessary confusion with or without
> this patch, but I won't insist.

To ease review, I was trying to make the patch as simple as possible
(almost mechanical), because the logic around cmpxchg() and
try_cmpxchg() is somehow hard to follow (e.g. cmpxchg() returns the
previous value at location when it succeeds, the "tmp" variable is
only updated when try_cmpxchg() fails). Any additional change would
just unnecessarily complicate the patch.

Uros.





[Index of Archives]     [Kernel Archive]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]

  Powered by Linux