<div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div>Hi Joel,</div><div><br /></div><div>It looks good to me and i have sent a new patch for it.<br /></div><div><br /></div><div>Thanks,</div><div>Xu<br /></div><br /><br /><br /><div  style="position:relative;zoom:1"></div><br /><pre><br />From: Joel Colledge &lt;joel.colledge@linbit.com&gt;
Date: 2022-04-20 18:22:32
To:  Rui Xu &lt;rui.xu@easystack.cn&gt;
Cc:  Philipp Reisner &lt;philipp.reisner@linbit.com&gt;,drbd-dev@lists.linbit.com,dongsheng.yang@easystack.cn
Subject: Re: [PATCH] drbd: fix a race of drbd_free_peer_req&gt;Hi Xu,
&gt;
&gt;I think there is a potential race here, but I am not convinced that
&gt;this is a general solution. The peer request could still be freed by
&gt;got_peer_ack() between checking "list_empty(&amp;peer_req-&gt;recv_order)"
&gt;and freeing it in drbd_finish_peer_reqs(). Also, this solution keeps
&gt;the page chain for peer requests for an unnecessarily long time, which
&gt;is not ideal in memory constrained situations.
&gt;
&gt;The underlying race, as far as I understand it, is that got_peer_ack()
&gt;can be called while still processing the request in
&gt;drbd_finish_peer_reqs(). This is only relevant for peer writes and not
&gt;resync, so only the e_end_block() path is of interest. got_peer_ack()
&gt;will only be called after we have sent the corresponding barrier ack
&gt;for the peer request.
&gt;
&gt;On the basis of this reasoning, I think a simple solution is to swap
&gt;drbd_may_finish_epoch() and drbd_free_page_chain() in e_end_block().
&gt;Please try this and send it as a patch if it solves your problem.
&gt;
&gt;By the way, this patch doesn't compile due to a mismatched brace.
&gt;
&gt;Best regards,
&gt;Joel
</pre></div><br>