From patchwork Mon Apr 15 13:19:30 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yunsheng Lin X-Patchwork-Id: 13630029 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 7FAD4C00A94 for ; Mon, 15 Apr 2024 13:22:09 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 9A4EF6B0096; Mon, 15 Apr 2024 09:22:08 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 92DB06B0098; Mon, 15 Apr 2024 09:22:08 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 7F6DB6B0099; Mon, 15 Apr 2024 09:22:08 -0400 (EDT) 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 55EDB6B0096 for ; Mon, 15 Apr 2024 09:22:08 -0400 (EDT) Received: from smtpin05.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 227A91605EF for ; Mon, 15 Apr 2024 13:22:08 +0000 (UTC) X-FDA: 82011829536.05.4FBB8F7 Received: from szxga02-in.huawei.com (szxga02-in.huawei.com [45.249.212.188]) by imf10.hostedemail.com (Postfix) with ESMTP id 9BA05C0015 for ; Mon, 15 Apr 2024 13:22:05 +0000 (UTC) Authentication-Results: imf10.hostedemail.com; dkim=none; dmarc=pass (policy=quarantine) header.from=huawei.com; spf=pass (imf10.hostedemail.com: domain of linyunsheng@huawei.com designates 45.249.212.188 as permitted sender) smtp.mailfrom=linyunsheng@huawei.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1713187326; 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; bh=orreERWWsYX7btKTXi9psZRl1saCgViHEcv00oDh7jw=; b=J00jlAUpF2NzX/Ou5BQ2JC5p8zB4GKRW4/VSpgjkc4Tc3vRMNTE5969mVBh7xs0O8V/HkF 8/6JuCIdpdcLx4HofFSHEH0ipYPrsDh6zEBKCBY6psSnAnTHWDnNOJKHw8NIfCD+3m5UMV x8qwx6ozms4JRMrWuLIscjOyH5jtpWc= ARC-Authentication-Results: i=1; imf10.hostedemail.com; dkim=none; dmarc=pass (policy=quarantine) header.from=huawei.com; spf=pass (imf10.hostedemail.com: domain of linyunsheng@huawei.com designates 45.249.212.188 as permitted sender) smtp.mailfrom=linyunsheng@huawei.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1713187326; a=rsa-sha256; cv=none; b=4gPF71HeowEfpx3OQFw/ZGcUKsp6GVxejKoaKrvf93C37uUjzl9j0ReX+hGglgpSQbK15w 4vfJFlQXlCuUbXb0aq1WV8pTkAd+vjrCu5czWn7Y0QiELTWpgCBq2b2GZMda7+4fZols2o oxJfda8JJJiMZvmFcLbMPFsid2kOxUg= Received: from mail.maildlp.com (unknown [172.19.163.252]) by szxga02-in.huawei.com (SkyGuard) with ESMTP id 4VJ76F5p6mzTmPr; Mon, 15 Apr 2024 21:18:45 +0800 (CST) Received: from dggpemm500005.china.huawei.com (unknown [7.185.36.74]) by mail.maildlp.com (Postfix) with ESMTPS id C1C5718007D; Mon, 15 Apr 2024 21:22:01 +0800 (CST) Received: from localhost.localdomain (10.69.192.56) by dggpemm500005.china.huawei.com (7.185.36.74) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.35; Mon, 15 Apr 2024 21:22:01 +0800 From: Yunsheng Lin To: , , CC: , , Yunsheng Lin , Alexander Duyck , Andrew Morton , Subject: [PATCH net-next v2 05/15] mm: page_frag: use initial zero offset for page_frag_alloc_align() Date: Mon, 15 Apr 2024 21:19:30 +0800 Message-ID: <20240415131941.51153-6-linyunsheng@huawei.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20240415131941.51153-1-linyunsheng@huawei.com> References: <20240415131941.51153-1-linyunsheng@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.69.192.56] X-ClientProxiedBy: dggems706-chm.china.huawei.com (10.3.19.183) To dggpemm500005.china.huawei.com (7.185.36.74) X-Rspamd-Server: rspam09 X-Rspamd-Queue-Id: 9BA05C0015 X-Stat-Signature: pyi1c314t9ftshoj5stseh7podyuufju X-Rspam-User: X-HE-Tag: 1713187325-163367 X-HE-Meta: U2FsdGVkX1/bk2Wqu7cN26D2H5AXsdHqJc0FdxWWS5MaJ/M4SQGCsXTTKU62TIM+PyhvSBX/CP4nwCg079mZzQ9qp1obN7rHZjXXJSRxoxe3UVCZ77nLUmMFtoUQSpIQGJL3dO4gDmNlrGklbvLpfrjBVENESzjeLgVcFchLcXkQ/XC0gTdcGCXO/tLjyUeU1eCDzRlLYY6S9oznc8kCKGdTPtI+5X23l8FioyUX2N0blpi18iSxWf8z0yp0ogUWKa916sZ2IRvROXKjPqOF1Oj3+JqKzZ5DA4BQzuY9ihmi+sN+KWf3NTvvUHTqIZtTkGO4sqD7a1oEpBeMPGTlOlPI6eioG9tIMUdgEVQtidbsignquBYtlY7nZxV5KBs5KdiLISnbQZA9DHMd4bm5BDLP1c2mH2XwAZSAf+poMkM4+m3N/NbdzwTKIfPTbrHerJVQJEfQgItcEv8J2+hZ+TW0nkRlMbymLuAfz46lPyXOJrIFMY/UPRAlTuMAHtnfCz7QKx8XcdDyl9Lb/ZJ9elcqjtPOx4w0zvP9bklAEUN9p1BpSE4DTUn7scajskrYEpIe/jRGfSzuAguNY2IBNUAi08Jyop1R8rOSxX/l8AxZ5Dm5DiqAU6LVmLEONk+a3guhgYWKu60q75vPTqsFvW/Psxe7I/DRwRB8ZrFXqb9r8uuUTDrPQ2RZXDnq004yn2ux82DNHGdk2TtwYaTciALsWN41RXVCkuONyFpBv82qSyKnGN18TWmwA9SKpNr1MKu5RVRr49EPEDDqqPpn9aVIlEZGLY1zUxtvtq4VOOwD1VyncoqZ9m+r+Hc1nKUFJChxjZgoV4WkWgvbyFzbgvvRQFI/ZspxRGPW6ixDHf0vQ+/M+HykW43ja63xDPqb495u/ey+seJR8h1Rs97EgQ8ANc5+iaV/2nYSbOF9nh5unZrb5oj6rij2pec4UvOXkOXwXs9k1ZxLPElPwoO nMb0wdLm RCvnpD+P2mbiX3Czrb9UG844xoz0q7vfJnAIpWqL8T23nTJrw+FvM5hIk04zekx7deXY17D3wcn4qT/qF39UKTeNZe6sP/p2x6ViO5FNP4923pyt9eZU4rSPM9B33TqFEzb4qeE27medCdB4qVZOriQ0YMw== 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: We are above to use page_frag_alloc_*() API to not just allocate memory for skb->data, but also use them to do the memory allocation for skb frag too. Currently the implementation of page_frag in mm subsystem is running the offset as a countdown rather than count-up value, there may have several advantages to that as mentioned in [1], but it may have some disadvantages, for example, it may disable skb frag coaleasing and more correct cache prefetching We have a trade-off to make in order to have a unified implementation and API for page_frag, so use a initial zero offset in this patch, and the following patch will try to make some optimization to aovid the disadvantages as much as possible. 1. https://lore.kernel.org/all/f4abe71b3439b39d17a6fb2d410180f367cadf5c.camel@gmail.com/ CC: Alexander Duyck Signed-off-by: Yunsheng Lin --- mm/page_frag_cache.c | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/mm/page_frag_cache.c b/mm/page_frag_cache.c index 64993b5d1243..dc864ee09536 100644 --- a/mm/page_frag_cache.c +++ b/mm/page_frag_cache.c @@ -65,9 +65,8 @@ void *__page_frag_alloc_align(struct page_frag_cache *nc, unsigned int fragsz, gfp_t gfp_mask, unsigned int align_mask) { - unsigned int size = PAGE_SIZE; + unsigned int size, offset; struct page *page; - int offset; if (unlikely(!nc->va)) { refill: @@ -75,10 +74,6 @@ void *__page_frag_alloc_align(struct page_frag_cache *nc, if (!page) return NULL; -#if (PAGE_SIZE < PAGE_FRAG_CACHE_MAX_SIZE) - /* if size can vary use size else just use PAGE_SIZE */ - size = nc->size; -#endif /* Even if we own the page, we do not use atomic_set(). * This would break get_page_unless_zero() users. */ @@ -87,11 +82,18 @@ void *__page_frag_alloc_align(struct page_frag_cache *nc, /* reset page count bias and offset to start of new frag */ nc->pfmemalloc = page_is_pfmemalloc(page); nc->pagecnt_bias = PAGE_FRAG_CACHE_MAX_SIZE + 1; - nc->offset = size; + nc->offset = 0; } - offset = nc->offset - fragsz; - if (unlikely(offset < 0)) { +#if (PAGE_SIZE < PAGE_FRAG_CACHE_MAX_SIZE) + /* if size can vary use size else just use PAGE_SIZE */ + size = nc->size; +#else + size = PAGE_SIZE; +#endif + + offset = ALIGN(nc->offset, -align_mask); + if (unlikely(offset + fragsz > size)) { page = virt_to_page(nc->va); if (!page_ref_sub_and_test(page, nc->pagecnt_bias)) @@ -102,17 +104,13 @@ void *__page_frag_alloc_align(struct page_frag_cache *nc, goto refill; } -#if (PAGE_SIZE < PAGE_FRAG_CACHE_MAX_SIZE) - /* if size can vary use size else just use PAGE_SIZE */ - size = nc->size; -#endif /* OK, page count is 0, we can safely set it */ set_page_count(page, PAGE_FRAG_CACHE_MAX_SIZE + 1); /* reset page count bias and offset to start of new frag */ nc->pagecnt_bias = PAGE_FRAG_CACHE_MAX_SIZE + 1; - offset = size - fragsz; - if (unlikely(offset < 0)) { + offset = 0; + if (unlikely(fragsz > size)) { /* * The caller is trying to allocate a fragment * with fragsz > PAGE_SIZE but the cache isn't big @@ -127,8 +125,7 @@ void *__page_frag_alloc_align(struct page_frag_cache *nc, } nc->pagecnt_bias--; - offset &= align_mask; - nc->offset = offset; + nc->offset = offset + fragsz; return nc->va + offset; }