On Fri, May 17, 2019 at 12:21:57PM -0700, Vasily Khoruzhick wrote: > On Sun, May 12, 2019 at 6:39 AM Maxime Ripard <maxime.ripard@xxxxxxxxxxx> wrote: > > > +static int tsens_get_temp(void *data, int *temp) > > > +{ > > > + struct tsensor *s = data; > > > + struct tsens_device *tmdev = s->tmdev; > > > + int val; > > > + > > > + regmap_read(tmdev->regmap, tmdev->chip->temp_data_base + > > > + 0x4 * s->id, &val); > > > + > > > + if (unlikely(val == 0)) > > > + return -EBUSY; > > > > I'm not sure why a val equals to 0 would be associated with EBUSY? > > First few reads of temp data return 0, and in case of H6 (and A64) it > means max temperature, so kernel does emergency shutdown. I used > -ETIMEDOUT as a workaround in my tree, but it's not appropriate here > either. Any suggestions are welcome. If we can use the interrupts and wait for a value to be converted before we read, then we should do that. > > Also, it's not in a fast path, so you can drop the unlikely. Chances > > are it's not that unlikely anyway. > > As I said earlier, it's just few samples after start up. That's not really my point though. unlikely is tricky to get right, because the compiler has his own meaning of what exactly unlikely means statistically to be able to do the right branching optimisations. However, this particular real case scenario might not have the same probability, which might result in a poor optimisation choice due to the unlikely being there. Moreover, this probability can evolve in the future. For example, let's assume that we enable dynamic PM in the driver. Starting from there, most of the reads become "first" reads, and your unlikely case becomes the likely one. My point was that, because of this, and because of the fact that it's really not a hot path, we should just drop it. Maxime -- Maxime Ripard, Bootlin Embedded Linux and Kernel engineering https://bootlin.com
Attachment:
signature.asc
Description: PGP signature