<div dir="ltr"><div>Hi Yann, <br></div><div><br></div><div>Thank you for your time and quick response. <br></div><div><br></div><div>You are right.<span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span class="gmail-Q4iAWc"> I found what misled me. It was a buffered writer to the stdout, which did all my syscals restarts and <span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span class="gmail-Q4iAWc">it confused me.</span></span></span></span></span></span></div><div><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span class="gmail-Q4iAWc">The kernel does what it should, if a portion of data was written, then it's a partial write, otherwise a restart if SA_RESTART is set. <br></span></span></span></div><div><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span class="gmail-Q4iAWc"><br></span></span></span></div><div><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span class="gmail-Q4iAWc">Thank you for confirming that there are no changes in the kernel about the syscalls restarts.<br></span></span></span></div><div><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span class="gmail-Q4iAWc"><br></span></span></span></div><div><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span class="gmail-Q4iAWc">Have a good day!<br></span></span></span></div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Aug 4, 2022 at 7:38 PM Yann Droneaud <<a href="mailto:ydroneaud@opteya.com">ydroneaud@opteya.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi,<br>
<br>
Le 04/08/2022 à 20:01, Viacheslav Biriukov a écrit :<br>
><br>
> But what I can't understand is how and where the kernel modifies the <br>
> arguments of the write system call and where it collects the return <br>
> values of all these restarts, thus the userspace caller ultimately <br>
> sees the correct number of written bytes.<br>
><br>
> With strace I can see all that retries, for example:<br>
><br>
> write(1, ""..., 33554431)               = 65536<br>
> write(1, ""..., 33488895)               = ? ERESTARTSYS (To be <br>
> restarted if SA_RESTART is set)<br>
> write(1, ""..., 33488895)               = ? ERESTARTSYS (To be <br>
> restarted if SA_RESTART is set)<br>
> write(1, ""..., 33488895)               = ? ERESTARTSYS (To be <br>
> restarted if SA_RESTART is set)<br>
> write(1, ""..., 33488895)               = 33488895<br>
><br>
> Here there were 4 restarts (I sent 4 signals), 3 of them returned <br>
> ERESTARTSYS and 2 were able to write to the pipe. Also for restarts <br>
> strace shows the correct 3rd argument, which is decrementing.<br>
><br>
> The caller in the userspace in the end sees that it was able to write <br>
> 65536+33488895 bytes. Which is correct and what the man 7 pipe describes.<br>
><br>
> My question is how and where it does that. I tried to dig in the <br>
> kernel source code but can't find the place where this tracking occurs.<br>
><br>
<br>
It doesn't. SA_RESTART is only meant to retry syscall that would have <br>
returned EINTR.<br>
<br>
In such case, there's no tracking to do, because nothing was actually <br>
written, so the syscall can be restarted with the same parameters.<br>
<br>
<br>
Regards.<br>
<br>
-- <br>
<br>
Yann Droneaud<br>
<br>
OPTEYA<br>
<br>
<br>
</blockquote></div><br clear="all"><br>-- <br><div dir="ltr" class="gmail_signature"><div dir="ltr"><div><div dir="ltr">Viacheslav Biriukov<br>BR</div></div></div></div>