Date: Sun, 2 Nov 2014 19:56:11 +0000 From: Mark R V Murray <mark@grondar.org> To: Konstantin Belousov <kostikbel@gmail.com> Cc: "svn-src-head@freebsd.org" <svn-src-head@freebsd.org>, "svn-src-all@freebsd.org" <svn-src-all@freebsd.org>, "src-committers@freebsd.org" <src-committers@freebsd.org> Subject: Re: svn commit: r273958 - head/sys/dev/random Message-ID: <751CD860-95B9-4F68-AE69-976B42823AD0@grondar.org> In-Reply-To: <20141102194625.GC53947@kib.kiev.ua> References: <201411020201.sA221unt091493@svn.freebsd.org> <720EB74E-094A-43F3-8B1C-47BC7F6FECC3@grondar.org> <1414934579.17308.248.camel@revolution.hippie.lan> <6FB65828-6A79-4BDE-A9F7-BC472BA538CE@grondar.org> <CAJ-VmomeOwE3LOpehhJ__G=FCoBDRXrrn%2BSfjwPFODts6YYHNQ@mail.gmail.com> <20141102192057.GB53947@kib.kiev.ua> <29A795E1-19E2-49E4-9653-143D3F6F3F12@grondar.org> <20141102194625.GC53947@kib.kiev.ua>
next in thread | previous in thread | raw e-mail | index | archive | help
> On 2 Nov 2014, at 19:46, Konstantin Belousov <kostikbel@gmail.com> = wrote: >=20 >> I don???t quite follow what you mean, but it sounds like you = understand >> the problem. Could you please explain with a bit more detail? >=20 > Which problem ? There are two. >=20 > One is the Adrian' complain. tsleep(9) catches signals, and return > EINTR/ERESTART when catched. Typical driver code checks for the > errors from {t,m}sleep(9) and aborts the operation if error is > returned. I.e. you should do > error =3D tsleep(...); > if (error !=3D 0) { > abort the loop; > return to caller; > } > The fine detail is that for the case when read has already partially > progressed, i.e. something was copied out to uio, the error must > not be returned, but short read performed instead. OK, I think I follow this. In another mail you say: > Yes, this is because error from tsleep() in random_adaptor_read() > does not abort the loop. But next loop iteration calls tsleep() > which returns immediately since there is still pending signal. > The process continues indefinitely. .. which supports this what you say further above. Thanks. > This leads to another question about the code in = random_adapter_read(): > if ra_read method sleeps, it must handle the signals as well, return > error, and the second loop which perorms ra_read/uiomove should be > aborted as well. Again, error from either ra_read or uiomove(9) > must result in short read if something was already copied to uio. > Currently, there is no error returned by ra_read (or it is ignored), > and error from uiomove always returned, even if something was already > copied. Are you saying the same thing again, or something else? If you are = saying something else, then I am struggling to follow you. > Second problem is that random_adaptor_lock is owned while tsleep() > is called (or whatever sleep primitive is used inside ra_read). If > platform could only provide randomness through some hw, and module > is loaded while thread is blocked, module cannot register, while > reading thread cannot make progress. I=E2=80=99m sorry, I don=E2=80=99t understand this. M --=20 Mark R V Murray
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?751CD860-95B9-4F68-AE69-976B42823AD0>