<div dir="ltr">Hello Mathieu,<div><br></div><div>We are interested in using userspace rcu for one of our projects.</div><div>Our main requirement is that we have some hash tables stored in shared memory which will be accessed by multiple reader processes. We have one single writer process. Since our use case is more read intensive compared to write, we have choosen to use RCU to synchronize the shared data.</div>
<div><br></div><div>Now, when our writer process updates some nodes(lets say delete some node) in hash tables stored in shared memory, it must call synchronize_rcu(), before it can actually free up the node. However, one note in the discussion (<a href="http://lists.lttng.org/pipermail/lttng-dev/2012-December/019295.html">http://lists.lttng.org/pipermail/lttng-dev/2012-December/019295.html</a>) states that <span style="color:rgb(0,0,0);white-space:pre-wrap">synchronize_rcu() (or call_rcu()) </span><span style="color:rgb(0,0,0);white-space:pre-wrap">  executing in the context of one process will not see the RCU read-side </span><span style="color:rgb(0,0,0);white-space:pre-wrap"> locks of another process. If this is the case, then how/when can the writer process delete the node permanently. Should we need to consider doing garbage collection on our own?</span></div>
<div><span style="color:rgb(0,0,0);white-space:pre-wrap"><br></span></div><div><span style="color:rgb(0,0,0);white-space:pre-wrap">Also, if I undertsand correctly, shyncronize_rcu() does the  following basically:</span></div>
<div><span style="color:rgb(0,0,0);white-space:pre-wrap"><br></span></div><div><font color="#000000"><span style="white-space:pre-wrap">void synchronize_rcu(void)
{
        int cpu;
        for_each_online_cpu(cpu)
                run_on(cpu);
}</span></font><span style="color:rgb(0,0,0);white-space:pre-wrap">
</span></div><div><font color="#000000"><span style="white-space:pre-wrap"><br></span></font></div><div><font color="#000000"><span style="white-space:pre-wrap">So, when our writer process call synchronize_rcu(), it will basically be made to run on all the CPUs. Shouldn't this be sufficient to ensure that any other reader process which had started a read rcu critical section has completed? </span></font></div>
<div><span style="color:rgb(0,0,0);white-space:pre-wrap"><br></span></div><div><div><br></div>-- <br>Regards,<br>Devanjan
</div></div>