Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp2763416imu; Mon, 19 Nov 2018 05:49:37 -0800 (PST) X-Google-Smtp-Source: AJdET5eymypmipQopsmJo3IQ7IJcBQvNULQpvxC0PGKHYllhOwzjSa7IqpFmmh0nUv0M82avSHDd X-Received: by 2002:a62:3687:: with SMTP id d129-v6mr23207192pfa.56.1542635377344; Mon, 19 Nov 2018 05:49:37 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1542635377; cv=none; d=google.com; s=arc-20160816; b=xpn5dEAD0FVivbA3R6j7RH9gdlsFqM9u6thLXpep9kRuuQoZpZWnhSzV1ZkerGrhgE HlAYienoBZc7FWw8kAM0ADh8E0UxQ/zZ+FqhO1+3pPUDt+6CJrOfIECWqtPTANiQ17Mk 55LtPbYgJAcwG/s0Yma74/Jgn76ytFTSPAw/nyYLgDdpW66SVHEbkk0UhTu3IHNxzy4z L6M/OT2htQxFMuTeVysLZm6MWHCgx/5fo8JCj7ENaFJrHcQbn2/dwQvW3UllnYns9Oq/ V+umPu9QvMAYMQ9VWlX13RORsTpU2ZMhONqJo/BbdhXJpXOJVbcqdrKJ6wmV1nIPBKyQ wHfw== 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 :references:in-reply-to:message-id:date:subject:cc:to:from; bh=nf42ix51hpPXW0zyS9CAdJ7pbNPaGsC2WNOSHLy9hWo=; b=RvEUKrovI5pQNFSM5hIdKdNRtAjsoqqPppxEHjwnXZ8rLMdNzoSeBTA19edDlIGyT2 Wom5U5MNbLuJUvSGJJPDdf1s6PP2FwjLMiYz6JkRai3vGqjNi5pWMOvXYoDB5WbdDcDU EhOvBrbzcu63+qTa85LnIEtHiDxZe9KeMVdHForhMqZJeDB4V1FDHNsrBp0xVy65D6kF 1XKUB+h3rvvsZ6SVslQ8sM8UuVbHMSBsjbGpqrfHXwtt3z3IrLinSDbBfs95Sbvl7LFu eVNRr1prVRZGqboEKPXJ2450qHxOB5aEGOVdYqn88JxXQ11y4Ezb9mPbxzhWuPiBTClh IWhg== 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 n1si14710154pfh.96.2018.11.19.05.49.22; Mon, 19 Nov 2018 05:49:37 -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 S1729379AbeKTAMW (ORCPT + 99 others); Mon, 19 Nov 2018 19:12:22 -0500 Received: from mga03.intel.com ([134.134.136.65]:32280 "EHLO mga03.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726189AbeKTAMW (ORCPT ); Mon, 19 Nov 2018 19:12:22 -0500 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 19 Nov 2018 05:48:41 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.56,252,1539673200"; d="scan'208";a="87075895" Received: from aaronlu.sh.intel.com ([10.239.159.44]) by fmsmga007.fm.intel.com with ESMTP; 19 Nov 2018 05:48:37 -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 , Alexander Duyck , Ian Kumlien Subject: [PATCH v2 RESEND 1/2] mm/page_alloc: free order-0 pages through PCP in page_frag_free() Date: Mon, 19 Nov 2018 21:48:33 +0800 Message-Id: <20181119134834.17765-2-aaron.lu@intel.com> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20181119134834.17765-1-aaron.lu@intel.com> References: <20181119134834.17765-1-aaron.lu@intel.com> 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() -> 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. Ilias' test on a 'low' speed 1Gbit interface on an cortex-a53 shows ~11% performance boost testing with 64byte packets and __free_pages_ok() disappeared from perf top. [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 Acked-by: Vlastimil Babka Acked-by: Mel Gorman Acked-by: Jesper Dangaard Brouer Acked-by: Ilias Apalodimas Tested-by: Ilias Apalodimas Acked-by: Alexander Duyck Acked-by: Tariq Toukan --- 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 421c5b652708..8f8c6b33b637 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -4677,8 +4677,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