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 011E2C636CC for ; Thu, 16 Feb 2023 21:19:41 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 418356B0074; Thu, 16 Feb 2023 16:19:41 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 3A0AB6B0075; Thu, 16 Feb 2023 16:19:41 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 240F46B0078; Thu, 16 Feb 2023 16:19:41 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id 117306B0074 for ; Thu, 16 Feb 2023 16:19:41 -0500 (EST) Received: from smtpin27.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id D144B160957 for ; Thu, 16 Feb 2023 21:19:40 +0000 (UTC) X-FDA: 80474421720.27.CE75509 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by imf01.hostedemail.com (Postfix) with ESMTP id EA3B940006 for ; Thu, 16 Feb 2023 21:19:38 +0000 (UTC) Authentication-Results: imf01.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=NZf1aXV1; spf=pass (imf01.hostedemail.com: domain of mpatocka@redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=mpatocka@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=1676582379; 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: in-reply-to:in-reply-to:references:references:dkim-signature; bh=iQS7fLcdFYItcBczHsW9796GCBjG+HT4QQb65rs3R5g=; b=UZfyLJ+nXXVYV6hOBUlLl8EyI4XudG+Nf1+SDk/Nuv3Y3639vUEXsqRTzJvEVM8InJocUq zQo92Plt2Zikecn+AeeytxYBjjhIz5H63m18Yad0pU6i36QU5Lf1uXOtXFrSeIQ2VhTjON FOBLj0wAD9M617A/VMcHC85Sa2DFESk= ARC-Authentication-Results: i=1; imf01.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=NZf1aXV1; spf=pass (imf01.hostedemail.com: domain of mpatocka@redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=mpatocka@redhat.com; dmarc=pass (policy=none) header.from=redhat.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1676582379; a=rsa-sha256; cv=none; b=PVwdyCaFm5SuTEK9OSkNyklx8oBORTWIuGhkP6p0fQ68mgIfwaOEoIj5BZIla7IBgflkzk cIoUnDxRqEF7Il+i/OdCU7OJSQ6oRzBBXjp3Pdu+TtOYZ75fPhiONzQJBrmIrAWi85HZSd kNsgIa2e5k6T2o3P8LF+Ji+V7Qo1MWY= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1676582378; 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: in-reply-to:in-reply-to:references:references; bh=iQS7fLcdFYItcBczHsW9796GCBjG+HT4QQb65rs3R5g=; b=NZf1aXV1YPxDXKLaHnd3ycUjT9VkeyCopEiAx5LLfc6Zwb3CbL0YagcmzMjhuEn4YFiUZH beAwtyL60WiMSNKGzpLLZfyFcLNVSmnFhLsYzBIWvf/CO6qPg843Z4JZdGB0AnfeRkVAkQ nJXcfzm1j3lKqoKyk+9i4tJEZCDDOuA= Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-316-bnaSfYcBPw-w36P2GfwC8g-1; Thu, 16 Feb 2023 16:19:34 -0500 X-MC-Unique: bnaSfYcBPw-w36P2GfwC8g-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.rdu2.redhat.com [10.11.54.2]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 7864A1C05AF0; Thu, 16 Feb 2023 21:19:33 +0000 (UTC) Received: from file01.intranet.prod.int.rdu2.redhat.com (file01.intranet.prod.int.rdu2.redhat.com [10.11.5.7]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 4649E40C10FA; Thu, 16 Feb 2023 21:19:33 +0000 (UTC) Received: from file01.intranet.prod.int.rdu2.redhat.com (localhost [127.0.0.1]) by file01.intranet.prod.int.rdu2.redhat.com (8.14.4/8.14.4) with ESMTP id 31GLJXo0007124; Thu, 16 Feb 2023 16:19:33 -0500 Received: from localhost (mpatocka@localhost) by file01.intranet.prod.int.rdu2.redhat.com (8.14.4/8.14.4/Submit) with ESMTP id 31GLJWwh007120; Thu, 16 Feb 2023 16:19:32 -0500 X-Authentication-Warning: file01.intranet.prod.int.rdu2.redhat.com: mpatocka owned process doing -bs Date: Thu, 16 Feb 2023 16:19:32 -0500 (EST) From: Mikulas Patocka X-X-Sender: mpatocka@file01.intranet.prod.int.rdu2.redhat.com To: Matthew Wilcox cc: snitzer@kernel.org, Yang Shi , mgorman@techsingularity.net, agk@redhat.com, dm-devel@redhat.com, akpm@linux-foundation.org, linux-block@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH] dm-crypt: allocate compound pages if possible In-Reply-To: Message-ID: References: User-Agent: Alpine 2.21 (LRH 202 2017-01-01) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII X-Scanned-By: MIMEDefang 3.1 on 10.11.54.2 X-Rspamd-Queue-Id: EA3B940006 X-Stat-Signature: zwtfzng684i9kaer9y9xzn4djincn11z X-Rspam-User: X-Rspamd-Server: rspam08 X-HE-Tag: 1676582378-6209 X-HE-Meta: U2FsdGVkX18K/nmoCqtEU3qHnv1YVSjiAFkko791zHOzQjEvqttHoGxhVyf8UuybfuDy85qO9KY3SPTA+gV2/JhnNvr+whvPvfnPNONkLtMHpsaETFJbMvdYdEXOU0Ty3HAznGA7FkaQ5QYSMJvE9Sil9NhZzTzPJhSu2rMtrL3gC9hKXw93Wp2DJIxoaFMTM5UXfHCN4DW51RQNQ102Jl35bVfR//jWMMLy2Pkb4NdsPvJN6NBVOmQRULdhZl8yQIaL53g7ffuF9lBIH5RhM99dBsZ4CVUYFSFpUqCGxgAK4NnyiNBLXfpGToA2dUDqoLZGW8ALOTQlCr5Unm9TSOuGE36063opZeOSysc8UOu7OpuM5xPUtgwVVGw4avXpaFn+RuyMdRnQtYAfNLzWGyLIEYvbQvE1zZm1W3hR8w1Quc24EIBxDYBFQiJ3aFxCnPbCUUzixESHxG6+ntFl2pOufkYvsqFjaO2PEkRbLoQMp7gynZmNw926iqqZGNu0/STdK+O4SYvZSWGfBWXuxxtGI6SbTOaUlk1EJVZXDe7V9gJ1bh+oZNdwiWm95DOICASBzYXCQksM+0sVvHaTu4WDXcEdhaIikQ4ur/qWzM+NyeCRhrLqtxH4ZuOgGkf17cP635cMHNX/kr/2s7FD1AWcadUuaJ5F8pETkZPopumAaeM4myTLIEZyWIPkHK0fwRQ+vgZmEVtpnCFfTa/VC/r80RKKHT1rs7yqptpt6FjUAspkeIUJna2eTCbYvlA0b5rJWO+0rChweqC9fLYpqy1cFxinwUB9ueXyQlkMcCs3ssma64TFxhhPsdhey3iKtUK1ZlaPrO0TbB+OM7SRPt/1fotI1OyFH0jpEL2Cj5czpSoERr7ZS7Bs65vrsx9Hzs4p3nv6h1LHtfdbfVVTZ23+QkSBj6+Zk7BulYfBgcb4YJrnGJbMLhfZO7XX/laNSUifpvdrCJeewpDPAdP M7NTxYYH tR3vctozO6jVa4JSGMFJlH2ZDEWSTpbXcWk6UUyBuFWgMz0NPJ3epod9HIFDdyYp4TPqIeCQkmbWsnHkmv1QLtve9Enw5nFlCRoHfFf7o6vS7KfVaIMhPrBdYlbNBnoE3G6q+7OE/g04tVDuzuBRrFOykO0+YXXsJIHAyFYjdaRH76tF/zbrBCNVgT72hsJOmtJfDqjG7jPb9BjE= 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 Thu, 16 Feb 2023, Matthew Wilcox wrote: > > - len = (remaining_size > PAGE_SIZE) ? PAGE_SIZE : remaining_size; > > - > > - bio_add_page(clone, page, len, 0); > > +have_pages: > > + page->compound_order = order; > > No. You'll corrupt the next page if page is order-0, which it is if it > came from the mempool. Also we've deleted page->compound_order in -next > so you can't make this mistake. Using __GFP_COMP will set this field > for you, so you can just drop this line. OK > > - remaining_size -= len; > > + for (o = 0; o < 1U << order; o++) { > > + unsigned len = min((unsigned)PAGE_SIZE, remaining_size); > > + bio_add_page(clone, page, len, 0); > > + remaining_size -= len; > > + page++; > > You can add multiple pages at once, whether they're compound or not. So > replace this entire loop with: > > bio_add_page(clone, page, remaining_size, 0); This should be min((unsigned)PAGE_SIZE << order, remaining_size), because we may allocate less than remaining_size. > > @@ -1711,10 +1732,23 @@ static void crypt_free_buffer_pages(stru > > { > > struct bio_vec *bv; > > struct bvec_iter_all iter_all; > > + unsigned skip_entries = 0; > > > > bio_for_each_segment_all(bv, clone, iter_all) { > > - BUG_ON(!bv->bv_page); > > - mempool_free(bv->bv_page, &cc->page_pool); > > + unsigned order; > > + struct page *page = bv->bv_page; > > + BUG_ON(!page); > > + if (skip_entries) { > > + skip_entries--; > > + continue; > > + } > > + order = page->compound_order; > > + if (order) { > > + __free_pages(page, order); > > + skip_entries = (1U << order) - 1; > > + } else { > > + mempool_free(page, &cc->page_pool); > > + } > > You can simplify this by using the folio code. > > struct folio_iter fi; > > bio_for_each_folio_all(fi, bio) { > if (folio_test_large(folio)) > folio_put(folio); > else > mempool_free(&folio->page, &cc->page_pool); > } OK. I'm sending version 2 of the patch. > (further work would actually convert this driver to use folios instead > of pages) Mikulas