From patchwork Fri Feb 16 16:01:12 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Christoph Lameter (Ampere)" X-Patchwork-Id: 10225023 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 8D071602CB for ; Fri, 16 Feb 2018 16:02:45 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6BEBB288E6 for ; Fri, 16 Feb 2018 16:02:45 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 699EE2859E; Fri, 16 Feb 2018 16:02:45 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B10DF29676 for ; Fri, 16 Feb 2018 16:01:35 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758452AbeBPQBc (ORCPT ); Fri, 16 Feb 2018 11:01:32 -0500 Received: from resqmta-ch2-11v.sys.comcast.net ([69.252.207.43]:51162 "EHLO resqmta-ch2-11v.sys.comcast.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758466AbeBPQB3 (ORCPT ); Fri, 16 Feb 2018 11:01:29 -0500 Received: from resomta-ch2-11v.sys.comcast.net ([69.252.207.107]) by resqmta-ch2-11v.sys.comcast.net with ESMTP id miQyeKZLuWyROmiS0ebIh1; Fri, 16 Feb 2018 16:01:28 +0000 Received: from gentwo.org ([98.222.162.64]) by resomta-ch2-11v.sys.comcast.net with SMTP id miRze1L7dEcHBmiRze7rzm; Fri, 16 Feb 2018 16:01:28 +0000 Received: by gentwo.org (Postfix, from userid 1001) id 9E8E31160218; Fri, 16 Feb 2018 10:01:21 -0600 (CST) Message-Id: <20180216160121.583566579@linux.com> User-Agent: quilt/0.63-1 Date: Fri, 16 Feb 2018 10:01:12 -0600 From: Christoph Lameter To: Mel Gorman Cc: Matthew Wilcox Cc: linux-mm@kvack.org Cc: linux-rdma@vger.kernel.org CC: akpm@linux-foundation.org Cc: Thomas Schoebel-Theuer Cc: andi@firstfloor.org Cc: Rik van Riel Cc: Michal Hocko Cc: Guy Shattah Cc: Anshuman Khandual Cc: Michal Nazarewicz Cc: Vlastimil Babka Cc: David Nellans Cc: Laura Abbott Cc: Pavel Machek Cc: Dave Hansen Cc: Mike Kravetz Subject: [RFC 2/2] Page order diagnostics References: <20180216160110.641666320@linux.com> MIME-Version: 1.0 Content-Disposition: inline; filename=order_stats X-CMAE-Envelope: MS4wfNTooiVAu7azZKMjaw756lPgK3ISYyYjh3mH5mmYjZ5GF8Ncj9ihew18e/SRyW7E1+XFW29qVA/2JgsQPPNi8KIe6lAGAYoDJkQcg2B1YC4Hsk0jLd1l m+TJGyjPtZyPqN+b23R1iXX6ucxzWggrutwh1qz3buA+4J8bkMt8fr2K2uGZzOjGJFHf8AbsIraW7G+EhYcKuoKhWgRByvz+ob9gBzhrybAXOgNZFpydBtjG Hx/GukSXU9exd4Q7Xak/+Mi8q57NfjrPQB+9+rq6lGAx3kBqHk8aCGisQvOU2Wb8Df44wLW2X278D+0e1A0FEpnEoISHveCUP3n7sNl+vDzMQqcb4ImVocVx IMwK/tLL+Mpr+l8K+wTc2noSlQofdoxXK+3vKEQZMGVzHWroEcTmFR7SBEd5neCaIDFbiKXgBRsQBW09rVGvHFqndabujiESL/XWVrVMkZJOsjk2bYaQY0P2 YNSgz1NPLib081amgECc99VrENhzXqtpNkTIdlvvgMI6AGr9tO31MOO/z2fKtmV4pgwQg5Ujsu5r3S8tE/TcdX8ods4uaC3sMWUIqVK7jIZueXSxwFUt0NoE WxRNtAFLw2SaIxqcxb64ZrOYUvJPpknFpG4Mig7HX5uMfG7Tcet5yHLe0k0zexfsvmiZy0Rh/+7yceZ6y0Jfzqzr Sender: linux-rdma-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-rdma@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP It is beneficial to know about the contiguous memory segments available on a system and the number of allocations failing for each page order. This patch adds details per order statistics to /proc/meminfo so the current memory use can be determined. Also adds counters to /proc/vmstat to show allocation failures for each page order. Signed-off-by: Christoph Laeter --- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Index: linux/include/linux/mmzone.h =================================================================== --- linux.orig/include/linux/mmzone.h +++ linux/include/linux/mmzone.h @@ -185,6 +185,10 @@ enum node_stat_item { NR_VMSCAN_IMMEDIATE, /* Prioritise for reclaim when writeback ends */ NR_DIRTIED, /* page dirtyings since bootup */ NR_WRITTEN, /* page writings since bootup */ +#ifdef CONFIG_ORDER_STATS + NR_ORDER, + NR_ORDER_MAX = NR_ORDER + MAX_ORDER - 1, +#endif NR_VM_NODE_STAT_ITEMS }; Index: linux/mm/page_alloc.c =================================================================== --- linux.orig/mm/page_alloc.c +++ linux/mm/page_alloc.c @@ -828,6 +828,10 @@ static inline void __free_one_page(struc VM_BUG_ON_PAGE(pfn & ((1 << order) - 1), page); VM_BUG_ON_PAGE(bad_range(zone, page), page); +#ifdef CONFIG_ORDER_STATS + dec_node_page_state(page, NR_ORDER + order); +#endif + continue_merging: while (order < max_order - 1) { buddy_pfn = __find_buddy_pfn(pfn, order); @@ -1285,6 +1289,9 @@ static void __init __free_pages_boot_cor page_zone(page)->managed_pages += nr_pages; set_page_refcounted(page); __free_pages(page, order); +#ifdef CONFIG_ORDER_STATS + inc_node_page_state(page, NR_ORDER + order); +#endif } #if defined(CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID) || \ @@ -1855,6 +1862,9 @@ struct page *__rmqueue_smallest(struct z rmv_page_order(page); area->nr_free--; expand(zone, page, order, current_order, area, migratetype); +#ifdef CONFIG_ORDER_STATS + inc_node_page_state(page, NR_ORDER + order); +#endif set_pcppage_migratetype(page, migratetype); return page; } @@ -4169,6 +4179,11 @@ nopage: fail: warn_alloc(gfp_mask, ac->nodemask, "page allocation failure: order:%u", order); + +#ifdef CONFIG_ORDER_STATS + count_vm_event(ORDER0_ALLOC_FAIL + order); +#endif + got_pg: return page; } Index: linux/fs/proc/meminfo.c =================================================================== --- linux.orig/fs/proc/meminfo.c +++ linux/fs/proc/meminfo.c @@ -51,6 +51,7 @@ static int meminfo_proc_show(struct seq_ long available; unsigned long pages[NR_LRU_LISTS]; int lru; + int order; si_meminfo(&i); si_swapinfo(&i); @@ -155,6 +156,11 @@ static int meminfo_proc_show(struct seq_ global_zone_page_state(NR_FREE_CMA_PAGES)); #endif +#ifdef CONFIG_ORDER_STATS + for (order= 0; order < MAX_ORDER; order++) + seq_printf(m, "Order%2d Pages: %5lu\n", + order, global_node_page_state(NR_ORDER + order)); +#endif hugetlb_report_meminfo(m); arch_report_meminfo(m); Index: linux/mm/Kconfig =================================================================== --- linux.orig/mm/Kconfig +++ linux/mm/Kconfig @@ -752,6 +752,15 @@ config PERCPU_STATS information includes global and per chunk statistics, which can be used to help understand percpu memory usage. +config ORDER_STATS + bool "Statistics for different sized allocations" + default n + help + Create statistics about the contiguous memory segments allocated + through the page allocator. This creates statistics about the + memory segments in use in /proc/meminfo and the node meminfo files + as well as allocation failure statistics in /proc/vmstat. + config GUP_BENCHMARK bool "Enable infrastructure for get_user_pages_fast() benchmarking" default n Index: linux/include/linux/vm_event_item.h =================================================================== --- linux.orig/include/linux/vm_event_item.h +++ linux/include/linux/vm_event_item.h @@ -111,6 +111,10 @@ enum vm_event_item { PGPGIN, PGPGOUT, PS SWAP_RA, SWAP_RA_HIT, #endif +#ifdef CONFIG_ORDER_STATS + ORDER0_ALLOC_FAIL, + ORDER_MAX_FAIL = ORDER0_ALLOC_FAIL + MAX_ORDER -1, +#endif NR_VM_EVENT_ITEMS }; Index: linux/mm/vmstat.c =================================================================== --- linux.orig/mm/vmstat.c +++ linux/mm/vmstat.c @@ -1289,6 +1289,52 @@ const char * const vmstat_text[] = { "swap_ra", "swap_ra_hit", #endif +#ifdef CONFIG_ORDER_STATS + "order0_failure", + "order1_failure", + "order2_failure", + "order3_failure", + "order4_failure", + "order5_failure", + "order6_failure", + "order7_failure", + "order8_failure", + "order9_failure", + "order10_failure", +#ifdef CONFIG_FORCE_MAX_ZONEORDER +#if MAX_ORDER > 11 + "order11_failure" +#endif +#if MAX_ORDER > 12 + "order12_failure" +#endif +#if MAX_ORDER > 13 + "order13_failure" +#endif +#if MAX_ORDER > 14 + "order14_failure" +#endif +#if MAX_ORDER > 15 + "order15_failure" +#endif +#if MAX_ORDER > 16 + "order16_failure" +#endif +#if MAX_ORDER > 17 + "order17_failure" +#endif +#if MAX_ORDER > 18 + "order18_failure" +#endif +#if MAX_ORDER > 19 + "order19_failure" +#endif +#if MAX_ORDER > 20 +#error Please add more lines... +#endif + +#endif /* CONFIG_FORCE_MAX_ZONEORDER */ +#endif /* CONFIG_ORDER_STATS */ #endif /* CONFIG_VM_EVENTS_COUNTERS */ }; #endif /* CONFIG_PROC_FS || CONFIG_SYSFS || CONFIG_NUMA */