On Thu, Dec 10, 2020 at 10:00:46AM +0100, Claudio Jeker wrote:
> On Mon, Dec 07, 2020 at 10:54:26PM -0600, Scott Cheloha wrote:
> > Index: ipmi.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/ipmi.c,v
> > retrieving revision 1.112
> > diff -u -p -r1.112 ipmi.c
> > --- ipmi.c 29 Mar 2020 09:31:10 -0000 1.112
> > +++ ipmi.c 2 Dec 2020 20:31:57 -0000
> > @@ -1497,7 +1497,8 @@ ipmi_poll_thread(void *arg)
> > printf("%s: no SDRs IPMI disabled\n", DEVNAME(sc));
> > goto done;
> > }
> > - while (tsleep(sc, PWAIT, "ipmirun", 1) != EWOULDBLOCK)
> > + while (tsleep_nsec(sc, PWAIT, "ipmirun",
> > + MSEC_TO_NSEC(1)) != EWOULDBLOCK)
> > continue;
> > }
> >
>
> This idiom of a quick sleep is a bit strange and I would prefer if this is
> rewritten to be a simple tsleep_nsec call without the while loop.
> Since there is no corresponding wakeup call this tsleep can only return
> EWOULDBLOCK there is no way to return any other value (PCATCH is not set
> and nothing will do a wakeup).
>
> So this could be simply written as:
> tsleep_nsec(sc, PWAIT, "ipmirun", MSEC_TO_NSEC(1));
>
> This whole poll thread is just way more complicated then it needs to be.
> Neither current_sensor nor thread->running are needed. I'm not even sure
> if the tsleep itself is needed in that discovery loop. get_sdr() calls
> ipmi_cmd() which does another tsleep to wait for the command.
>
> This driver seems to just use all the concepts without much thought. I bet
> ipmi_cmd() calls can race against each other.
One thing at a time.
First, remove the loop. It is unnecessary, as there is no other
thread calling wakeup(9), i.e. tsleep_nsec(9) will always return
EWOULDBLOCK here.
ok?
Index: ipmi.c
===================================================================
RCS file: /cvs/src/sys/dev/ipmi.c,v
retrieving revision 1.113
diff -u -p -r1.113 ipmi.c
--- ipmi.c 11 Dec 2020 04:00:33 -0000 1.113
+++ ipmi.c 11 Dec 2020 04:05:31 -0000
@@ -1497,9 +1497,7 @@ ipmi_poll_thread(void *arg)
printf("%s: no SDRs IPMI disabled\n", DEVNAME(sc));
goto done;
}
- while (tsleep_nsec(sc, PWAIT, "ipmirun",
- MSEC_TO_NSEC(1)) != EWOULDBLOCK)
- continue;
+ tsleep_nsec(sc, PWAIT, "ipmirun", MSEC_TO_NSEC(1));
}
/* initialize sensor list for thread */