From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.0 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B5ACAC2BA80 for ; Mon, 6 Apr 2020 21:49:44 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 7C6BA2063A for ; Mon, 6 Apr 2020 21:49:44 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="IlLvIB3M" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 7C6BA2063A Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 15A2C8E0005; Mon, 6 Apr 2020 17:49:44 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 131088E0001; Mon, 6 Apr 2020 17:49:44 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 047568E0005; Mon, 6 Apr 2020 17:49:44 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0227.hostedemail.com [216.40.44.227]) by kanga.kvack.org (Postfix) with ESMTP id E0DB08E0001 for ; Mon, 6 Apr 2020 17:49:43 -0400 (EDT) Received: from smtpin01.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay01.hostedemail.com (Postfix) with ESMTP id A25B8180AD807 for ; Mon, 6 Apr 2020 21:49:43 +0000 (UTC) X-FDA: 76678772646.01.drum91_71fbdc3d95823 X-HE-Tag: drum91_71fbdc3d95823 X-Filterd-Recvd-Size: 9248 Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) by imf24.hostedemail.com (Postfix) with ESMTP for ; Mon, 6 Apr 2020 21:49:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1586209782; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=u5SWgl8zk71PwxPlmcjKsJSCMep7OVdR5coFmBqc/+Y=; b=IlLvIB3MZGs0UPzkNLhEUr0Iwu6xUMr6SOsxA+Timk9m3pfzuch3wYqMML/X3JAN0nSODl sBtaoYR8Lf+e3LAcmOfXWxPqdZAuJT4HkTW/+b90YGNxcnQ1VOr5RJANMXyKJuWpTID8BG cDcREKMqUgv5EyNotH/eaUfqdziF5uQ= Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-170-i1vpiZ2MNCa5ndJtJcsaEA-1; Mon, 06 Apr 2020 17:49:40 -0400 X-MC-Unique: i1vpiZ2MNCa5ndJtJcsaEA-1 Received: by mail-wm1-f72.google.com with SMTP id 2so47954wmf.1 for ; Mon, 06 Apr 2020 14:49:40 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to; bh=kIXDxUjS2HMskB+mPSwuv3yFtOM4CbvksE2h37nZI78=; b=M3Y2Hic+lRHjjV71QwJ71O3qlj1lwy7/hq0pOgmDptLDQlAKa3GKlV2BHE6SWDV6LL P2IXRxcNFRD81imw++aAQ1NxWa8lnELYK/pE/HC02b52e8p3RVg2TtttcVpTOnpgOIOM M3uZioBR67tE4aVt6xeuaG90KdRLJyJDsWWasl/vw/TTvc8/VM/tImp2GPKvOugqL5hc GXeuxFSNtVEV7yJjBn6ThhN9yJBpcTsXMwiSLDATfMusebkk6PTxPP9fBBZgXjDnnx8Z P/EzjtPW2cQRXtWUc69VgZUK4bVxhFTl1A7bc+ZTmw3lEf40DfF7AyfSnSl1pXglPqBj jXVw== X-Gm-Message-State: AGi0PuaFE3AQAWQdmhm3ctMXtQJ3EuuQE+Gr5kMhPYqbCjv6NezT1Vul kF4t6veB7UL6aNBdL8flY+DEgbHBqCCNfUcupE8kVqpkd32oph6YZv4t/UFnx30Ty3cKx71Eehx NdTAjyKPN3Kg= X-Received: by 2002:a5d:5230:: with SMTP id i16mr1340778wra.15.1586209779342; Mon, 06 Apr 2020 14:49:39 -0700 (PDT) X-Google-Smtp-Source: APiQypJNgJ7eiNVOi5WqhYdhc42FjdejCWO6/Y8fkLNs2CGrGBsCWnbC9H2zd2UGSvXrNhDXRVbxFQ== X-Received: by 2002:a5d:5230:: with SMTP id i16mr1340765wra.15.1586209779132; Mon, 06 Apr 2020 14:49:39 -0700 (PDT) Received: from redhat.com (bzq-79-176-51-222.red.bezeqint.net. [79.176.51.222]) by smtp.gmail.com with ESMTPSA id n6sm1057944wmc.28.2020.04.06.14.49.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Apr 2020 14:49:38 -0700 (PDT) Date: Mon, 6 Apr 2020 17:49:34 -0400 From: "Michael S. Tsirkin" To: Christoph Hellwig Cc: Linus Torvalds , Andrew Morton , Al Viro , Felix Kuehling , Alex Deucher , Zhenyu Wang , Zhi Wang , Felipe Balbi , Jason Wang , Jens Axboe , linux-kernel@vger.kernel.org, amd-gfx@lists.freedesktop.org, intel-gvt-dev@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, linux-usb@vger.kernel.org, virtualization@lists.linux-foundation.org, linux-fsdevel@vger.kernel.org, io-uring@vger.kernel.org, linux-mm@kvack.org Subject: Re: [PATCH 6/6] kernel: set USER_DS in kthread_use_mm Message-ID: <20200406174917-mutt-send-email-mst@kernel.org> References: <20200404094101.672954-1-hch@lst.de> <20200404094101.672954-7-hch@lst.de> MIME-Version: 1.0 In-Reply-To: <20200404094101.672954-7-hch@lst.de> X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: quoted-printable Content-Disposition: inline X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: On Sat, Apr 04, 2020 at 11:41:01AM +0200, Christoph Hellwig wrote: > Some architectures like arm64 and s390 require USER_DS to be set for > kernel threads to access user address space, which is the whole purpose > of kthread_use_mm, but other like x86 don't. That has lead to a huge > mess where some callers are fixed up once they are tested on said > architectures, while others linger around and yet other like io_uring > try to do "clever" optimizations for what usually is just a trivial > asignment to a member in the thread_struct for most architectures. >=20 > Make kthread_use_mm set USER_DS, and kthread_unuse_mm restore to the > previous value instead. >=20 > Signed-off-by: Christoph Hellwig I'm ok with vhost bits: Acked-by: Michael S. Tsirkin > --- > drivers/usb/gadget/function/f_fs.c | 4 ---- > drivers/vhost/vhost.c | 3 --- > fs/io-wq.c | 8 ++------ > fs/io_uring.c | 4 ---- > kernel/kthread.c | 6 ++++++ > 5 files changed, 8 insertions(+), 17 deletions(-) >=20 > diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/func= tion/f_fs.c > index d9e48bd7c692..a1198f4c527c 100644 > --- a/drivers/usb/gadget/function/f_fs.c > +++ b/drivers/usb/gadget/function/f_fs.c > @@ -824,13 +824,9 @@ static void ffs_user_copy_worker(struct work_struct = *work) > =09bool kiocb_has_eventfd =3D io_data->kiocb->ki_flags & IOCB_EVENTFD; > =20 > =09if (io_data->read && ret > 0) { > -=09=09mm_segment_t oldfs =3D get_fs(); > - > -=09=09set_fs(USER_DS); > =09=09kthread_use_mm(io_data->mm); > =09=09ret =3D ffs_copy_to_iter(io_data->buf, ret, &io_data->data); > =09=09kthread_unuse_mm(io_data->mm); > -=09=09set_fs(oldfs); > =09} > =20 > =09io_data->kiocb->ki_complete(io_data->kiocb, ret, ret); > diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c > index 1787d426a956..b5229ae01d3b 100644 > --- a/drivers/vhost/vhost.c > +++ b/drivers/vhost/vhost.c > @@ -333,9 +333,7 @@ static int vhost_worker(void *data) > =09struct vhost_dev *dev =3D data; > =09struct vhost_work *work, *work_next; > =09struct llist_node *node; > -=09mm_segment_t oldfs =3D get_fs(); > =20 > -=09set_fs(USER_DS); > =09kthread_use_mm(dev->mm); > =20 > =09for (;;) { > @@ -365,7 +363,6 @@ static int vhost_worker(void *data) > =09=09} > =09} > =09kthread_unuse_mm(dev->mm); > -=09set_fs(oldfs); > =09return 0; > } > =20 > diff --git a/fs/io-wq.c b/fs/io-wq.c > index 83c2868eff2a..75cc2f31816d 100644 > --- a/fs/io-wq.c > +++ b/fs/io-wq.c > @@ -168,7 +168,6 @@ static bool __io_worker_unuse(struct io_wqe *wqe, str= uct io_worker *worker) > =09=09=09dropped_lock =3D true; > =09=09} > =09=09__set_current_state(TASK_RUNNING); > -=09=09set_fs(KERNEL_DS); > =09=09kthread_unuse_mm(worker->mm); > =09=09mmput(worker->mm); > =09=09worker->mm =3D NULL; > @@ -420,14 +419,11 @@ static void io_wq_switch_mm(struct io_worker *worke= r, struct io_wq_work *work) > =09=09mmput(worker->mm); > =09=09worker->mm =3D NULL; > =09} > -=09if (!work->mm) { > -=09=09set_fs(KERNEL_DS); > +=09if (!work->mm) > =09=09return; > -=09} > + > =09if (mmget_not_zero(work->mm)) { > =09=09kthread_use_mm(work->mm); > -=09=09if (!worker->mm) > -=09=09=09set_fs(USER_DS); > =09=09worker->mm =3D work->mm; > =09=09/* hang on to this mm */ > =09=09work->mm =3D NULL; > diff --git a/fs/io_uring.c b/fs/io_uring.c > index 367406381044..c332a34e8b34 100644 > --- a/fs/io_uring.c > +++ b/fs/io_uring.c > @@ -5871,15 +5871,12 @@ static int io_sq_thread(void *data) > =09struct io_ring_ctx *ctx =3D data; > =09struct mm_struct *cur_mm =3D NULL; > =09const struct cred *old_cred; > -=09mm_segment_t old_fs; > =09DEFINE_WAIT(wait); > =09unsigned long timeout; > =09int ret =3D 0; > =20 > =09complete(&ctx->completions[1]); > =20 > -=09old_fs =3D get_fs(); > -=09set_fs(USER_DS); > =09old_cred =3D override_creds(ctx->creds); > =20 > =09timeout =3D jiffies + ctx->sq_thread_idle; > @@ -5985,7 +5982,6 @@ static int io_sq_thread(void *data) > =09if (current->task_works) > =09=09task_work_run(); > =20 > -=09set_fs(old_fs); > =09if (cur_mm) { > =09=09kthread_unuse_mm(cur_mm); > =09=09mmput(cur_mm); > diff --git a/kernel/kthread.c b/kernel/kthread.c > index 316db17f6b4f..9e27d01b6d78 100644 > --- a/kernel/kthread.c > +++ b/kernel/kthread.c > @@ -52,6 +52,7 @@ struct kthread { > =09unsigned long flags; > =09unsigned int cpu; > =09void *data; > +=09mm_segment_t oldfs; > =09struct completion parked; > =09struct completion exited; > #ifdef CONFIG_BLK_CGROUP > @@ -1235,6 +1236,9 @@ void kthread_use_mm(struct mm_struct *mm) > =20 > =09if (active_mm !=3D mm) > =09=09mmdrop(active_mm); > + > +=09to_kthread(tsk)->oldfs =3D get_fs(); > +=09set_fs(USER_DS); > } > EXPORT_SYMBOL_GPL(kthread_use_mm); > =20 > @@ -1249,6 +1253,8 @@ void kthread_unuse_mm(struct mm_struct *mm) > =09WARN_ON_ONCE(!(tsk->flags & PF_KTHREAD)); > =09WARN_ON_ONCE(!tsk->mm); > =20 > +=09set_fs(to_kthread(tsk)->oldfs); > + > =09task_lock(tsk); > =09sync_mm_rss(mm); > =09tsk->mm =3D NULL; > --=20 > 2.25.1