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

From: Oleg Nesterov

Date: Thu May 21 2026 - 09:27:55 EST


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;

but this is subjective, I won't insist.

Oleg.