On Tue, Jan 29, 2019 at 4:20 PM Jens Axboe <[email protected]> wrote:
> On 1/29/19 4:58 AM, Arnd Bergmann wrote:
> > On Tue, Jan 29, 2019 at 7:30 AM Christoph Hellwig <[email protected]> wrote:
> >>> On Mon, Jan 28, 2019 at 11:25:12AM -0700, Jens Axboe wrote:
> >>>> Especially with poll support now in the series, don't we need a ѕigmask
> >>>> argument similar to pselect/ppoll/io_pgetevents now to deal with signal
> >>>> blocking during waiting for events?
> >>>
> >>> Is there any way to avoid passing in the sigset_t size? If it's just a
> >>> 32-bit/64-bit thing, surely the in_compat_syscall() could cover it? Or
> >>> are there other cases that need to be catered to?
> >>
> >> As far as I can tell we never look at it, never looked at it and don't
> >> have any plans to look at it anytime soon. But when I tried to omit
> >> it for io_pgetevents I got stong pushback and thus had to add the
> >> crazy double indirection calling convention.
>
> That's good info. I am currently using set_user_sigmask() for it.
> I'd really like to avoid having to pass in a sigset_t size for the
> system call, however.
I really wouldn't do it, given that all other signal handling interfaces
are prepared for longer signal masks. You /could/ probably extend
it later with a flags bit to signify a longer mask instead of using
the entire register to hold the bit length, it just seems really
inconsistent with all other system calls.
Arnd
> What's the best way of achieving that? Can I get
> away with doing something like this:
>
> if (in_compat_syscall()) {
> const compat_sigset_t __user *compat_sig;
>
> compat_sig = (const compat_sigset_t __user *) sig;
> ret = set_compat_user_sigmask(compat_sig, &ksigmask,
> &sigsaved, _NSIG_WORDS);
> } else {
> ret = set_user_sigmask(sig, &ksigmask, &sigsaved,
> _NSIG_WORDS);
> }