mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Greg KH <gregkh@suse.de>
To: linux-kernel@vger.kernel.org, stable@kernel.org
Cc: stable-review@kernel.org, torvalds@linux-foundation.org,
	akpm@linux-foundation.org, alan@lxorguk.ukuu.org.uk,
	Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>,
	Andi Kleen <ak@linux.intel.com>,
	Wu Fengguang <fengguang.wu@intel.com>,
	Hugh Dickins <hugh.dickins@tiscali.co.uk>,
	Mel Gorman <mel@csn.ul.ie>,
	Lee Schermerhorn <lee.schermerhorn@hp.com>,
	Andy Whitcroft <apw@canonical.com>,
	David Rientjes <rientjes@google.com>
Subject: [40/90] mm: hugetlb: fix hugepage memory leak in walk_page_range()
Date: Wed, 16 Dec 2009 17:14:51 -0800	[thread overview]
Message-ID: <20091217011603.095665584@mini.kroah.org> (raw)
In-Reply-To: <20091217011835.GA20434@kroah.com>

2.6.31-stable review patch.  If anyone has any objections, please let us know.

------------------

From: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>

commit d33b9f45bd24a6391bc05e2b5a13c1b5787ca9c2 upstream.

Most callers of pmd_none_or_clear_bad() check whether the target page is
in a hugepage or not, but walk_page_range() do not check it.  So if we
read /proc/pid/pagemap for the hugepage on x86 machine, the hugepage
memory is leaked as shown below.  This patch fixes it.

Details
=======
My test program (leak_pagemap) works as follows:
 - creat() and mmap() a file on hugetlbfs (file size is 200MB == 100 hugepages,)
 - read()/write() something on it,
 - call page-types with option -p (walk around the page tables),
 - munmap() and unlink() the file on hugetlbfs

Without my patches
------------------
$ cat /proc/meminfo |grep "HugePage"
HugePages_Total:    1000
HugePages_Free:     1000
HugePages_Rsvd:        0
HugePages_Surp:        0
$ ./leak_pagemap
[snip output]
$ cat /proc/meminfo |grep "HugePage"
HugePages_Total:    1000
HugePages_Free:      900
HugePages_Rsvd:        0
HugePages_Surp:        0
$ ls /hugetlbfs/
$

100 hugepages are accounted as used while there is no file on hugetlbfs.

With my patches
---------------
$ cat /proc/meminfo |grep "HugePage"
HugePages_Total:    1000
HugePages_Free:     1000
HugePages_Rsvd:        0
HugePages_Surp:        0
$ ./leak_pagemap
[snip output]
$ cat /proc/meminfo |grep "HugePage"
HugePages_Total:    1000
HugePages_Free:     1000
HugePages_Rsvd:        0
HugePages_Surp:        0
$ ls /hugetlbfs
$

No memory leaks.

Signed-off-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Wu Fengguang <fengguang.wu@intel.com>
Cc: Hugh Dickins <hugh.dickins@tiscali.co.uk>
Cc: Mel Gorman <mel@csn.ul.ie>
Cc: Lee Schermerhorn <lee.schermerhorn@hp.com>
Cc: Andy Whitcroft <apw@canonical.com>
Cc: David Rientjes <rientjes@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

---
 mm/pagewalk.c |   16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

--- a/mm/pagewalk.c
+++ b/mm/pagewalk.c
@@ -1,6 +1,7 @@
 #include <linux/mm.h>
 #include <linux/highmem.h>
 #include <linux/sched.h>
+#include <linux/hugetlb.h>
 
 static int walk_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end,
 			  struct mm_walk *walk)
@@ -107,6 +108,7 @@ int walk_page_range(unsigned long addr, 
 	pgd_t *pgd;
 	unsigned long next;
 	int err = 0;
+	struct vm_area_struct *vma;
 
 	if (addr >= end)
 		return err;
@@ -117,11 +119,22 @@ int walk_page_range(unsigned long addr, 
 	pgd = pgd_offset(walk->mm, addr);
 	do {
 		next = pgd_addr_end(addr, end);
+
+		/* skip hugetlb vma to avoid hugepage PMD being cleared
+		 * in pmd_none_or_clear_bad(). */
+		vma = find_vma(walk->mm, addr);
+		if (vma && is_vm_hugetlb_page(vma)) {
+			if (vma->vm_end < next)
+				next = vma->vm_end;
+			continue;
+		}
+
 		if (pgd_none_or_clear_bad(pgd)) {
 			if (walk->pte_hole)
 				err = walk->pte_hole(addr, next, walk);
 			if (err)
 				break;
+			pgd++;
 			continue;
 		}
 		if (walk->pgd_entry)
@@ -131,7 +144,8 @@ int walk_page_range(unsigned long addr, 
 			err = walk_pud_range(pgd, addr, next, walk);
 		if (err)
 			break;
-	} while (pgd++, addr = next, addr != end);
+		pgd++;
+	} while (addr = next, addr != end);
 
 	return err;
 }



  parent reply	other threads:[~2009-12-17  1:40 UTC|newest]

Thread overview: 94+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-12-17  1:18 [00/90] 2.6.31.9-stable review Greg KH
2009-12-17  1:14 ` [01/90] USB: option: add pid for ZTE Greg KH
2009-12-17  1:14 ` [02/90] USB: usb-storage: fix bug in fill_inquiry Greg KH
2009-12-17  1:14 ` [03/90] firewire: ohci: handle receive packets with a data length of zero Greg KH
2009-12-17  1:14 ` [04/90] ALSA: hda - Terradici HDA controllers does not support 64-bit mode Greg KH
2009-12-17  1:14 ` [05/90] ALSA: hrtimer - Fix lock-up Greg KH
2009-12-17  1:14 ` [06/90] ath5k: allow setting txpower to 0 Greg KH
2009-12-17  1:14 ` [07/90] ath5k: enable EEPROM checksum check Greg KH
2009-12-17  1:14 ` [08/90] bsdacct: fix uid/gid misreporting Greg KH
2009-12-17  1:14 ` [09/90] debugfs: fix create mutex racy fops and private data Greg KH
2009-12-17  1:14 ` [10/90] devpts_get_tty() should validate inode Greg KH
2009-12-17  1:14 ` [11/90] futex: Take mmap_sem for get_user_pages in fault_in_user_writeable Greg KH
2009-12-17  1:14 ` [12/90] hfs: fix a potential buffer overflow Greg KH
2009-12-17  1:14 ` [13/90] hrtimer: Fix /proc/timer_list regression Greg KH
2009-12-17  1:14 ` [14/90] jbd2: dont wipe the journal on a failed journal checksum Greg KH
2009-12-17  1:14 ` [15/90] KVM: s390: Make psw available on all exits, not just a subset Greg KH
2009-12-17  1:14 ` [16/90] md/bitmap: protect against bitmap removal while being updated Greg KH
2009-12-17  1:14 ` [17/90] pata_hpt{37x|3x2n}: fix timing register masks (take 2) Greg KH
2009-12-17  1:14 ` [18/90] [ARM] pxa/em-x270: fix usb hub power up/reset sequence Greg KH
2009-12-17  1:14 ` [19/90] ssb: Fix range check in sprom write Greg KH
2009-12-17  1:14 ` [20/90] SUNRPC: IS_ERR/PTR_ERR confusion Greg KH
2009-12-17  1:14 ` [21/90] USB: Close usb_find_interface race v3 Greg KH
2009-12-17  1:14 ` [22/90] USB: musb_gadget_ep0: fix unhandled endpoint 0 IRQs, again Greg KH
2009-12-17  1:14 ` [23/90] USB: option.c: add support for D-Link DWM-162-U5 Greg KH
2009-12-17  1:14 ` [24/90] USB: usb-storage: add BAD_SENSE flag Greg KH
2009-12-17  1:14 ` [25/90] USB: usbtmc: repeat usb_bulk_msg until whole message is transfered Greg KH
2009-12-17  1:14 ` [26/90] V4L/DVB: Fix test in copy_reg_bits() Greg KH
2009-12-17  1:14 ` [27/90] x86: Add new Intel CPU cache size descriptors Greg KH
2009-12-17  1:14 ` [28/90] x86/amd-iommu: attach devices to pre-allocated domains early Greg KH
2009-12-17  1:14 ` [29/90] x86/amd-iommu: un__init iommu_setup_msi Greg KH
2009-12-17  1:14 ` [30/90] x86, apic: Enable lapic nmi watchdog on AMD Family 11h Greg KH
2009-12-17  1:14 ` [31/90] x86: ASUS P4S800 reboot=bios quirk Greg KH
2009-12-17  1:14 ` [32/90] x86, Calgary IOMMU quirk: Find nearest matching Calgary while walking up the PCI tree Greg KH
2009-12-17  1:14 ` [33/90] x86: Fix iommu=nodac parameter handling Greg KH
2009-12-17  1:14 ` [34/90] x86: Fix typo in Intel CPU cache size descriptor Greg KH
2009-12-17  1:14 ` [35/90] x86: GART: pci-gart_64.c: Use correct length in strncmp Greg KH
2009-12-17  1:14 ` [36/90] drm/radeon/kms: Add quirk for HIS X1300 board Greg KH
2009-12-17  1:14 ` [37/90] drm/radeon/kms: fix legacy crtc2 dpms Greg KH
2009-12-17  1:14 ` [38/90] mac80211: Fix bug in computing crc over dynamic IEs in beacon Greg KH
2009-12-17  1:14 ` [39/90] mm: hugetlb: fix hugepage memory leak in mincore() Greg KH
2009-12-17  1:14 ` Greg KH [this message]
2009-12-17  1:14 ` [41/90] powerpc: Fix usage of 64-bit instruction in 32-bit altivec code Greg KH
2009-12-17  1:14 ` [42/90] Serial: Do not read IIR in serial8250_start_tx when UART_BUG_TXEN Greg KH
2009-12-17  1:14 ` [43/90] ide: Serialize CMD643 and CMD646 to fix a hardware bug with SSD Greg KH
2009-12-17  1:14 ` [44/90] ide: fix ioctl to pass requested transfer mode to ide_find_dma_mode instead of UDMA6 Greg KH
2009-12-17  1:14 ` [45/90] Revert "ide: try to use PIO Mode 0 during probe if possible" Greg KH
2009-12-17  1:14 ` [46/90] slc90e66: fix UDMA handling Greg KH
2009-12-17  1:14 ` [47/90] Au1x00: fix crash when trying register_netdev() Greg KH
2009-12-17  1:14 ` [48/90] b44 WOL setup: one-bit-off stack corruption kernel panic fix Greg KH
2009-12-17  1:15 ` [49/90] b44: Fix wedge when using netconsole Greg KH
2009-12-17  1:15 ` [50/90] e100: Use pci pool to work around GFP_ATOMIC order 5 memory allocation failure Greg KH
2009-12-17 15:03   ` Roger Oksanen
2009-12-17 15:09     ` Greg KH
2009-12-17 15:16       ` Roger Oksanen
2009-12-17  1:15 ` [51/90] gro: Fix illegal merging of trailer trash Greg KH
2009-12-17  1:15 ` [52/90] ip_fragment: also adjust skb->truesize for packets not owned by a socket Greg KH
2009-12-17  1:15 ` [53/90] Revert "isdn: isdn_ppp: Use SKB list facilities instead of home-grown implementation." Greg KH
2009-12-17  1:15 ` [54/90] net: Fix the rollback test in dev_change_name() Greg KH
2009-12-17  1:15 ` [55/90] NET: smc91x: Fix irq flags Greg KH
2009-12-17  1:15 ` [56/90] smsc9420: prevent BUG() if ethtool is called with interface down Greg KH
2009-12-17  1:15 ` [57/90] vlan: Fix register_vlan_dev() error path Greg KH
2009-12-17  1:15 ` [58/90] sparc64: Fix definition of VMEMMAP_SIZE Greg KH
2009-12-17  1:15 ` [59/90] sunsab: Do not set sunsab_reg.cons right before registering minors Greg KH
2009-12-17  1:15 ` [60/90] sunsu: Fix detection of SU ports which are RSC console or control Greg KH
2009-12-17  1:15 ` [61/90] serial: suncore: Add ignore_line argument to sunserial_console_match() Greg KH
2009-12-17  1:15 ` [62/90] serial: suncore: Fix RSC/LOM handling in sunserial_console_termios() Greg KH
2009-12-17  1:15 ` [63/90] sunsu: Pass true ignore_line to console match when RSC or LOM console Greg KH
2009-12-17  1:15 ` [64/90] sunsu: Use sunserial_console_termios() in sunsu_console_setup() Greg KH
2009-12-17  1:15 ` [65/90] sparc64: Dont specify IRQF_SHARED for LDC interrupts Greg KH
2009-12-17  1:15 ` [66/90] sparc64: Fix overly strict range type matching for PCI devices Greg KH
2009-12-17  1:15 ` [67/90] sparc64: Fix stack debugging IRQ stack regression Greg KH
2009-12-17  1:15 ` [68/90] sparc: Set UTS_MACHINE correctly Greg KH
2009-12-17  1:15 ` [69/90] x86/mce: Set up timer unconditionally Greg KH
2009-12-17  1:15 ` [70/90] b43legacy: avoid PPC fault during resume Greg KH
2009-12-17  1:15 ` [71/90] p54usb: Remove DMA buffer from stack Greg KH
2009-12-17  1:15 ` [72/90] [PATCH .31-stable] x86: Under BIOS control, restore APs APIC_LVTTHMR to the BSP value Greg KH
2009-12-17  1:15 ` [73/90] ACPI: Use the ARB_DISABLE for the CPU which model id is less than 0x0f Greg KH
2009-12-17  1:15 ` [74/90] asus-laptop: change light sens default values Greg KH
2009-12-17  1:15 ` [75/90] backlight: lcd - Fix wrong sizeof Greg KH
2009-12-17  1:15 ` [76/90] drm/i915: Avoid NULL dereference with component_only tv_modes Greg KH
2009-12-17  1:15 ` [77/90] drm/i915: Fix CRT hotplug detect by checking really no channels attached Greg KH
2009-12-17  1:15 ` [78/90] drm/i915: Fix LVDS stability issue on Ironlake Greg KH
2009-12-17  1:15 ` [79/90] drm/i915: save/restore BLC histogram control reg across suspend/resume Greg KH
2009-12-17  1:15 ` [80/90] drm/i915: PineView only has LVDS and CRT ports Greg KH
2009-12-17  1:15 ` [81/90] ext3: Fix data / filesystem corruption when write fails to copy data Greg KH
2009-12-17  1:15 ` [82/90] ipvs: zero usvc and udest Greg KH
2009-12-17  1:15 ` [83/90] ipw2100: fix rebooting hang with driver loaded Greg KH
2009-12-17  1:15 ` [84/90] jffs2: Fix long-standing bug with symlink garbage collection Greg KH
2009-12-17  1:15 ` [85/90] matroxfb: fix problems with display stability Greg KH
2009-12-17  1:15 ` [86/90] net: Fix userspace RTM_NEWLINK notifications Greg KH
2009-12-17  1:15 ` [87/90] sysctl_max_map_count should be non-negative Greg KH
2009-12-17  1:15 ` [88/90] thinkpad-acpi: fix default brightness_mode for R50e/R51 Greg KH
2009-12-17  1:15 ` [89/90] thinkpad-acpi: preserve rfkill state across suspend/resume Greg KH
2009-12-17  1:15 ` [90/90] V4L/DVB (13116): gspca - ov519: Webcam 041e:4067 added Greg KH

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20091217011603.095665584@mini.kroah.org \
    --to=gregkh@suse.de \
    --cc=ak@linux.intel.com \
    --cc=akpm@linux-foundation.org \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=apw@canonical.com \
    --cc=fengguang.wu@intel.com \
    --cc=hugh.dickins@tiscali.co.uk \
    --cc=lee.schermerhorn@hp.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mel@csn.ul.ie \
    --cc=n-horiguchi@ah.jp.nec.com \
    --cc=rientjes@google.com \
    --cc=stable-review@kernel.org \
    --cc=stable@kernel.org \
    --cc=torvalds@linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®