Re: [PATCH] replace various uses of num_physpages by totalram_pages

From: Amerigo Wang
Date: Wed Jul 01 2009 - 03:41:45 EST


On Tue, Jun 30, 2009 at 12:08:32PM +0100, Jan Beulich wrote:
>Sizing of memory allocations shouldn't depend on the number of physical
>pages found in a system, as that generally include (perhaps a huge
>amount of) non-RAM pages. The amount of what actually is usable as
>storage should instead be used as a basis here.


For this part, ACK.

>
>In line with that, the memory hotplug code should update num_physpages
>in a way that it retains its original (post-boot) meaning; in
>particular, decreasing the value should at best be done with great care
>- this patch doesn't try to ever decrease this value at all as it
>doesn't really seem meaningful to do so.


Could you please split this part out and send it with Cc: to linux-mm
mailing list?

Thanks.

>
>Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>
>
>---
> drivers/char/agp/backend.c | 4 ++--
> drivers/parisc/ccio-dma.c | 4 ++--
> drivers/parisc/sba_iommu.c | 4 ++--
> drivers/xen/balloon.c | 4 ----
> fs/ntfs/malloc.h | 2 +-
> include/linux/mm.h | 1 +
> init/main.c | 4 ++--
> mm/memory_hotplug.c | 6 ++++--
> mm/slab.c | 2 +-
> mm/swap.c | 2 +-
> mm/vmalloc.c | 4 ++--
> net/core/sock.c | 4 ++--
> net/dccp/proto.c | 6 +++---
> net/decnet/dn_route.c | 2 +-
> net/ipv4/route.c | 2 +-
> net/ipv4/tcp.c | 4 ++--
> net/netfilter/nf_conntrack_core.c | 4 ++--
> net/netfilter/x_tables.c | 2 +-
> net/netfilter/xt_hashlimit.c | 8 ++++----
> net/netlink/af_netlink.c | 6 +++---
> net/sctp/protocol.c | 6 +++---
> 21 files changed, 40 insertions(+), 41 deletions(-)
>
>--- linux-2.6.31-rc1/drivers/char/agp/backend.c 2009-06-26 17:49:43.000000000 +0200
>+++ 2.6.31-rc1-use-totalram_pages/drivers/char/agp/backend.c 2009-06-24 16:09:34.000000000 +0200
>@@ -114,9 +114,9 @@ static int agp_find_max(void)
> long memory, index, result;
>
> #if PAGE_SHIFT < 20
>- memory = num_physpages >> (20 - PAGE_SHIFT);
>+ memory = totalram_pages >> (20 - PAGE_SHIFT);
> #else
>- memory = num_physpages << (PAGE_SHIFT - 20);
>+ memory = totalram_pages << (PAGE_SHIFT - 20);
> #endif
> index = 1;
>
>--- linux-2.6.31-rc1/drivers/parisc/ccio-dma.c 2009-06-10 05:05:27.000000000 +0200
>+++ 2.6.31-rc1-use-totalram_pages/drivers/parisc/ccio-dma.c 2009-06-24 16:10:47.000000000 +0200
>@@ -1267,7 +1267,7 @@ ccio_ioc_init(struct ioc *ioc)
> ** Hot-Plug/Removal of PCI cards. (aka PCI OLARD).
> */
>
>- iova_space_size = (u32) (num_physpages / count_parisc_driver(&ccio_driver));
>+ iova_space_size = (u32) (totalram_pages / count_parisc_driver(&ccio_driver));
>
> /* limit IOVA space size to 1MB-1GB */
>
>@@ -1306,7 +1306,7 @@ ccio_ioc_init(struct ioc *ioc)
>
> DBG_INIT("%s() hpa 0x%p mem %luMB IOV %dMB (%d bits)\n",
> __func__, ioc->ioc_regs,
>- (unsigned long) num_physpages >> (20 - PAGE_SHIFT),
>+ (unsigned long) totalram_pages >> (20 - PAGE_SHIFT),
> iova_space_size>>20,
> iov_order + PAGE_SHIFT);
>
>--- linux-2.6.31-rc1/drivers/parisc/sba_iommu.c 2009-06-26 17:49:47.000000000 +0200
>+++ 2.6.31-rc1-use-totalram_pages/drivers/parisc/sba_iommu.c 2009-06-24 16:10:58.000000000 +0200
>@@ -1390,7 +1390,7 @@ sba_ioc_init(struct parisc_device *sba,
> ** for DMA hints - ergo only 30 bits max.
> */
>
>- iova_space_size = (u32) (num_physpages/global_ioc_cnt);
>+ iova_space_size = (u32) (totalram_pages/global_ioc_cnt);
>
> /* limit IOVA space size to 1MB-1GB */
> if (iova_space_size < (1 << (20 - PAGE_SHIFT))) {
>@@ -1415,7 +1415,7 @@ sba_ioc_init(struct parisc_device *sba,
> DBG_INIT("%s() hpa 0x%lx mem %ldMB IOV %dMB (%d bits)\n",
> __func__,
> ioc->ioc_hpa,
>- (unsigned long) num_physpages >> (20 - PAGE_SHIFT),
>+ (unsigned long) totalram_pages >> (20 - PAGE_SHIFT),
> iova_space_size>>20,
> iov_order + PAGE_SHIFT);
>
>--- linux-2.6.31-rc1/drivers/xen/balloon.c 2009-06-10 05:05:27.000000000 +0200
>+++ 2.6.31-rc1-use-totalram_pages/drivers/xen/balloon.c 2009-06-24 16:02:01.000000000 +0200
>@@ -96,11 +96,7 @@ static struct balloon_stats balloon_stat
> /* We increase/decrease in batches which fit in a page */
> static unsigned long frame_list[PAGE_SIZE / sizeof(unsigned long)];
>
>-/* VM /proc information for memory */
>-extern unsigned long totalram_pages;
>-
> #ifdef CONFIG_HIGHMEM
>-extern unsigned long totalhigh_pages;
> #define inc_totalhigh_pages() (totalhigh_pages++)
> #define dec_totalhigh_pages() (totalhigh_pages--)
> #else
>--- linux-2.6.31-rc1/fs/ntfs/malloc.h 2008-04-17 04:49:44.000000000 +0200
>+++ 2.6.31-rc1-use-totalram_pages/fs/ntfs/malloc.h 2009-06-24 16:11:49.000000000 +0200
>@@ -47,7 +47,7 @@ static inline void *__ntfs_malloc(unsign
> return kmalloc(PAGE_SIZE, gfp_mask & ~__GFP_HIGHMEM);
> /* return (void *)__get_free_page(gfp_mask); */
> }
>- if (likely(size >> PAGE_SHIFT < num_physpages))
>+ if (likely((size >> PAGE_SHIFT) < totalram_pages))
> return __vmalloc(size, gfp_mask, PAGE_KERNEL);
> return NULL;
> }
>--- linux-2.6.31-rc1/include/linux/mm.h 2009-06-26 17:50:00.000000000 +0200
>+++ 2.6.31-rc1-use-totalram_pages/include/linux/mm.h 2009-06-24 16:00:50.000000000 +0200
>@@ -25,6 +25,7 @@ extern unsigned long max_mapnr;
> #endif
>
> extern unsigned long num_physpages;
>+extern unsigned long totalram_pages;
> extern void * high_memory;
> extern int page_cluster;
>
>--- linux-2.6.31-rc1/init/main.c 2009-06-26 17:50:00.000000000 +0200
>+++ 2.6.31-rc1-use-totalram_pages/init/main.c 2009-06-24 16:12:30.000000000 +0200
>@@ -691,12 +691,12 @@ asmlinkage void __init start_kernel(void
> #endif
> thread_info_cache_init();
> cred_init();
>- fork_init(num_physpages);
>+ fork_init(totalram_pages);
> proc_caches_init();
> buffer_init();
> key_init();
> security_init();
>- vfs_caches_init(num_physpages);
>+ vfs_caches_init(totalram_pages);
> radix_tree_init();
> signals_init();
> /* rootfs populating might need page-writeback */
>--- linux-2.6.31-rc1/mm/memory_hotplug.c 2009-06-26 17:50:00.000000000 +0200
>+++ 2.6.31-rc1-use-totalram_pages/mm/memory_hotplug.c 2009-06-24 16:04:44.000000000 +0200
>@@ -339,8 +339,11 @@ EXPORT_SYMBOL_GPL(__remove_pages);
>
> void online_page(struct page *page)
> {
>+ unsigned long pfn = page_to_pfn(page);
>+
> totalram_pages++;
>- num_physpages++;
>+ if (pfn >= num_physpages)
>+ num_physpages = pfn + 1;
>
> #ifdef CONFIG_HIGHMEM
> if (PageHighMem(page))
>@@ -831,7 +834,6 @@ repeat:
> zone->present_pages -= offlined_pages;
> zone->zone_pgdat->node_present_pages -= offlined_pages;
> totalram_pages -= offlined_pages;
>- num_physpages -= offlined_pages;
>
> setup_per_zone_wmarks();
> calculate_zone_inactive_ratio(zone);
>--- linux-2.6.31-rc1/mm/slab.c 2009-06-26 17:50:00.000000000 +0200
>+++ 2.6.31-rc1-use-totalram_pages/mm/slab.c 2009-06-24 16:06:21.000000000 +0200
>@@ -1384,7 +1384,7 @@ void __init kmem_cache_init(void)
> * Fragmentation resistance on low memory - only use bigger
> * page orders on machines with more than 32MB of memory.
> */
>- if (num_physpages > (32 << 20) >> PAGE_SHIFT)
>+ if (totalram_pages > (32 << 20) >> PAGE_SHIFT)
> slab_break_gfp_order = BREAK_GFP_ORDER_HI;
>
> /* Bootstrap is tricky, because several objects are allocated
>--- linux-2.6.31-rc1/mm/swap.c 2009-06-10 05:05:27.000000000 +0200
>+++ 2.6.31-rc1-use-totalram_pages/mm/swap.c 2009-06-24 16:06:40.000000000 +0200
>@@ -496,7 +496,7 @@ EXPORT_SYMBOL(pagevec_lookup_tag);
> */
> void __init swap_setup(void)
> {
>- unsigned long megs = num_physpages >> (20 - PAGE_SHIFT);
>+ unsigned long megs = totalram_pages >> (20 - PAGE_SHIFT);
>
> #ifdef CONFIG_SWAP
> bdi_init(swapper_space.backing_dev_info);
>--- linux-2.6.31-rc1/mm/vmalloc.c 2009-06-26 17:50:00.000000000 +0200
>+++ 2.6.31-rc1-use-totalram_pages/mm/vmalloc.c 2009-06-24 16:05:47.000000000 +0200
>@@ -1368,7 +1368,7 @@ void *vmap(struct page **pages, unsigned
>
> might_sleep();
>
>- if (count > num_physpages)
>+ if (count > totalram_pages)
> return NULL;
>
> area = get_vm_area_caller((count << PAGE_SHIFT), flags,
>@@ -1475,7 +1475,7 @@ static void *__vmalloc_node(unsigned lon
> unsigned long real_size = size;
>
> size = PAGE_ALIGN(size);
>- if (!size || (size >> PAGE_SHIFT) > num_physpages)
>+ if (!size || (size >> PAGE_SHIFT) > totalram_pages)
> return NULL;
>
> area = __get_vm_area_node(size, VM_ALLOC, VMALLOC_START, VMALLOC_END,
>--- linux-2.6.31-rc1/net/core/sock.c 2009-06-26 17:50:00.000000000 +0200
>+++ 2.6.31-rc1-use-totalram_pages/net/core/sock.c 2009-06-24 16:14:00.000000000 +0200
>@@ -1169,12 +1169,12 @@ EXPORT_SYMBOL_GPL(sk_setup_caps);
>
> void __init sk_init(void)
> {
>- if (num_physpages <= 4096) {
>+ if (totalram_pages <= 4096) {
> sysctl_wmem_max = 32767;
> sysctl_rmem_max = 32767;
> sysctl_wmem_default = 32767;
> sysctl_rmem_default = 32767;
>- } else if (num_physpages >= 131072) {
>+ } else if (totalram_pages >= 131072) {
> sysctl_wmem_max = 131071;
> sysctl_rmem_max = 131071;
> }
>--- linux-2.6.31-rc1/net/dccp/proto.c 2009-06-10 05:05:27.000000000 +0200
>+++ 2.6.31-rc1-use-totalram_pages/net/dccp/proto.c 2009-06-24 16:13:35.000000000 +0200
>@@ -1049,10 +1049,10 @@ static int __init dccp_init(void)
> *
> * The methodology is similar to that of the buffer cache.
> */
>- if (num_physpages >= (128 * 1024))
>- goal = num_physpages >> (21 - PAGE_SHIFT);
>+ if (totalram_pages >= (128 * 1024))
>+ goal = totalram_pages >> (21 - PAGE_SHIFT);
> else
>- goal = num_physpages >> (23 - PAGE_SHIFT);
>+ goal = totalram_pages >> (23 - PAGE_SHIFT);
>
> if (thash_entries)
> goal = (thash_entries *
>--- linux-2.6.31-rc1/net/decnet/dn_route.c 2009-06-26 17:50:00.000000000 +0200
>+++ 2.6.31-rc1-use-totalram_pages/net/decnet/dn_route.c 2009-06-24 16:17:11.000000000 +0200
>@@ -1750,7 +1750,7 @@ void __init dn_route_init(void)
> dn_route_timer.expires = jiffies + decnet_dst_gc_interval * HZ;
> add_timer(&dn_route_timer);
>
>- goal = num_physpages >> (26 - PAGE_SHIFT);
>+ goal = totalram_pages >> (26 - PAGE_SHIFT);
>
> for(order = 0; (1UL << order) < goal; order++)
> /* NOTHING */;
>--- linux-2.6.31-rc1/net/ipv4/route.c 2009-06-26 17:50:00.000000000 +0200
>+++ 2.6.31-rc1-use-totalram_pages/net/ipv4/route.c 2009-06-24 16:14:48.000000000 +0200
>@@ -3412,7 +3412,7 @@ int __init ip_rt_init(void)
> alloc_large_system_hash("IP route cache",
> sizeof(struct rt_hash_bucket),
> rhash_entries,
>- (num_physpages >= 128 * 1024) ?
>+ (totalram_pages >= 128 * 1024) ?
> 15 : 17,
> 0,
> &rt_hash_log,
>--- linux-2.6.31-rc1/net/ipv4/tcp.c 2009-06-26 17:50:00.000000000 +0200
>+++ 2.6.31-rc1-use-totalram_pages/net/ipv4/tcp.c 2009-06-24 16:14:24.000000000 +0200
>@@ -2857,7 +2857,7 @@ void __init tcp_init(void)
> alloc_large_system_hash("TCP established",
> sizeof(struct inet_ehash_bucket),
> thash_entries,
>- (num_physpages >= 128 * 1024) ?
>+ (totalram_pages >= 128 * 1024) ?
> 13 : 15,
> 0,
> &tcp_hashinfo.ehash_size,
>@@ -2874,7 +2874,7 @@ void __init tcp_init(void)
> alloc_large_system_hash("TCP bind",
> sizeof(struct inet_bind_hashbucket),
> tcp_hashinfo.ehash_size,
>- (num_physpages >= 128 * 1024) ?
>+ (totalram_pages >= 128 * 1024) ?
> 13 : 15,
> 0,
> &tcp_hashinfo.bhash_size,
>--- linux-2.6.31-rc1/net/netfilter/nf_conntrack_core.c 2009-06-26 17:50:00.000000000 +0200
>+++ 2.6.31-rc1-use-totalram_pages/net/netfilter/nf_conntrack_core.c 2009-06-24 16:16:47.000000000 +0200
>@@ -1230,9 +1230,9 @@ static int nf_conntrack_init_init_net(vo
> * machine has 512 buckets. >= 1GB machines have 16384 buckets. */
> if (!nf_conntrack_htable_size) {
> nf_conntrack_htable_size
>- = (((num_physpages << PAGE_SHIFT) / 16384)
>+ = (((totalram_pages << PAGE_SHIFT) / 16384)
> / sizeof(struct hlist_head));
>- if (num_physpages > (1024 * 1024 * 1024 / PAGE_SIZE))
>+ if (totalram_pages > (1024 * 1024 * 1024 / PAGE_SIZE))
> nf_conntrack_htable_size = 16384;
> if (nf_conntrack_htable_size < 32)
> nf_conntrack_htable_size = 32;
>--- linux-2.6.31-rc1/net/netfilter/x_tables.c 2009-06-26 17:50:00.000000000 +0200
>+++ 2.6.31-rc1-use-totalram_pages/net/netfilter/x_tables.c 2009-06-24 16:16:28.000000000 +0200
>@@ -617,7 +617,7 @@ struct xt_table_info *xt_alloc_table_inf
> int cpu;
>
> /* Pedantry: prevent them from hitting BUG() in vmalloc.c --RR */
>- if ((SMP_ALIGN(size) >> PAGE_SHIFT) + 2 > num_physpages)
>+ if ((SMP_ALIGN(size) >> PAGE_SHIFT) + 2 > totalram_pages)
> return NULL;
>
> newinfo = kzalloc(XT_TABLE_INFO_SZ, GFP_KERNEL);
>--- linux-2.6.31-rc1/net/netfilter/xt_hashlimit.c 2009-06-10 05:05:27.000000000 +0200
>+++ 2.6.31-rc1-use-totalram_pages/net/netfilter/xt_hashlimit.c 2009-06-24 16:16:07.000000000 +0200
>@@ -194,9 +194,9 @@ static int htable_create_v0(struct xt_ha
> if (minfo->cfg.size)
> size = minfo->cfg.size;
> else {
>- size = ((num_physpages << PAGE_SHIFT) / 16384) /
>+ size = ((totalram_pages << PAGE_SHIFT) / 16384) /
> sizeof(struct list_head);
>- if (num_physpages > (1024 * 1024 * 1024 / PAGE_SIZE))
>+ if (totalram_pages > (1024 * 1024 * 1024 / PAGE_SIZE))
> size = 8192;
> if (size < 16)
> size = 16;
>@@ -266,9 +266,9 @@ static int htable_create(struct xt_hashl
> if (minfo->cfg.size) {
> size = minfo->cfg.size;
> } else {
>- size = (num_physpages << PAGE_SHIFT) / 16384 /
>+ size = (totalram_pages << PAGE_SHIFT) / 16384 /
> sizeof(struct list_head);
>- if (num_physpages > 1024 * 1024 * 1024 / PAGE_SIZE)
>+ if (totalram_pages > 1024 * 1024 * 1024 / PAGE_SIZE)
> size = 8192;
> if (size < 16)
> size = 16;
>--- linux-2.6.31-rc1/net/netlink/af_netlink.c 2009-06-26 17:50:00.000000000 +0200
>+++ 2.6.31-rc1-use-totalram_pages/net/netlink/af_netlink.c 2009-06-24 16:17:28.000000000 +0200
>@@ -2026,10 +2026,10 @@ static int __init netlink_proto_init(voi
> if (!nl_table)
> goto panic;
>
>- if (num_physpages >= (128 * 1024))
>- limit = num_physpages >> (21 - PAGE_SHIFT);
>+ if (totalram_pages >= (128 * 1024))
>+ limit = totalram_pages >> (21 - PAGE_SHIFT);
> else
>- limit = num_physpages >> (23 - PAGE_SHIFT);
>+ limit = totalram_pages >> (23 - PAGE_SHIFT);
>
> order = get_bitmask_order(limit) - 1 + PAGE_SHIFT;
> limit = (1UL << order) / sizeof(struct hlist_head);
>--- linux-2.6.31-rc1/net/sctp/protocol.c 2009-06-26 17:50:00.000000000 +0200
>+++ 2.6.31-rc1-use-totalram_pages/net/sctp/protocol.c 2009-06-24 16:15:36.000000000 +0200
>@@ -1185,10 +1185,10 @@ SCTP_STATIC __init int sctp_init(void)
> /* Size and allocate the association hash table.
> * The methodology is similar to that of the tcp hash tables.
> */
>- if (num_physpages >= (128 * 1024))
>- goal = num_physpages >> (22 - PAGE_SHIFT);
>+ if (totalram_pages >= (128 * 1024))
>+ goal = totalram_pages >> (22 - PAGE_SHIFT);
> else
>- goal = num_physpages >> (24 - PAGE_SHIFT);
>+ goal = totalram_pages >> (24 - PAGE_SHIFT);
>
> for (order = 0; (1UL << order) < goal; order++)
> ;
>
>
>--
>To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
>the body of a message to majordomo@xxxxxxxxxxxxxxx
>More majordomo info at http://vger.kernel.org/majordomo-info.html
>Please read the FAQ at http://www.tux.org/lkml/
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/