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 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1C70BC3DA7F for ; Wed, 31 Jul 2024 03:10:16 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 5EC646B0082; Tue, 30 Jul 2024 23:10:15 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 59AB56B0083; Tue, 30 Jul 2024 23:10:15 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 462816B0085; Tue, 30 Jul 2024 23:10:15 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id 273DF6B0082 for ; Tue, 30 Jul 2024 23:10:15 -0400 (EDT) Received: from smtpin10.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id BE352A2A9F for ; Wed, 31 Jul 2024 03:10:14 +0000 (UTC) X-FDA: 82398569148.10.48ED008 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by imf06.hostedemail.com (Postfix) with ESMTP id B9ECD18000F for ; Wed, 31 Jul 2024 03:10:11 +0000 (UTC) Authentication-Results: imf06.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=CNfmkiYt; spf=pass (imf06.hostedemail.com: domain of jasowang@redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=jasowang@redhat.com; dmarc=pass (policy=none) header.from=redhat.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1722395338; h=from:from:sender: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:dkim-signature; bh=nSo48UaFOj/kTMd8oGeDzJEPDqXHyMwals+M5vQ2bEM=; b=6+NY1GdeNA+570EuA/4L4WKeO4UdIWPweX02nKxu1tpbdNU14ur/d0YVRnt41iEjRqqH3W FYN2YPrPnUtE75fBHzDaPr6toJPjS2Iknj4alpYpmyKEQXA05BoDUXJzZhuIkTpbcY922m l3V99Cl8X7vRTWJBFQYtS4zUf++vDOI= ARC-Authentication-Results: i=1; imf06.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=CNfmkiYt; spf=pass (imf06.hostedemail.com: domain of jasowang@redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=jasowang@redhat.com; dmarc=pass (policy=none) header.from=redhat.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1722395338; a=rsa-sha256; cv=none; b=Qhxibr/dOiZcb9sNM0c7QSgZL93/83OLDaIrcLYxO4ZiDzZdkGRcD3iv6nDQTJ8SFdXOpR 7XEOPrccqNucp5Vxt5dSGcAPk/9v6PSkD/ARuii5s3VYccfKqWvEB9SIL8s2Nhg3D9GVXe 1iDEvNXW1LHxgpxnWxisGQZmS3JHsd0= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1722395410; 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=nSo48UaFOj/kTMd8oGeDzJEPDqXHyMwals+M5vQ2bEM=; b=CNfmkiYtfyh6ubyhSvfSthgKvNDfgLmXidlC3t8WsjzQW6HbLF3RMYe6cnM+26V6Cs6CrD JzDLHqokqeXfaMjTIlVLHFcU7NI6sgumubb0QgvnBVIOxMk9dPw2Ubpui3F7rp5iXp9cpF StgvkJll1LifuB7KNgTok2IVMtbLwcE= Received: from mail-pf1-f200.google.com (mail-pf1-f200.google.com [209.85.210.200]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-557-BO-0TxZAPdOT0FPqskg4Dg-1; Tue, 30 Jul 2024 23:10:07 -0400 X-MC-Unique: BO-0TxZAPdOT0FPqskg4Dg-1 Received: by mail-pf1-f200.google.com with SMTP id d2e1a72fcca58-70d1469f5e1so4296464b3a.3 for ; Tue, 30 Jul 2024 20:10:06 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1722395406; x=1723000206; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=nSo48UaFOj/kTMd8oGeDzJEPDqXHyMwals+M5vQ2bEM=; b=OW7/kNxV0X0cTkdL6cCsNZxHIjlfl/rqsdLByENB8/yT7phbSshr9F8KqV12k/+nXu 7E46qLVhuLlEke8D6PCop3NFbokIK7bPFI6EFvgHztdub+/r+tlGNOUq+XZd16iWXTcD xolPkWsY85JkbJTtLOrclOkS0N5Da6T7x4A9Ly+STcwbPyKC/yNz+PSk/sFNGdd7I9HR e/Gw8kesJNMnkP7tjlpzY8fbSWfITGVU4twkeDu/ywykrkooqH9Lcew5IVSTBtuiX072 agwCUsxn2B3ADH1xVHEaQF1XWt13mepcOwaG2NK6mq+I9bP9cUplB+kjn8gZb6bdoGOT qW8w== X-Forwarded-Encrypted: i=1; AJvYcCV2uVB5zYQR3NGMamIz5brUACq9kSi7BW9ajXQfuygqx5GNO47CDUVIk0ejq04/7eGwUeLk+Q4OUdH+AEePYItyPwg= X-Gm-Message-State: AOJu0YzbDOhYUx6Nnw4UwZ0R3M9SclL7vxfphIH0vem0OBSpIPh0KHrf v2UWaqRSsEn5g93ATEoyOTBV638oDKI+N+C42dCEk0ICySJQNCie+87YCWWG1q+GzMd26MIKDW9 EXcyIMxrwXixpTDglx5sK8W4muNa++nJmaH+jK1/oQACjCVubnwDQOLnAw+WIGIQIdJ5w5MXPOJ tq4Iutd1p/3NcWDB6D476Lkx0= X-Received: by 2002:a05:6a20:6a10:b0:1c4:7dbc:d1df with SMTP id adf61e73a8af0-1c4a1304e68mr12894351637.23.1722395405932; Tue, 30 Jul 2024 20:10:05 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEwoxIVmHqmhZziJyujWvdgIDRJa8pIwCmen71oTQovcyKvcve4LM+EBaMx2x12gJB9N4v31nmZK6Lc0waiTn4= X-Received: by 2002:a05:6a20:6a10:b0:1c4:7dbc:d1df with SMTP id adf61e73a8af0-1c4a1304e68mr12894336637.23.1722395405471; Tue, 30 Jul 2024 20:10:05 -0700 (PDT) MIME-Version: 1.0 References: <20240731000155.109583-1-21cnbao@gmail.com> <20240731000155.109583-2-21cnbao@gmail.com> In-Reply-To: <20240731000155.109583-2-21cnbao@gmail.com> From: Jason Wang Date: Wed, 31 Jul 2024 11:09:54 +0800 Message-ID: Subject: Re: [PATCH RFT v2 1/4] vpda: try to fix the potential crash due to misusing __GFP_NOFAIL To: Barry Song <21cnbao@gmail.com> Cc: akpm@linux-foundation.org, linux-mm@kvack.org, 42.hyeyoo@gmail.com, cl@linux.com, hailong.liu@oppo.com, hch@infradead.org, iamjoonsoo.kim@lge.com, lstoakes@gmail.com, mhocko@suse.com, penberg@kernel.org, rientjes@google.com, roman.gushchin@linux.dev, torvalds@linux-foundation.org, urezki@gmail.com, v-songbaohua@oppo.com, vbabka@suse.cz, virtualization@lists.linux.dev, "Michael S. Tsirkin" , Xuan Zhuo , =?UTF-8?Q?Eugenio_P=C3=A9rez?= , Maxime Coquelin X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Rspamd-Server: rspam06 X-Rspamd-Queue-Id: B9ECD18000F X-Stat-Signature: 4371so4rd7331daqcn7dde6t9dwdfaqo X-Rspam-User: X-HE-Tag: 1722395411-615799 X-HE-Meta: U2FsdGVkX1+CNaQ1u7ehVIuscMNcaAyTNiRFr2tk8sO9nmoMA5ztJhoIiXvvliH9XLCXiCBnwxVUihL9R5bK3vv2w/BKfzuhv3ywJErVY5VFoGL/iaFA4GJL05hjiMsdranuZ2zxqx7uVsdrR12+82Nuxggxj1GCVRmwsO0sg8uUxICqkTPDg7MZbOXoCtJNy3vUp4U9FLkYwqum9Jmg5JoErn2zQ257exI7zDdjJxNKwvCu6hUsCKxakfdHNGGl9sMmVo76pbMjy/lHRwg6vNlgr5JI4ANskUI3LsRZ7n2uJWR54H+B2aa1ZWHuQzXoX+yP723TVZmtZBQZN+cC+dGY5qB2aZ+I9+9RgF4tf9Z/KYkvIxAhYCaVyj0U5+2FY9XM0yDnTuGrXPAsFcB1xOy6rOFxITValbUt2AZ7fz2gUIRWkWqBZO1Ujx+0o+fc1qkAfjN+PE9udPZ1QlZ9rGlrkUi90WDh1a/mocRlLBgTuqWBN7Rv/j2mVsLdjUBHLHpMy75YrBhAQLq7jKNpx3ZQ1GPXdPKQ+3USPuAwFZxmOD7JaCL81/6sJQDglqG2gvE6xMnoBwQ8rG7Wg9bp8uNtzCZAAa0FQ0wQdR5nebc812SK6k3iAU+8BP+76XgglULUVe8pD1LcWJXbm+2F/qvUf8lngSGOlKpMFdxhoQbkWEFqPAXjvMHOFJf+Tu8zTliguKrfAWifBPLUvWeWQj1/yRylADKymwJQd25I23nkEG/tDu2V+0pWiZpUqE3x9ZIJEJ/q4cj5/xIDugTZvkAQCJfdYTBbM3OPZQCQIYy+syER2mBVh7Wd8cR3TvSxABlY/5vCy+OR5NmxJhGz0PXGNWh2AVl4d1cytSErVv14MSPpWABV4z+PRp45BSuO/GgOmNLltASZMCpOJq/2g2iYAMhdo+fELFHAspkT9Ls/+QmZ3hKBzJVVASJDXBB8ryl9efhaSJrEHNRbPcL Fe+HVHtu xmnutm6aBtTTA0T7xaOeeWy9yrOS4s0Uw95ZbfRX0Dq23Z3cIzejA775DKgFO3PU5Xs1Q4qGudMS8HWTGcgEuyufgXoO1aR42GVOHs/gH50CCxFh+1NyUCk75N+mEbTuLnBpLTcwP9oHrydJWHR7iHuCDQuzzcO+QAyx1kqPSEo8RTmm90JybIA1TccQ9e6Tff3Bpcu+emqS3sfaCCBnLF/aRjzUtda/7OAsJV7K+kP6Y3H/rra8fgk1rDoc0Hq1ghGrNl+MPoG/28E6csf6PrPazs2DGR9SnmIn2mpdmgfK9h5p7ltC4XRDA1w/lgs/jTfRuD5Nusgl5cBBVlPma+xJsTXV4q/y4tyUmygso2u1AczqRsRqDMoA3npwWQE7mb/NVDyZ3FrMKyd90i3I/BEhU3Q7JuJMHSEDSKcswfAocXzINrKm2M0sPU0qP0Tu2nCo6RbaIdF03mDfaTJdOleKF4XCWr/Va+5YD6h9kgobFrFIsPk0j4/iDSBdAvytmKwsaK5hcls/AJiy1JDuPBGdPj9HX2sFeo5S0VDl4KS2/IeY/IcMF4DCsygnOxVmFurG0jeTWwqG+is+C7SIo+jIA2wUZD0ex6r3xIUf1gbp29Yq/sILEf3TDtw== 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: List-Subscribe: List-Unsubscribe: On Wed, Jul 31, 2024 at 8:03=E2=80=AFAM Barry Song <21cnbao@gmail.com> wrot= e: > > From: Barry Song > > mm doesn't support non-blockable __GFP_NOFAIL allocation. Because > __GFP_NOFAIL without direct reclamation may just result in a busy > loop within non-sleepable contexts. > > static inline struct page * > __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order, > struct alloc_context *ac) > { > ... > /* > * Make sure that __GFP_NOFAIL request doesn't leak out and make = sure > * we always retry > */ > if (gfp_mask & __GFP_NOFAIL) { > /* > * All existing users of the __GFP_NOFAIL are blockable, = so warn > * of any new users that actually require GFP_NOWAIT > */ > if (WARN_ON_ONCE_GFP(!can_direct_reclaim, gfp_mask)) > goto fail; > ... > } > ... > fail: > warn_alloc(gfp_mask, ac->nodemask, > "page allocation failure: order:%u", order); > got_pg: > return page; > } > > Let's move the memory allocation out of the atomic context and use > the normal sleepable context to get pages. > > [RFT]: This has only been compile-tested; I'd prefer if the VDPA maintain= ers > handles it. > > Cc: "Michael S. Tsirkin" > Cc: Jason Wang > Cc: Xuan Zhuo > Cc: "Eugenio P=C3=A9rez" > Cc: Maxime Coquelin > Signed-off-by: Barry Song > --- > drivers/vdpa/vdpa_user/iova_domain.c | 31 +++++++++++++++++++++++----- > drivers/vdpa/vdpa_user/iova_domain.h | 5 ++++- > drivers/vdpa/vdpa_user/vduse_dev.c | 4 +++- > 3 files changed, 33 insertions(+), 7 deletions(-) > > diff --git a/drivers/vdpa/vdpa_user/iova_domain.c b/drivers/vdpa/vdpa_use= r/iova_domain.c > index 791d38d6284c..9318f059a8b5 100644 > --- a/drivers/vdpa/vdpa_user/iova_domain.c > +++ b/drivers/vdpa/vdpa_user/iova_domain.c > @@ -283,7 +283,23 @@ int vduse_domain_add_user_bounce_pages(struct vduse_= iova_domain *domain, > return ret; > } > > -void vduse_domain_remove_user_bounce_pages(struct vduse_iova_domain *dom= ain) > +struct page **vduse_domain_alloc_pages_to_remove_bounce(struct vduse_iov= a_domain *domain) > +{ > + struct page **pages; > + unsigned long count, i; > + > + if (!domain->user_bounce_pages) > + return NULL; > + > + count =3D domain->bounce_size >> PAGE_SHIFT; > + pages =3D kmalloc_array(count, sizeof(*pages), GFP_KERNEL | __GFP= _NOFAIL); > + for (i =3D 0; i < count; i++) > + pages[i] =3D alloc_page(GFP_KERNEL | __GFP_NOFAIL); > + > + return pages; > +} > + > +void vduse_domain_remove_user_bounce_pages(struct vduse_iova_domain *dom= ain, struct page **pages) > { > struct vduse_bounce_map *map; > unsigned long i, count; > @@ -294,15 +310,16 @@ void vduse_domain_remove_user_bounce_pages(struct v= duse_iova_domain *domain) > > count =3D domain->bounce_size >> PAGE_SHIFT; > for (i =3D 0; i < count; i++) { > - struct page *page =3D NULL; > + struct page *page =3D pages[i]; > > map =3D &domain->bounce_maps[i]; > - if (WARN_ON(!map->bounce_page)) > + if (WARN_ON(!map->bounce_page)) { > + put_page(page); > continue; > + } > > /* Copy user page to kernel page if it's in use */ > if (map->orig_phys !=3D INVALID_PHYS_ADDR) { > - page =3D alloc_page(GFP_ATOMIC | __GFP_NOFAIL); > memcpy_from_page(page_address(page), > map->bounce_page, 0, PAGE_SIZE); > } > @@ -310,6 +327,7 @@ void vduse_domain_remove_user_bounce_pages(struct vdu= se_iova_domain *domain) > map->bounce_page =3D page; > } > domain->user_bounce_pages =3D false; > + kfree(pages); > out: > write_unlock(&domain->bounce_lock); > } > @@ -543,10 +561,13 @@ static int vduse_domain_mmap(struct file *file, str= uct vm_area_struct *vma) > static int vduse_domain_release(struct inode *inode, struct file *file) > { > struct vduse_iova_domain *domain =3D file->private_data; > + struct page **pages; > + > + pages =3D vduse_domain_alloc_pages_to_remove_bounce(domain); > > spin_lock(&domain->iotlb_lock); > vduse_iotlb_del_range(domain, 0, ULLONG_MAX); > - vduse_domain_remove_user_bounce_pages(domain); > + vduse_domain_remove_user_bounce_pages(domain, pages); > vduse_domain_free_kernel_bounce_pages(domain); > spin_unlock(&domain->iotlb_lock); > put_iova_domain(&domain->stream_iovad); > diff --git a/drivers/vdpa/vdpa_user/iova_domain.h b/drivers/vdpa/vdpa_use= r/iova_domain.h > index f92f22a7267d..17efa5555b3f 100644 > --- a/drivers/vdpa/vdpa_user/iova_domain.h > +++ b/drivers/vdpa/vdpa_user/iova_domain.h > @@ -74,7 +74,10 @@ void vduse_domain_reset_bounce_map(struct vduse_iova_d= omain *domain); > int vduse_domain_add_user_bounce_pages(struct vduse_iova_domain *domain, > struct page **pages, int count); > > -void vduse_domain_remove_user_bounce_pages(struct vduse_iova_domain *dom= ain); > +void vduse_domain_remove_user_bounce_pages(struct vduse_iova_domain *dom= ain, > + struct page **pages); > + > +struct page **vduse_domain_alloc_pages_to_remove_bounce(struct vduse_iov= a_domain *domain); > > void vduse_domain_destroy(struct vduse_iova_domain *domain); > > diff --git a/drivers/vdpa/vdpa_user/vduse_dev.c b/drivers/vdpa/vdpa_user/= vduse_dev.c > index 7ae99691efdf..5d8d5810df57 100644 > --- a/drivers/vdpa/vdpa_user/vduse_dev.c > +++ b/drivers/vdpa/vdpa_user/vduse_dev.c > @@ -1030,6 +1030,7 @@ static int vduse_dev_queue_irq_work(struct vduse_de= v *dev, > static int vduse_dev_dereg_umem(struct vduse_dev *dev, > u64 iova, u64 size) > { > + struct page **pages; > int ret; > > mutex_lock(&dev->mem_lock); > @@ -1044,7 +1045,8 @@ static int vduse_dev_dereg_umem(struct vduse_dev *d= ev, > if (dev->umem->iova !=3D iova || size !=3D dev->domain->bounce_si= ze) > goto unlock; > > - vduse_domain_remove_user_bounce_pages(dev->domain); > + pages =3D vduse_domain_alloc_pages_to_remove_bounce(dev->domain); > + vduse_domain_remove_user_bounce_pages(dev->domain, pages); > unpin_user_pages_dirty_lock(dev->umem->pages, > dev->umem->npages, true); > atomic64_sub(dev->umem->npages, &dev->umem->mm->pinned_vm); We miss a kfree(pages); here? Thanks > -- > 2.34.1 >