Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp3333287imu; Wed, 7 Nov 2018 08:43:06 -0800 (PST) X-Google-Smtp-Source: AJdET5c0Rsz6+VY1/l2ckklikClXb0ACKcdyuKazR/5r573TpuXpjjw+vmVCN30EX//fmzo9uwDG X-Received: by 2002:a63:f652:: with SMTP id u18-v6mr777013pgj.267.1541608986648; Wed, 07 Nov 2018 08:43:06 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1541608986; cv=none; d=google.com; s=arc-20160816; b=rSuC3BxHxitLVNZbBp1rB52CQcDlrBiuQu2J8dsJPhj5HyfL/aBhTiE/I36Yb1IdFR TuaKfXusq2+vS063jGudbaZP6+xzgNafnmNYeGzzMZkSd/RE4qp813lALCqkFxz79Rdg B+J48mQNrBvOj2HDBxwwwp6/KgwReE9zQO15Fu01njRGAxhzbRkkHVbzxSSeROxTVoCE H2J5B+VXvoB0LZkI4X+kVXSbRjI3lN12jpQvLQzvRYJs23iCrxE2sbhe70VAzN+qZlDC sNBLQhnYJPWKQVVXBhgMF6asb32RCOsAC/88/OkZ1C7JQg/+g82Wmj9lE9+rYROlhYSo 9JVQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject; bh=cL0VAznCkhS2uSDl8f8oNf3aHI3zXUJJZTBTZJZvY7o=; b=QTbMgswq5khMKsdcbST6gXcHDXIYZwFrWADC8amyxEGw6gceeyi4INC2ffzDRAdlCE /eIhHnXnbuO5n8v4Ojkas0NuGJZ0qgWU9v5o3JBh1CUyzYbVm9XISo8lko0X6tZfRG9u 0NsxcLeNZsN1jSQ8WdaC9kc4+ENrefnrBAh5OviGIjk94MZreKWrpX8DLY8Xgh58tomp VV3t9Qbygot+DhiTXPkqo11fFt4UDnVTxSq36h0bDZqN5ZzJz5mHqq16zGPa9pkevrBO Jn//frfk8dBr+qMNfkbl6YvvsrQ7FylCppE1EpB843rrEBIwbRWnRleaO/gFXBhJlikB UQAQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=virtuozzo.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id w15-v6si1201987plk.269.2018.11.07.08.42.50; Wed, 07 Nov 2018 08:43:06 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=virtuozzo.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727977AbeKHCMD (ORCPT + 99 others); Wed, 7 Nov 2018 21:12:03 -0500 Received: from relay.sw.ru ([185.231.240.75]:36008 "EHLO relay.sw.ru" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727312AbeKHCMD (ORCPT ); Wed, 7 Nov 2018 21:12:03 -0500 Received: from [172.16.25.169] by relay.sw.ru with esmtp (Exim 4.90_1) (envelope-from ) id 1gKQsu-0003W5-6r; Wed, 07 Nov 2018 19:40:52 +0300 Subject: Re: [PATCH 6/6] fuse: Verify userspace asks to requeue interrupt that we really sent To: Miklos Szeredi Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org References: <154149586524.17764.5252013294539109287.stgit@localhost.localdomain> <154149666097.17764.12092615786683141764.stgit@localhost.localdomain> <6f27b5a5-0092-b23f-b28e-341ae093a241@virtuozzo.com> From: Kirill Tkhai Message-ID: Date: Wed, 7 Nov 2018 19:40:51 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.3.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 07.11.2018 17:45, Miklos Szeredi wrote: > On Wed, Nov 7, 2018 at 3:25 PM, Kirill Tkhai wrote: >> On 07.11.2018 16:55, Miklos Szeredi wrote: >>> On Tue, Nov 6, 2018 at 10:31 AM, Kirill Tkhai wrote: >>>> When queue_interrupt() is called from fuse_dev_do_write(), >>>> it came from userspace directly. Userspace may pass any >>>> request id, even the request's we have not interrupted >>>> (or even background's request). This patch adds sanity >>>> check to make kernel safe against that. >>> >>> Okay, I understand this far. >>> >>>> The problem is real interrupt may be queued and requeued >>>> by two tasks on two cpus. This case, the requeuer has not >>>> guarantees it sees FR_INTERRUPTED bit on its cpu (since >>>> we know nothing about the way userspace manages requests >>>> between its threads and whether it uses smp barriers). >>> >>> This sounds like BS. There's an explicit smp_mb__after_atomic() >>> after the set_bit(FR_INTERRUPTED,...). Which means FR_INTERRUPTED is >>> going to be visible on all CPU's after this, no need to fool around >>> with setting FR_INTERRUPTED again, etc... >> >> Hm, but how does it make the bit visible on all CPUS? >> >> The problem is that smp_mb_xxx() barrier on a cpu has a sense >> only in pair with the appropriate barrier on the second cpu. >> There is no guarantee for visibility, if second cpu does not >> have a barrier: >> >> CPU 1 CPU2 CPU3 CPU4 CPU5 >> >> set FR_INTERRUPTED set FR_SENT >> >> test FR_SENT (== 0) test FR_INTERRUPTED (==1) >> list_add[&req->intr_entry] read[req by intr_entry] >> >> goto userspace >> write in userspace buffer >> read from userspace buffer >> write to userspace buffer >> read from userspace buffer >> enter kernel >> >> test FR_INTERRUPTED <- Not visible >> >> The sequence: >> >> set_bit(FR_INTERRUPTED, ...) >> smp_mb__after_atomic(); >> test_bit(FR_SENT, &req->flags) >> >> just guarantees the expected order on CPU2, which uses , >> but CPU5 does not have any guarantees. > > What you are missing is that there are other things that synchronize > memory access besides the memory barrier. In your example the > ordering will be guaranteed by the fiq->waitq.lock in > queue_interrupt() on CPU2: the set_bit() cannot move past the one-way > barrier provided by the spin_unlock(). I thought, RELEASE is related to memory operations, which is made on the same cpu. Strange thing, but the below memory-model test says, it's not true. Ok, I'll change the patch, thanks for pointing this. ===== tools/memory-model/litmus-tests/test.litmus ===== C SB+test {} P0(atomic_t *flags) { int r0; atomic_add(1, flags); smp_mb__after_atomic(); r0 = (atomic_read(flags) & 2); } P1(atomic_t *flags, int *linked) { int r0; atomic_add(2, flags); smp_mb__after_atomic(); r0 = (atomic_read(flags) & 1); if (r0) { spin_lock(mylock); *linked = 1; spin_unlock(mylock); } } P2(atomic_t *flags, int *linked) { int r0; spin_lock(mylock); if (*linked) { r0 = atomic_read(flags); } else r0 = 0; spin_unlock(mylock); } exists (0:r0=0 /\ 1:r0=1 /\ 2:r0=2) =================================== kirill@pro:~/linux-next/tools/memory-model$ ~/.opam/system/bin/herd7 -conf linux-kernel.cfg litmus-tests/test.litmus Test SB+test Allowed States 5 0:r0=0; 1:r0=1; 2:r0=0; 0:r0=0; 1:r0=1; 2:r0=3; 0:r0=2; 1:r0=0; 2:r0=0; 0:r0=2; 1:r0=1; 2:r0=0; 0:r0=2; 1:r0=1; 2:r0=3; No Witnesses Positive: 0 Negative: 7 Condition exists (0:r0=0 /\ 1:r0=1 /\ 2:r0=2) Observation SB+test Never 0 7 Time SB+test 0.09 Hash=0213fd54f80c511af2326e1bd120a96b