On Thu, Feb 19, 2026 at 02:17:26PM +0000, Shenwei Wang wrote:
> 
> 
> > -----Original Message-----
> > From: Andrew Lunn <[email protected]>
> > Sent: Thursday, February 19, 2026 7:27 AM
> > To: Arnaud POULIQUEN <[email protected]>
> > Cc: Shenwei Wang <[email protected]>; Linus Walleij
> > <[email protected]>; Bartosz Golaszewski <[email protected]>; Jonathan Corbet
> > <[email protected]>; Rob Herring <[email protected]>; Krzysztof Kozlowski
> > <[email protected]>; Conor Dooley <[email protected]>; Bjorn Andersson
> > <[email protected]>; Mathieu Poirier <[email protected]>; Frank 
> > Li
> > <[email protected]>; Sascha Hauer <[email protected]>; Shuah Khan
> > <[email protected]>; [email protected]; linux-
> > [email protected]; [email protected]; Pengutronix Kernel Team
> > <[email protected]>; Fabio Estevam <[email protected]>; Peng Fan
> > <[email protected]>; [email protected]; linux-
> > [email protected]; [email protected]; linux-arm-
> > [email protected]; dl-linux-imx <[email protected]>; Bartosz
> > Golaszewski <[email protected]>
> > Subject: [EXT] Re: [PATCH v8 3/4] gpio: rpmsg: add generic rpmsg GPIO driver
> > 
> > > > +   if (sync) {
> > > > +           err = wait_for_completion_timeout(&info->cmd_complete,
> > > > +                                             
> > > > msecs_to_jiffies(RPMSG_TIMEOUT));
> > > > +           if (err == 0) {
> > > > +                   dev_err(&info->rpdev->dev, "rpmsg_send timeout!\n");
> > > > +                   return -ETIMEDOUT;
> > >
> > > strange condition you return an error if err == 0, for redability use 
> > > 'ret'
> > > variable or simply:
> > >
> > >               if(!wait_for_completion_timeout(&info->cmd_complete,
> > >                                 msecs_to_jiffies(RPMSG_TIMEOUT)) {
> > >                       dev_err(&info->rpdev->dev, "rpmsg_send timeout!\n");
> > >                       return -ETIMEDOUT;
> > >               }
> > 
> > This will be from a comment i made. It appears that
> > do_wait_for_common() can return -ERESTARTSYS. I assume that should be
> > returned to user space?
> > 
> 
> It looks like there might be a bit of confusion around what 
> wait_for_completion_timeout() 
> actually returns. That function never returns -ERESTARTSYS. Instead, its 
> behavior is pretty 
> simple:
> 
> - 0 means the wait timed out
> - A positive value means the completion happened (the value is just the 
> remaining jiffies)
> 
> So the driver returns the timeout error, and the upper application can decide 
> how it wants
> to handle that situation, for example restart or ignore.

wait_for_completion_timeout():
        return wait_for_common(x, timeout, TASK_UNINTERRUPTIBLE);

wait_for_common():
        return __wait_for_common(x, io_schedule_timeout, timeout, state);

__wait_for_common():
        timeout = do_wait_for_common(x, action, timeout, state);
        ...
        return timeout;

do_wait_for_common():

                do {
                        if (signal_pending_state(state, current)) {
                                timeout = -ERESTARTSYS;
                                break;
                        }
...             
                } while (!x->done && timeout);
...
                if (!x->done)
                        return timeout;
...
        return timeout ?: 1;

This last line is interesting, and i had to go look at the
documentation:

https://gcc.gnu.org/onlinedocs/gcc/Conditionals.html

So this is equivalent to

        return timeout ? timeout : 1;

Hence, it does appear wait_for_completion_timeout() can return
-ERESTARTSYS

There is however a comment in include/linux/errno.h

/*
 * These should never be seen by user programs.  To return one of ERESTART*
 * codes, signal_pending() MUST be set.  Note that ptrace can observe these
 * at syscall exit tracing, but they will never be left for the debugged user
 * process to see.
 */
#define ERESTARTSYS     512

So we do seem to be talking about a corner case, allowing gdb(1) to
know about it, but not user space.

        Andrew

Reply via email to