<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=koi8-r">
</head>
<body>
<p dir="ltr"></p>
<p dir="ltr">17 окт. 2016 г. 19:23 пользователь Maxim Patlasov &lt;MPatlasov@virtuozzo.com&gt; написал:<br>
&gt;<br>
&gt; Stas,<br>
&gt;<br>
&gt;<br>
&gt; Now, when we fully understand the patch, will you fix description of <br>
&gt; 98cbcb14d?</p>
<p dir="ltr">Yes, I&quot;sent the update to Konstantin already.<br>
Thanks a lot again.</p>
<p dir="ltr">The following does not seem correct:<br>
&gt;<br>
&gt;<br>
&gt; &nbsp;&gt;&nbsp;&nbsp;&nbsp; IOW, any signal, arrived to the process, which does page fault <br>
&gt; handling on fuse<br>
&gt; &nbsp;&gt;&nbsp;&nbsp;&nbsp; file, _before_ request_wait_answer() is called, will lead to request<br>
&gt; &nbsp;&gt;&nbsp;&nbsp;&nbsp; interruption, producing SIGBUS error in page fault handler <br>
&gt; (filemap_fault).<br>
&gt;<br>
&gt;<br>
&gt; Thanks,<br>
&gt;<br>
&gt; Maxim<br>
&gt;<br>
&gt;<br>
&gt; On 10/17/2016 04:59 AM, Stanislav Kinsburskiy wrote:<br>
&gt;<br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt; 16.10.2016 05:21, Maxim Patlasov пишет:<br>
&gt; &gt;&gt; Stas,<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; On 10/14/2016 03:30 AM, Stanislav Kinsburskiy wrote:<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt; 14.10.2016 02:23, Maxim Patlasov пишет:<br>
&gt; &gt;&gt;&gt;&gt; Stas,<br>
&gt; &gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt; The series look fine, so:<br>
&gt; &gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt; Acked-by: Maxim Patlasov &lt;mpatlasov@virtuozzo.com&gt;<br>
&gt; &gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt; But, please, refine the description of the second patch. It must <br>
&gt; &gt;&gt;&gt;&gt; explain clearly why the patch fixes the problem:<br>
&gt; &gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt; block_sigs() blocks ordinary non-fatal signals as expected, but <br>
&gt; &gt;&gt;&gt;&gt; surprisingly SIGTRAP is special: it does not matter whether it <br>
&gt; &gt;&gt;&gt;&gt; comes before or after block_sigs(), the latter does not affect <br>
&gt; &gt;&gt;&gt;&gt; SIGTRAP at all! And in contrast, wait_event_killable() is immune to <br>
&gt; &gt;&gt;&gt;&gt; it -- only fatal sig can wake it up.<br>
&gt; &gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt; No, Maxim. You make a mistake here.<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; Yes, I agree.<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt; There is nothing special with SIGTRAP (although it's being sometimes <br>
&gt; &gt;&gt;&gt; sent via force_sig_info()).<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; OK.<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt; The problem is described as it is: block_sigs() doesn't (!) clear <br>
&gt; &gt;&gt;&gt; TIG_SIGPENDING flag. All it does is blocking future signals to arrive.<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; OK. But I disagree with your explanation why it doesn't clear the flag.<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt; Moreover, __set_task_blocked() call recalc_sigpending(), which check <br>
&gt; &gt;&gt;&gt; whether any of the signals to block is present in process pending <br>
&gt; &gt;&gt;&gt; mask, and if so - set (!) TIF_SIGPENDING on the task.<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; Only if the correspondent bit is NOT set in blocked-&gt;sig[]:<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; &gt; case 1: ready&nbsp; = signal-&gt;sig[0] &amp;~ blocked-&gt;sig[0];<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; That's definitely not the case for block_sigs() who set all bits in <br>
&gt; &gt;&gt; blocked-&gt;sig[] except sigmask(SIGKILL). So, in our case <br>
&gt; &gt;&gt; recalc_sigpending() can only clear TIG_SIGPENDING flag, not set it.<br>
&gt; &gt;&gt;<br>
&gt; &gt; Agreed.<br>
&gt; &gt;<br>
&gt; &gt;&gt;&gt; IOW, any pending signal remains pending after call to blocks_sigs().<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; No. Conversely: all non-fatal signals does NOT remain pending after <br>
&gt; &gt;&gt; call to blocks_sigs(). You can ascertain it yourself by debugging how <br>
&gt; &gt;&gt; block_sigs() react on &quot;kill -USR1&quot;.<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt;&gt; And that's is the root of the issue (as it described in the patch <br>
&gt; &gt;&gt;&gt; comment).<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; No. The root of the issue is in ptrace(2) calling ptrace_request(), <br>
&gt; &gt;&gt; calling task_set_jobctl_pending(), setting JOBCTL_TRAP_STOP in <br>
&gt; &gt;&gt; task-&gt;jobctl. So, when fuse calls block_sigs(), it eventually calls <br>
&gt; &gt;&gt; recalc_sigpending() which calls recalc_sigpending_tsk() which looks <br>
&gt; &gt;&gt; like this:<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; &gt;&nbsp;&nbsp;&nbsp; if ((t-&gt;jobctl &amp; JOBCTL_PENDING_MASK) ||<br>
&gt; &gt;&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PENDING(&amp;t-&gt;pending, &amp;t-&gt;blocked) ||<br>
&gt; &gt;&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PENDING(&amp;t-&gt;signal-&gt;shared_pending, &amp;t-&gt;blocked)) {<br>
&gt; &gt;&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set_tsk_thread_flag(t, TIF_SIGPENDING);<br>
&gt; &gt;&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1;<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; but as we know ptrace(2) already set JOBCTL_TRAP_STOP in task-&gt;jobctl:<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; &gt; #define JOBCTL_TRAP_MASK&nbsp;&nbsp;&nbsp; (JOBCTL_TRAP_STOP | JOBCTL_TRAP_NOTIFY)<br>
&gt; &gt;&gt; &gt; #define JOBCTL_PENDING_MASK&nbsp;&nbsp;&nbsp; (JOBCTL_STOP_PENDING | <br>
&gt; &gt;&gt; JOBCTL_TRAP_MASK)<br>
&gt; &gt;&gt;<br>
&gt; &gt;<br>
&gt; &gt; Nice catch, thanks.<br>
&gt; &gt;<br>
&gt; &gt;&gt; To sum it up, the patch from Al Viro that you backported doesn't <br>
&gt; &gt;&gt; change fuse behavior w.r.t signals, but it nicely replace <br>
&gt; &gt;&gt; signal_pending with fatal_signal_pending, and the latter solves our <br>
&gt; &gt;&gt; case because it checks for SIGKILL explicitly:<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; &gt; static inline int fatal_signal_pending(struct task_struct *p)<br>
&gt; &gt;&gt; &gt; {<br>
&gt; &gt;&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp; return signal_pending(p) &amp;&amp; __fatal_signal_pending(p);<br>
&gt; &gt;&gt; &gt; }<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; &gt; static inline int __fatal_signal_pending(struct task_struct *p)<br>
&gt; &gt;&gt; &gt; {<br>
&gt; &gt;&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp; return unlikely(sigismember(&amp;p-&gt;pending.signal, SIGKILL));<br>
&gt; &gt;&gt; &gt; }<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; Thanks,<br>
&gt; &gt;&gt; Maxim<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt; Thanks,<br>
&gt; &gt;&gt;&gt;&gt; Maxim<br>
&gt; &gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt; On 10/13/2016 03:03 AM, Stanislav Kinsburskiy wrote:<br>
&gt; &gt;&gt;&gt;&gt;&gt; This patch fixes wrong SIGBUS result in page fault handler for <br>
&gt; &gt;&gt;&gt;&gt;&gt; fuse file, when<br>
&gt; &gt;&gt;&gt;&gt;&gt; process received a signal.<br>
&gt; &gt;&gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt;&gt; https://jira.sw.ru/browse/PSBM-53581<br>
&gt; &gt;&gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt;&gt; ---<br>
&gt; &gt;&gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt;&gt; Stanislav Kinsburskiy (2):<br>
&gt; &gt;&gt;&gt;&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new helper: wait_event_killable_exclusive()<br>
&gt; &gt;&gt;&gt;&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fuse: handle only fatal signals while waiting request answer<br>
&gt; &gt;&gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt;&gt;&nbsp;&nbsp; fs/fuse/dev.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp; 42 <br>
&gt; &gt;&gt;&gt;&gt;&gt; &#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;--------------------------<br>
&gt; &gt;&gt;&gt;&gt;&gt;&nbsp;&nbsp; include/linux/wait.h |&nbsp;&nbsp; 26 &#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;<br>
&gt; &gt;&gt;&gt;&gt;&gt;&nbsp;&nbsp; 2 files changed, 42 insertions(&#43;), 26 deletions(-)<br>
&gt; &gt;&gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt;&gt; -- <br>
&gt; &gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;<br>
&gt; &gt;&gt;<br>
&gt; &gt;<br>
&gt;</p>
</body>
</html>