Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp310047imu; Mon, 5 Nov 2018 01:00:41 -0800 (PST) X-Google-Smtp-Source: AJdET5euW5itNT71wZinitX18Oa1Par8wrHjWHgQtXG0P2GoHqA/7AuU73f72AkfzBrEQNB8Ci4T X-Received: by 2002:a17:902:292b:: with SMTP id g40-v6mr3110705plb.279.1541408441936; Mon, 05 Nov 2018 01:00:41 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1541408441; cv=none; d=google.com; s=arc-20160816; b=LZKLWVfyxg8m2mEoaStPrzDiIcSo8+Fi+lilaG8y/6sa89a4rKHwvwjDxFjElhsWN+ HoMv+1yYryjseCotRxIXHzWSQeMZLhmIG0B9JOgaIOVgIpmFBmyPRiwFnmk50abSskDi eEznWU7jrRyqNK5qasfiAIw9N+BqDYmG7GWmV1l0PVZllTN76qmXtAtHl44EhJj99Kc0 msqcIi61PNLwQYrN1ZYBBxHXnXbqmkt4Oji1bFgOGqhiAfbyPc2jKImppbH3KuQLjZ0k rcSSkcd8pRuiQZtKFgdKQg74mALXbU4xtm/Vo8WHDCw5Dqs3mTAF4NBjoatqRHDzzyNw isyw== 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:mime-version :message-id:date:subject:cc:to:from; bh=iXsn0IQmvUd+qr/13cqqT6fG7fWOtXYZpCujpYKzSjs=; b=MpuiXn98TLY9HoO6qjnt4Vr0PmgomUCEXfoQyFVyAYEHndZnRHTH9Lcm+o27Nd3mzE eOwB9PFGWqSa5pzQwr1gumkB6NLHx0yQ7h7dEf9gia64wEtH4mALRrPD9/jr7QivaKWx m+OUoiAgSoXWZY8ahHhhGq3remwFofoHqasenll9webhqIZ3iT84wACFnK4cwVWZn4S8 bg5ewrfBldktIf+r0c8XR6ctkbWQtb8YjZnsTHLZHDMoUe6ciCcz0HqpuPvmmRSH1oze afWZuabjLIQz7haPeF0gysHmAg2Y5Xacvd4DDRSjPcaui4pkL/5TIVaQsLk8p4bgc54r KMcw== 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=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id j7-v6si3756495plt.349.2018.11.05.01.00.26; Mon, 05 Nov 2018 01:00:41 -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=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727005AbeKESRD (ORCPT + 99 others); Mon, 5 Nov 2018 13:17:03 -0500 Received: from mga07.intel.com ([134.134.136.100]:46184 "EHLO mga07.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726086AbeKESRC (ORCPT ); Mon, 5 Nov 2018 13:17:02 -0500 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 Nov 2018 00:58:24 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.54,467,1534834800"; d="scan'208";a="103471773" Received: from aaronlu.sh.intel.com ([10.239.159.44]) by fmsmga004.fm.intel.com with ESMTP; 05 Nov 2018 00:58:21 -0800 From: Aaron Lu To: linux-mm@kvack.org, linux-kernel@vger.kernel.org, netdev@vger.kernel.org Cc: Andrew Morton , =?UTF-8?q?Pawe=C5=82=20Staszewski?= , Jesper Dangaard Brouer , Eric Dumazet , Tariq Toukan , Ilias Apalodimas , Yoel Caspersen , Mel Gorman , Saeed Mahameed , Michal Hocko , Vlastimil Babka , Dave Hansen Subject: [PATCH 1/2] mm/page_alloc: free order-0 pages through PCP in page_frag_free() Date: Mon, 5 Nov 2018 16:58:19 +0800 Message-Id: <20181105085820.6341-1-aaron.lu@intel.com> X-Mailer: git-send-email 2.17.2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org page_frag_free() calls __free_pages_ok() to free the page back to Buddy. This is OK for high order page, but for order-0 pages, it misses the optimization opportunity of using Per-Cpu-Pages and can cause zone lock contention when called frequently. Paweł Staszewski recently shared his result of 'how Linux kernel handles normal traffic'[1] and from perf data, Jesper Dangaard Brouer found the lock contention comes from page allocator: mlx5e_poll_tx_cq | --16.34%--napi_consume_skb | |--12.65%--__free_pages_ok | | | --11.86%--free_one_page | | | |--10.10%--queued_spin_lock_slowpath | | | --0.65%--_raw_spin_lock | |--1.55%--page_frag_free | --1.44%--skb_release_data Jesper explained how it happened: mlx5 driver RX-page recycle mechanism is not effective in this workload and pages have to go through the page allocator. The lock contention happens during mlx5 DMA TX completion cycle. And the page allocator cannot keep up at these speeds.[2] I thought that __free_pages_ok() are mostly freeing high order pages and thought this is an lock contention for high order pages but Jesper explained in detail that __free_pages_ok() here are actually freeing order-0 pages because mlx5 is using order-0 pages to satisfy its page pool allocation request.[3] The free path as pointed out by Jesper is: skb_free_head() -> skb_free_frag() -> skb_free_frag() -> page_frag_free() And the pages being freed on this path are order-0 pages. Fix this by doing similar things as in __page_frag_cache_drain() - send the being freed page to PCP if it's an order-0 page, or directly to Buddy if it is a high order page. With this change, Paweł hasn't noticed lock contention yet in his workload and Jesper has noticed a 7% performance improvement using a micro benchmark and lock contention is gone. [1]: https://www.spinics.net/lists/netdev/msg531362.html [2]: https://www.spinics.net/lists/netdev/msg531421.html [3]: https://www.spinics.net/lists/netdev/msg531556.html Reported-by: Paweł Staszewski Analysed-by: Jesper Dangaard Brouer Signed-off-by: Aaron Lu --- mm/page_alloc.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/mm/page_alloc.c b/mm/page_alloc.c index ae31839874b8..91a9a6af41a2 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -4555,8 +4555,14 @@ void page_frag_free(void *addr) { struct page *page = virt_to_head_page(addr); - if (unlikely(put_page_testzero(page))) - __free_pages_ok(page, compound_order(page)); + if (unlikely(put_page_testzero(page))) { + unsigned int order = compound_order(page); + + if (order == 0) + free_unref_page(page); + else + __free_pages_ok(page, order); + } } EXPORT_SYMBOL(page_frag_free); -- 2.17.2