linux-bk/mm/numa.c
<<
>>
Prefs
   1/*
   2 * Written by Kanoj Sarcar, SGI, Aug 1999
   3 */
   4#include <linux/config.h>
   5#include <linux/kernel.h>
   6#include <linux/mm.h>
   7#include <linux/init.h>
   8#include <linux/bootmem.h>
   9#include <linux/mmzone.h>
  10#include <linux/spinlock.h>
  11
  12int numnodes = 1;       /* Initialized for UMA platforms */
  13
  14static bootmem_data_t contig_bootmem_data;
  15pg_data_t contig_page_data = { .bdata = &contig_bootmem_data };
  16
  17#ifndef CONFIG_DISCONTIGMEM
  18
  19/*
  20 * This is meant to be invoked by platforms whose physical memory starts
  21 * at a considerably higher value than 0. Examples are Super-H, ARM, m68k.
  22 * Should be invoked with paramters (0, 0, unsigned long *[], start_paddr).
  23 */
  24void __init free_area_init_node(int nid, pg_data_t *pgdat, struct page *pmap,
  25        unsigned long *zones_size, unsigned long node_start_pfn, 
  26        unsigned long *zholes_size)
  27{
  28        unsigned long size;
  29
  30        pgdat = &contig_page_data;
  31        contig_page_data.node_id = 0;
  32        contig_page_data.node_start_pfn = node_start_pfn;
  33        calculate_totalpages (&contig_page_data, zones_size, zholes_size);
  34        if (pmap == (struct page *)0) {
  35                size = (pgdat->node_size + 1) * sizeof(struct page);
  36                pmap = (struct page *) alloc_bootmem_node(pgdat, size);
  37        }
  38        contig_page_data.node_mem_map = pmap;
  39        free_area_init_core(&contig_page_data, zones_size, zholes_size);
  40        mem_map = contig_page_data.node_mem_map;
  41}
  42
  43#endif /* !CONFIG_DISCONTIGMEM */
  44
  45struct page * alloc_pages_node(int nid, unsigned int gfp_mask, unsigned int order)
  46{
  47#ifdef CONFIG_NUMA
  48        return __alloc_pages(gfp_mask, order, NODE_DATA(nid)->node_zonelists + (gfp_mask & GFP_ZONEMASK));
  49#else
  50        return alloc_pages(gfp_mask, order);
  51#endif
  52}
  53
  54#ifdef CONFIG_DISCONTIGMEM
  55
  56#define LONG_ALIGN(x) (((x)+(sizeof(long))-1)&~((sizeof(long))-1))
  57
  58/*
  59 * Nodes can be initialized parallely, in no particular order.
  60 */
  61void __init free_area_init_node(int nid, pg_data_t *pgdat, struct page *pmap,
  62        unsigned long *zones_size, unsigned long node_start_pfn, 
  63        unsigned long *zholes_size)
  64{
  65        int i;
  66        unsigned long size;
  67
  68        pgdat->node_id = nid;
  69        pgdat->node_start_pfn = node_start_pfn;
  70        calculate_totalpages (pgdat, zones_size, zholes_size);
  71        if (pmap == (struct page *)0) {
  72                size = (pgdat->node_size + 1) * sizeof(struct page); 
  73                pmap = (struct page *) alloc_bootmem_node(pgdat, size);
  74        }
  75        pgdat->node_mem_map = pmap;
  76        free_area_init_core(pgdat, zones_size, zholes_size);
  77
  78        /*
  79         * Get space for the valid bitmap.
  80         */
  81        size = 0;
  82        for (i = 0; i < MAX_NR_ZONES; i++)
  83                size += zones_size[i];
  84        size = LONG_ALIGN((size + 7) >> 3);
  85        pgdat->valid_addr_bitmap = (unsigned long *)alloc_bootmem_node(pgdat, size);
  86        memset(pgdat->valid_addr_bitmap, 0, size);
  87}
  88
  89#endif /* CONFIG_DISCONTIGMEM */
  90
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.