diff options
| author | Andrew Morton <akpm@zip.com.au> | 2002-08-27 21:04:16 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@penguin.transmeta.com> | 2002-08-27 21:04:16 -0700 |
| commit | 1cfb7a16cc57ba510d0bf63638d3f3105df1acb5 (patch) | |
| tree | 9503c6bc4d6489eb50ba5fc22db0941f4bdb695f /include/linux | |
| parent | f9da78fb663680455bd763c6b8fbc5af34beb1f2 (diff) | |
[PATCH] ensure that the per-zone locks fall in separate cachelines
Use the new max cache alignment to optimise the layout of struct zone.
struct zone goes from ~270 bytes (UP) to 768 bytes (SMP, x86). This is
not a trick which should be generally used.
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/mmzone.h | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index f62e36b902a2..f30bd4f44863 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -8,6 +8,7 @@ #include <linux/spinlock.h> #include <linux/list.h> #include <linux/wait.h> +#include <linux/cache.h> #include <asm/atomic.h> /* @@ -28,6 +29,21 @@ typedef struct free_area_struct { struct pglist_data; /* + * zone->lock and zone->lru_lock are two of the hottest locks in the kernel. + * So add a wild amount of padding here to ensure that they fall into separate + * cachelines. There are very few zone structures in the machine, so space + * consumption is not a concern here. + */ +#if defined(CONFIG_SMP) +struct zone_padding { + int x; +} ____cacheline_maxaligned_in_smp; +#define ZONE_PADDING(name) struct zone_padding name; +#else +#define ZONE_PADDING(name) +#endif + +/* * On machines where it is needed (eg PCs) we divide physical memory * into multiple physical zones. On a PC we have 3 zones: * @@ -35,6 +51,7 @@ struct pglist_data; * ZONE_NORMAL 16-896 MB direct mapped by the kernel * ZONE_HIGHMEM > 896 MB only page cache and user processes */ + struct zone { /* * Commonly accessed fields: @@ -44,6 +61,8 @@ struct zone { unsigned long pages_min, pages_low, pages_high; int need_balance; + ZONE_PADDING(_pad1_) + spinlock_t lru_lock; struct list_head active_list; struct list_head inactive_list; @@ -51,6 +70,8 @@ struct zone { unsigned long nr_active; unsigned long nr_inactive; + ZONE_PADDING(_pad2_) + /* * free areas of different sizes */ @@ -97,7 +118,7 @@ struct zone { */ char *name; unsigned long size; -}; +} ____cacheline_maxaligned_in_smp; #define ZONE_DMA 0 #define ZONE_NORMAL 1 |
