Re: [PATCH v2] kernel: refactor: shorten has_pending_signals

From: Andrea Calabrese

Date: Thu May 21 2026 - 10:31:37 EST


On Thu, 2026-05-21 at 14:50 +0200, Oleg Nesterov wrote:
> On 05/20, Andrea Calabrese wrote:
> >
> >  static inline bool has_pending_signals(sigset_t *signal, sigset_t
> > *blocked)
> >  {
> > - unsigned long ready;
> > - long i;
> > -
> > - switch (_NSIG_WORDS) {
> > - default:
> > - for (i = _NSIG_WORDS, ready = 0; --i >= 0 ;)
> > - ready |= signal->sig[i] &~ blocked-
> > >sig[i];
> > - break;
> > -
> > - case 4: ready  = signal->sig[3] &~ blocked->sig[3];
> > - ready |= signal->sig[2] &~ blocked->sig[2];
> > - ready |= signal->sig[1] &~ blocked->sig[1];
> > - ready |= signal->sig[0] &~ blocked->sig[0];
> > - break;
> > -
> > - case 2: ready  = signal->sig[1] &~ blocked->sig[1];
> > - ready |= signal->sig[0] &~ blocked->sig[0];
> > - break;
> > -
> > - case 1: ready  = signal->sig[0] &~ blocked->sig[0];
> > - }
> > - return ready != 0;
> > + unsigned long ready = 0;
> > + for (long i = 0; i < _NSIG_WORDS; i++)
> > + ready |= signal->sig[i] & ~blocked->sig[i];
> > + return ready != 0;
> >  }
>
> Note that with your patch the main loop doesn't stop when ready
> becomes != 0...
>
> OK, I guess the modern compilers doesn't need this hint even if
> _NSIG_WORDS > 1, so
>
> Acked-by: Oleg Nesterov <oleg@xxxxxxxxxx>
>
>
> But since your patch is just a cleanup, you could do
>
> for (int i = 0; i < _NSIG_WORDS; i++) {
> if (signal->sig[i] & ~blocked->sig[i])
> return true;
> }
>
> return false;
>
Good idea, I will send a v3 with this!


> but this is subjective, I won't insist.
>
> Oleg.