<story><title>Linux Pipes Are Slow</title><url>https://qsantos.fr/2024/08/25/linux-pipes-are-slow/</url></story><parent_chain><item><author>koverstreet</author><text>One of my sideprojects is intended to address this: &lt;a href=&quot;https:&amp;#x2F;&amp;#x2F;lwn.net&amp;#x2F;Articles&amp;#x2F;976836&amp;#x2F;&quot; rel=&quot;nofollow&quot;&gt;https:&amp;#x2F;&amp;#x2F;lwn.net&amp;#x2F;Articles&amp;#x2F;976836&amp;#x2F;&lt;/a&gt;&lt;p&gt;The idea is a syscall for getting a ringbuffer for any supported file descriptor, including pipes - and for pipes, if both ends support using the ringbuffer they&amp;#x27;ll map the same ringbuffer: zero copy IO, potentially without calling into the kernel at all.&lt;p&gt;Would love to find collaborators for this one :)</text></item></parent_chain><comment><author>phafu</author><text>At least for user space usage, I&amp;#x27;m not sure a new kernel thing is needed. Quite a while ago I have implemented a user space (single producer &amp;#x2F; single consumer) ring buffer, which uses an eventfd to mimic pipe behavior and functionality quite closely (i.e. being able to sleep &amp;amp; poll for ring buffer full&amp;#x2F;empty situations), but otherwise operates lockless and without syscall overhead.</text></comment>
<story><title>Linux Pipes Are Slow</title><url>https://qsantos.fr/2024/08/25/linux-pipes-are-slow/</url></story><parent_chain><item><author>koverstreet</author><text>One of my sideprojects is intended to address this: &lt;a href=&quot;https:&amp;#x2F;&amp;#x2F;lwn.net&amp;#x2F;Articles&amp;#x2F;976836&amp;#x2F;&quot; rel=&quot;nofollow&quot;&gt;https:&amp;#x2F;&amp;#x2F;lwn.net&amp;#x2F;Articles&amp;#x2F;976836&amp;#x2F;&lt;/a&gt;&lt;p&gt;The idea is a syscall for getting a ringbuffer for any supported file descriptor, including pipes - and for pipes, if both ends support using the ringbuffer they&amp;#x27;ll map the same ringbuffer: zero copy IO, potentially without calling into the kernel at all.&lt;p&gt;Would love to find collaborators for this one :)</text></item></parent_chain><comment><author>messe</author><text>&amp;gt; and for pipes, if both ends support using the ringbuffer they&amp;#x27;ll map the same ringbuffer&lt;p&gt;Is there planned to be a standardized way to signal to the other end of the pipe that ring buffers are supported, so this could be handled transparently in libc? If not, I don&amp;#x27;t really see what advantage it gets you compared to shared memory + a futex for synchronization—for pipes that is.</text></comment>