From patchwork Wed Oct 31 11:23:12 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wen Congyang X-Patchwork-Id: 1678611 Return-Path: X-Original-To: patchwork-linux-acpi@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork2.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork2.kernel.org (Postfix) with ESMTP id 12B52DF2F6 for ; Wed, 31 Oct 2012 11:48:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933957Ab2JaLsb (ORCPT ); Wed, 31 Oct 2012 07:48:31 -0400 Received: from cn.fujitsu.com ([222.73.24.84]:55903 "EHLO song.cn.fujitsu.com" rhost-flags-OK-FAIL-OK-OK) by vger.kernel.org with ESMTP id S932711Ab2JaLs1 (ORCPT ); Wed, 31 Oct 2012 07:48:27 -0400 X-IronPort-AV: E=Sophos;i="4.80,687,1344182400"; d="scan'208";a="6108901" Received: from unknown (HELO tang.cn.fujitsu.com) ([10.167.250.3]) by song.cn.fujitsu.com with ESMTP; 31 Oct 2012 19:46:46 +0800 Received: from fnstmail02.fnst.cn.fujitsu.com (tang.cn.fujitsu.com [127.0.0.1]) by tang.cn.fujitsu.com (8.14.3/8.13.1) with ESMTP id q9VBHSlv026748; Wed, 31 Oct 2012 19:17:34 +0800 Received: from ghost.fnst.cn.fujitsu.com ([10.167.225.226]) by fnstmail02.fnst.cn.fujitsu.com (Lotus Domino Release 8.5.3) with ESMTP id 2012103119164519-879581 ; Wed, 31 Oct 2012 19:16:45 +0800 From: Wen Congyang To: linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-acpi@vger.kernel.org Cc: Jiang Liu , Len Brown , Andrew Morton , KOSAKI Motohiro , Yasuaki Ishimatsu , rjw@sisk.pl, Lai Jiangshan , Wen Congyang , David Rientjes , Minchan Kim Subject: [Patch v4 6/8] clear the memory to store struct page Date: Wed, 31 Oct 2012 19:23:12 +0800 Message-Id: <1351682594-17347-7-git-send-email-wency@cn.fujitsu.com> X-Mailer: git-send-email 1.8.0 In-Reply-To: <1351682594-17347-1-git-send-email-wency@cn.fujitsu.com> References: <1351682594-17347-1-git-send-email-wency@cn.fujitsu.com> X-MIMETrack: Itemize by SMTP Server on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2012/10/31 19:16:45, Serialize by Router on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2012/10/31 19:16:51, Serialize complete at 2012/10/31 19:16:51 Sender: linux-acpi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-acpi@vger.kernel.org If sparse memory vmemmap is enabled, we can't free the memory to store struct page when a memory device is hotremoved, because we may store struct page in the memory to manage the memory which doesn't belong to this memory device. When we hotadded this memory device again, we will reuse this memory to store struct page, and struct page may contain some obsolete information, and we will get bad-page state: [ 59.611278] init_memory_mapping: [mem 0x80000000-0x9fffffff] [ 59.637836] Built 2 zonelists in Node order, mobility grouping on. Total pages: 547617 [ 59.638739] Policy zone: Normal [ 59.650840] BUG: Bad page state in process bash pfn:9b6dc [ 59.651124] page:ffffea0002200020 count:0 mapcount:0 mapping: (null) index:0xfdfdfdfdfdfdfdfd [ 59.651494] page flags: 0x2fdfdfdfd5df9fd(locked|referenced|uptodate|dirty|lru|active|slab|owner_priv_1|private|private_2|writeback|head|tail|swapcache|reclaim|swapbacked|unevictable|uncached|compound_lock) [ 59.653604] Modules linked in: netconsole acpiphp pci_hotplug acpi_memhotplug loop kvm_amd kvm microcode tpm_tis tpm tpm_bios evdev psmouse serio_raw i2c_piix4 i2c_core parport_pc parport processor button thermal_sys ext3 jbd mbcache sg sr_mod cdrom ata_generic virtio_net ata_piix virtio_blk libata virtio_pci virtio_ring virtio scsi_mod [ 59.656998] Pid: 988, comm: bash Not tainted 3.6.0-rc7-guest #12 [ 59.657172] Call Trace: [ 59.657275] [] ? bad_page+0xb0/0x100 [ 59.657434] [] ? free_pages_prepare+0xb3/0x100 [ 59.657610] [] ? free_hot_cold_page+0x48/0x1a0 [ 59.657787] [] ? online_pages_range+0x68/0xa0 [ 59.657961] [] ? __online_page_increment_counters+0x10/0x10 [ 59.658162] [] ? walk_system_ram_range+0x101/0x110 [ 59.658346] [] ? online_pages+0x1a5/0x2b0 [ 59.658515] [] ? __memory_block_change_state+0x20d/0x270 [ 59.658710] [] ? store_mem_state+0xb6/0xf0 [ 59.658878] [] ? sysfs_write_file+0xd2/0x160 [ 59.659052] [] ? vfs_write+0xaa/0x160 [ 59.659212] [] ? sys_write+0x47/0x90 [ 59.659371] [] ? async_page_fault+0x25/0x30 [ 59.659543] [] ? system_call_fastpath+0x16/0x1b [ 59.659720] Disabling lock debugging due to kernel taint This patch clears the memory to store struct page to avoid unexpected error. CC: David Rientjes CC: Jiang Liu Cc: Minchan Kim CC: Andrew Morton Acked-by: KOSAKI Motohiro CC: Yasuaki Ishimatsu Reported-by: Vasilis Liaskovitis Signed-off-by: Wen Congyang --- mm/sparse.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mm/sparse.c b/mm/sparse.c index fac95f2..0021265 100644 --- a/mm/sparse.c +++ b/mm/sparse.c @@ -638,7 +638,6 @@ static struct page *__kmalloc_section_memmap(unsigned long nr_pages) got_map_page: ret = (struct page *)pfn_to_kaddr(page_to_pfn(page)); got_map_ptr: - memset(ret, 0, memmap_size); return ret; } @@ -760,6 +759,8 @@ int __meminit sparse_add_one_section(struct zone *zone, unsigned long start_pfn, goto out; } + memset(memmap, 0, sizeof(struct page) * nr_pages); + ms->section_mem_map |= SECTION_MARKED_PRESENT; ret = sparse_init_one_section(ms, section_nr, memmap, usemap);