<div dir="ltr">Hi,<div><br><br>I have one more question to the case-29.<br><br>According to the Windows and Linux DRBD kernel stack, there are a similar pattern.<br><br>1. Stacks<br><br>1) Windows Stack dump when the file copy command was pending.<br><br>   - Please see &quot;inc_ap_bio&quot;<br><br>    nt!KiSwapThread+0x266<br>    nt!KiCommitThreadWait+0x1df<br>    nt!KeWaitForMultipleObjects+0x535<br>    drbd!schedule+0x114<br>    drbd!inc_ap_bio+0x49<br>    drbd!drbd_make_request+0x29<br>    drbd!DoSplitIo+0xfb<br>    drbd!mvolReadWriteDevice+0x2b0<br>    drbd!mvolWorkThread+0x114<br><br><br>2) Linux Stack dump when the file copy command was pending.<br><br>  - Pleae check previous post.<br><br>    [Drbd-dev] [CASE-29] After re-connect, WFBitMapS-WFBitMapT status has sustained </div><div>                                    continuously and copy command hangs<br>     <a href="http://lists.linbit.com/pipermail/drbd-dev/2016-March/003328.html">http://lists.linbit.com/pipermail/drbd-dev/2016-March/003328.html</a><br><br><br>  - Please see the &quot;7) drbd pending point #1&quot;<br>   <br>    [CASE-29] primary log<br>     <a href="http://pastebin.com/3hAWNkHn">http://pastebin.com/3hAWNkHn</a><br><br>    Mar  3 14:52:04 drbd9-01 kernel: Call Trace:<br>    Mar  3 14:52:04 drbd9-01 kernel: [&lt;ffffffff816096a9&gt;] schedule+0x29/0x70<br>    Mar  3 14:52:04 drbd9-01 kernel: [&lt;ffffffffa04a03da&gt;] drbd_make_request+0x14a/0x360 [drbd]<br>    Mar  3 14:52:04 drbd9-01 kernel: [&lt;ffffffff812aa56f&gt;] ? generic_make_request_checks+0x24f/0x380<br>    Mar  3 14:52:04 drbd9-01 kernel: [&lt;ffffffff81098230&gt;] ? wake_up_bit+0x30/0x30<br>    Mar  3 14:52:04 drbd9-01 kernel: [&lt;ffffffff812aa782&gt;] generic_make_request+0xe2/0x130<br>    Mar  3 14:52:04 drbd9-01 kernel: [&lt;ffffffff812aa841&gt;] submit_bio+0x71/0x150<br>    Mar  3 14:52:04 drbd9-01 kernel: [&lt;ffffffffa0531c55&gt;] ext4_io_submit+0x25/0x50 [ext4]<br><br><br><br>2. Sources<br><br>1) Ver 9.0.1<br><br>    static inline void inc_ap_bio(struct drbd_device *device, int rw)<br>    {<br>        wait_event(device-&gt;misc_wait, inc_ap_bio_cond(device, rw));<br>    }<br><br>    static inline void dec_ap_bio(struct drbd_device *device, int rw)<br>    {<br>         int ap_bio = atomic_dec_return(&amp;device-&gt;ap_bio_cnt[rw]);<br>       .........</div><div><br>         if (ap_bio == 0)<br>                wake_up(&amp;device-&gt;misc_wait);<br>    }<br><br><br>2) Ver 8.4.7<br><br>    static inline void inc_ap_bio(struct drbd_device *device)<br>    {<br>         wait_event(device-&gt;misc_wait, inc_ap_bio_cond(device));<br>    }<br><br>    static inline void dec_ap_bio(struct drbd_device *device)<br>    {<br>         int mxb = drbd_get_max_buffers(device);<br>         int ap_bio = atomic_dec_return(&amp;device-&gt;ap_bio_cnt);<br><br>        .............</div><div><br></div><div><br>         /* this currently does wake_up for every dec_ap_bio!<br>          * maybe rather introduce some type of hysteresis?<br>          * e.g. (ap_bio == mxb/2 || ap_bio == 0) ? */<br>       </div><div>          if (ap_bio &lt; mxb)<br>                 wake_up(&amp;device-&gt;misc_wait);<br>    }<br><br><br><br>3. Questions<br><br>1) See &quot;1. Stacks&quot;.<br>    I think, The Linux &quot;drbd_make_request+0x14a/0x360 [drbd]&quot; will probably<br>    mean the same thing as the Windows &quot;drbd!inc_ap_bio+0x49&quot;.<br>    What do you think about it?<br><br>2) In version 8.4.7, dec_ap_bio wakes up misc_wait when condition is &quot;ap_bio &lt; max&quot;.<br>    I mean, this version has greater tolerance than version 9.0.1.<br>    My question is Why do you change this condition from &quot;ap_bio &lt; max&quot; to &quot;ap_bio == 0&quot;  in version 9.0.1?</div><div><br><br>Thanks.</div><div><br></div><div><br></div></div>