All of lore.kernel.org
 help / color / mirror / Atom feed
From: Wu Fengguang <fengguang.wu@intel.com>
To: "Zheng, Shaohui" <shaohui.zheng@intel.com>
Cc: "linux-mm@kvack.org" <linux-mm@kvack.org>,
	"akpm@linux-foundation.org" <akpm@linux-foundation.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"ak@linux.intel.com" <ak@linux.intel.com>,
	"y-goto@jp.fujitsu.com" <y-goto@jp.fujitsu.com>,
	Dave Hansen <haveblue@us.ibm.com>,
	"x86@kernel.org" <x86@kernel.org>,
	KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Subject: Re: [PATCH - resend] Memory-Hotplug: Fix the bug on interface /dev/mem for 64-bit kernel(v1)
Date: Fri, 8 Jan 2010 20:48:51 +0800	[thread overview]
Message-ID: <20100108124851.GB6153@localhost> (raw)
In-Reply-To: <DA586906BA1FFC4384FCFD6429ECE86031560BAC@shzsmsx502.ccr.corp.intel.com>

On Fri, Jan 08, 2010 at 11:32:07AM +0800, Zheng, Shaohui wrote:
> Resend the patch to the mailing-list, the original patch URL is 
> http://patchwork.kernel.org/patch/69075/, it is not accepted without comments,
> sent it again to review.
> 
> Memory-Hotplug: Fix the bug on interface /dev/mem for 64-bit kernel
> 
> The new added memory can not be access by interface /dev/mem, because we do not
>  update the variable high_memory. This patch add a new e820 entry in e820 table,
>  and update max_pfn, max_low_pfn and high_memory.
> 
> We add a function update_pfn in file arch/x86/mm/init.c to udpate these
>  varibles. Memory hotplug does not make sense on 32-bit kernel, so we did not
>  concern it in this function.
> 
> Signed-off-by: Shaohui Zheng <shaohui.zheng@intel.com>
> CC: Andi Kleen <ak@linux.intel.com>
> CC: Wu Fengguang <fengguang.wu@intel.com>
> CC: Li Haicheng <Haicheng.li@intel.com>
> 
> ---
> diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c
> index f50447d..b986246 100644
> --- a/arch/x86/kernel/e820.c
> +++ b/arch/x86/kernel/e820.c
> @@ -110,8 +110,8 @@ int __init e820_all_mapped(u64 start, u64 end, unsigned type)
>  /*
>   * Add a memory region to the kernel e820 map.
>   */
> -static void __init __e820_add_region(struct e820map *e820x, u64 start, u64 size,
> -					 int type)
> +static void __meminit __e820_add_region(struct e820map *e820x, u64 start,
> +					 u64 size, int type)
>  {
>  	int x = e820x->nr_map;
>  
> @@ -126,7 +126,7 @@ static void __init __e820_add_region(struct e820map *e820x, u64 start, u64 size,
>  	e820x->nr_map++;
>  }
>  
> -void __init e820_add_region(u64 start, u64 size, int type)
> +void __meminit e820_add_region(u64 start, u64 size, int type)
>  {
>  	__e820_add_region(&e820, start, size, type);
>  }
> diff --git a/arch/x86/mm/init.c b/arch/x86/mm/init.c
> index d406c52..0474459 100644
> --- a/arch/x86/mm/init.c
> +++ b/arch/x86/mm/init.c
> @@ -1,6 +1,7 @@
>  #include <linux/initrd.h>
>  #include <linux/ioport.h>
>  #include <linux/swap.h>
> +#include <linux/bootmem.h>
>  
>  #include <asm/cacheflush.h>
>  #include <asm/e820.h>
> @@ -386,3 +387,30 @@ void free_initrd_mem(unsigned long start, unsigned long end)
>  	free_init_pages("initrd memory", start, end);
>  }
>  #endif
> +
> +/**
> + * After memory hotplug, the variable max_pfn, max_low_pfn and high_memory will
> + * be affected, it will be updated in this function. Memory hotplug does not
> + * make sense on 32-bit kernel, so we do did not concern it in this function.
> + */
> +void __meminit __attribute__((weak)) update_pfn(u64 start, u64 size)
> +{
> +#ifdef CONFIG_X86_64
> +	unsigned long limit_low_pfn = 1UL<<(32 - PAGE_SHIFT);
> +	unsigned long start_pfn = start >> PAGE_SHIFT;
> +	unsigned long end_pfn = (start + size) >> PAGE_SHIFT;

Strictly speaking, should use "end_pfn = PFN_UP(start + size);".

> +	if (end_pfn > max_pfn) {
> +		max_pfn = end_pfn;
> +		high_memory = (void *)__va(max_pfn * PAGE_SIZE - 1) + 1;
> +	}
> +
> +	/* if add to low memory, update max_low_pfn */
> +	if (unlikely(start_pfn < limit_low_pfn)) {
> +		if (end_pfn <= limit_low_pfn)
> +			max_low_pfn = end_pfn;
> +		else
> +			max_low_pfn = limit_low_pfn;

X86_64 actually always set max_low_pfn=max_pfn, in setup_arch():

 899 #ifdef CONFIG_X86_64
 900         if (max_pfn > max_low_pfn) {
 901                 max_pfn_mapped = init_memory_mapping(1UL<<32,
 902                                                      max_pfn<<PAGE_SHIFT);
 903                 /* can we preseve max_low_pfn ?*/
 904                 max_low_pfn = max_pfn;
 905         }
 906 #endif

max_low_pfn is used in

- e820_mark_nosave_regions(max_low_pfn);
- dump_pagetable()
- blk_queue_bounce_limit()
- increase_reservation()

and _seems_ to mean "end of direct addressable pfn".

> +	}
> +#endif /* CONFIG_X86_64 */
> +}
> diff --git a/include/linux/bootmem.h b/include/linux/bootmem.h
> index b10ec49..6693414 100644
> --- a/include/linux/bootmem.h
> +++ b/include/linux/bootmem.h
> @@ -13,6 +13,7 @@
>  
>  extern unsigned long max_low_pfn;
>  extern unsigned long min_low_pfn;
> +extern void update_pfn(u64 start, u64 size);
>  
>  /*
>   * highest page
> diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
> index 030ce8a..ee7b2d6 100644
> --- a/mm/memory_hotplug.c
> +++ b/mm/memory_hotplug.c
> @@ -523,6 +523,14 @@ int __ref add_memory(int nid, u64 start, u64 size)
>  		BUG_ON(ret);
>  	}
>  
> +	/* update e820 table */

This comment can be eliminated - you already have the very readable printk :)

> +	printk(KERN_INFO "Adding memory region to e820 table (start:%016Lx, size:%016Lx).\n",
> +			 (unsigned long long)start, (unsigned long long)size);
> +	e820_add_region(start, size, E820_RAM);

> +	/* update max_pfn, max_low_pfn and high_memory */
> +	update_pfn(start, size);

How about renaming function to update_end_of_memory_vars()?

Thanks,
Fengguang

WARNING: multiple messages have this Message-ID (diff)
From: Wu Fengguang <fengguang.wu@intel.com>
To: "Zheng, Shaohui" <shaohui.zheng@intel.com>
Cc: "linux-mm@kvack.org" <linux-mm@kvack.org>,
	"akpm@linux-foundation.org" <akpm@linux-foundation.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"ak@linux.intel.com" <ak@linux.intel.com>,
	"y-goto@jp.fujitsu.com" <y-goto@jp.fujitsu.com>,
	Dave Hansen <haveblue@us.ibm.com>,
	"x86@kernel.org" <x86@kernel.org>,
	KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Subject: Re: [PATCH - resend] Memory-Hotplug: Fix the bug on interface /dev/mem for 64-bit kernel(v1)
Date: Fri, 8 Jan 2010 20:48:51 +0800	[thread overview]
Message-ID: <20100108124851.GB6153@localhost> (raw)
In-Reply-To: <DA586906BA1FFC4384FCFD6429ECE86031560BAC@shzsmsx502.ccr.corp.intel.com>

On Fri, Jan 08, 2010 at 11:32:07AM +0800, Zheng, Shaohui wrote:
> Resend the patch to the mailing-list, the original patch URL is 
> http://patchwork.kernel.org/patch/69075/, it is not accepted without comments,
> sent it again to review.
> 
> Memory-Hotplug: Fix the bug on interface /dev/mem for 64-bit kernel
> 
> The new added memory can not be access by interface /dev/mem, because we do not
>  update the variable high_memory. This patch add a new e820 entry in e820 table,
>  and update max_pfn, max_low_pfn and high_memory.
> 
> We add a function update_pfn in file arch/x86/mm/init.c to udpate these
>  varibles. Memory hotplug does not make sense on 32-bit kernel, so we did not
>  concern it in this function.
> 
> Signed-off-by: Shaohui Zheng <shaohui.zheng@intel.com>
> CC: Andi Kleen <ak@linux.intel.com>
> CC: Wu Fengguang <fengguang.wu@intel.com>
> CC: Li Haicheng <Haicheng.li@intel.com>
> 
> ---
> diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c
> index f50447d..b986246 100644
> --- a/arch/x86/kernel/e820.c
> +++ b/arch/x86/kernel/e820.c
> @@ -110,8 +110,8 @@ int __init e820_all_mapped(u64 start, u64 end, unsigned type)
>  /*
>   * Add a memory region to the kernel e820 map.
>   */
> -static void __init __e820_add_region(struct e820map *e820x, u64 start, u64 size,
> -					 int type)
> +static void __meminit __e820_add_region(struct e820map *e820x, u64 start,
> +					 u64 size, int type)
>  {
>  	int x = e820x->nr_map;
>  
> @@ -126,7 +126,7 @@ static void __init __e820_add_region(struct e820map *e820x, u64 start, u64 size,
>  	e820x->nr_map++;
>  }
>  
> -void __init e820_add_region(u64 start, u64 size, int type)
> +void __meminit e820_add_region(u64 start, u64 size, int type)
>  {
>  	__e820_add_region(&e820, start, size, type);
>  }
> diff --git a/arch/x86/mm/init.c b/arch/x86/mm/init.c
> index d406c52..0474459 100644
> --- a/arch/x86/mm/init.c
> +++ b/arch/x86/mm/init.c
> @@ -1,6 +1,7 @@
>  #include <linux/initrd.h>
>  #include <linux/ioport.h>
>  #include <linux/swap.h>
> +#include <linux/bootmem.h>
>  
>  #include <asm/cacheflush.h>
>  #include <asm/e820.h>
> @@ -386,3 +387,30 @@ void free_initrd_mem(unsigned long start, unsigned long end)
>  	free_init_pages("initrd memory", start, end);
>  }
>  #endif
> +
> +/**
> + * After memory hotplug, the variable max_pfn, max_low_pfn and high_memory will
> + * be affected, it will be updated in this function. Memory hotplug does not
> + * make sense on 32-bit kernel, so we do did not concern it in this function.
> + */
> +void __meminit __attribute__((weak)) update_pfn(u64 start, u64 size)
> +{
> +#ifdef CONFIG_X86_64
> +	unsigned long limit_low_pfn = 1UL<<(32 - PAGE_SHIFT);
> +	unsigned long start_pfn = start >> PAGE_SHIFT;
> +	unsigned long end_pfn = (start + size) >> PAGE_SHIFT;

Strictly speaking, should use "end_pfn = PFN_UP(start + size);".

> +	if (end_pfn > max_pfn) {
> +		max_pfn = end_pfn;
> +		high_memory = (void *)__va(max_pfn * PAGE_SIZE - 1) + 1;
> +	}
> +
> +	/* if add to low memory, update max_low_pfn */
> +	if (unlikely(start_pfn < limit_low_pfn)) {
> +		if (end_pfn <= limit_low_pfn)
> +			max_low_pfn = end_pfn;
> +		else
> +			max_low_pfn = limit_low_pfn;

X86_64 actually always set max_low_pfn=max_pfn, in setup_arch():

 899 #ifdef CONFIG_X86_64
 900         if (max_pfn > max_low_pfn) {
 901                 max_pfn_mapped = init_memory_mapping(1UL<<32,
 902                                                      max_pfn<<PAGE_SHIFT);
 903                 /* can we preseve max_low_pfn ?*/
 904                 max_low_pfn = max_pfn;
 905         }
 906 #endif

max_low_pfn is used in

- e820_mark_nosave_regions(max_low_pfn);
- dump_pagetable()
- blk_queue_bounce_limit()
- increase_reservation()

and _seems_ to mean "end of direct addressable pfn".

> +	}
> +#endif /* CONFIG_X86_64 */
> +}
> diff --git a/include/linux/bootmem.h b/include/linux/bootmem.h
> index b10ec49..6693414 100644
> --- a/include/linux/bootmem.h
> +++ b/include/linux/bootmem.h
> @@ -13,6 +13,7 @@
>  
>  extern unsigned long max_low_pfn;
>  extern unsigned long min_low_pfn;
> +extern void update_pfn(u64 start, u64 size);
>  
>  /*
>   * highest page
> diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
> index 030ce8a..ee7b2d6 100644
> --- a/mm/memory_hotplug.c
> +++ b/mm/memory_hotplug.c
> @@ -523,6 +523,14 @@ int __ref add_memory(int nid, u64 start, u64 size)
>  		BUG_ON(ret);
>  	}
>  
> +	/* update e820 table */

This comment can be eliminated - you already have the very readable printk :)

> +	printk(KERN_INFO "Adding memory region to e820 table (start:%016Lx, size:%016Lx).\n",
> +			 (unsigned long long)start, (unsigned long long)size);
> +	e820_add_region(start, size, E820_RAM);

> +	/* update max_pfn, max_low_pfn and high_memory */
> +	update_pfn(start, size);

How about renaming function to update_end_of_memory_vars()?

Thanks,
Fengguang

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

  parent reply	other threads:[~2010-01-08 13:05 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-01-08  3:32 [PATCH - resend] Memory-Hotplug: Fix the bug on interface /dev/mem for 64-bit kernel(v1) Zheng, Shaohui
2010-01-08  5:02 ` H. Peter Anvin
2010-01-08  5:02   ` H. Peter Anvin
2010-01-08  5:18   ` Zheng, Shaohui
2010-01-08  5:18     ` Zheng, Shaohui
2010-01-08 19:47   ` Andi Kleen
2010-01-08 19:47     ` Andi Kleen
2010-01-12  0:58     ` KAMEZAWA Hiroyuki
2010-01-12  0:58       ` KAMEZAWA Hiroyuki
2010-01-08 12:48 ` Wu Fengguang [this message]
2010-01-08 12:48   ` Wu Fengguang
2010-01-11  2:20   ` Zheng, Shaohui
2010-01-11  2:20     ` Zheng, Shaohui
2010-01-11 12:43     ` Wu Fengguang
2010-01-11 12:43       ` Wu Fengguang
2010-01-12  0:30       ` KAMEZAWA Hiroyuki
2010-01-12  0:30         ` KAMEZAWA Hiroyuki
2010-01-12  1:38         ` Andi Kleen
2010-01-12  1:38           ` Andi Kleen
2010-01-12  1:39           ` KAMEZAWA Hiroyuki
2010-01-12  1:39             ` KAMEZAWA Hiroyuki
2010-01-12  1:50             ` KAMEZAWA Hiroyuki
2010-01-12  1:50               ` KAMEZAWA Hiroyuki
2010-01-12  2:45               ` Wu Fengguang
2010-01-12  2:45                 ` Wu Fengguang
2010-01-12  2:33         ` Wu Fengguang
2010-01-12  2:33           ` Wu Fengguang
2010-01-12  2:39           ` KAMEZAWA Hiroyuki
2010-01-12  2:39             ` KAMEZAWA Hiroyuki
2010-01-12 13:35             ` Wu Fengguang
2010-01-12 13:35               ` Wu Fengguang
2010-01-12 23:01               ` Yinghai Lu
2010-01-12 23:01                 ` Yinghai Lu
2010-01-13  2:29                 ` Wu Fengguang
2010-01-13  2:29                   ` Wu Fengguang
2010-01-12  5:45         ` Zheng, Shaohui
2010-01-12  5:45           ` Zheng, Shaohui
2010-01-12  5:51       ` Zheng, Shaohui
2010-01-12  5:51         ` Zheng, Shaohui

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=20100108124851.GB6153@localhost \
    --to=fengguang.wu@intel.com \
    --cc=ak@linux.intel.com \
    --cc=akpm@linux-foundation.org \
    --cc=haveblue@us.ibm.com \
    --cc=kamezawa.hiroyu@jp.fujitsu.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=shaohui.zheng@intel.com \
    --cc=x86@kernel.org \
    --cc=y-goto@jp.fujitsu.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.