History

[PATCH] cpuset memory spread page cache implementation and hooks

Change the page cache allocation calls to support cpuset memory spreading. See the previous patch, cpuset_mem_spread, for an explanation of cpuset memory spreading. On systems without cpusets configured in the kernel, this is no change. On systems with cpusets configured in the kernel, but the "memory_spread" cpuset option not enabled for the current tasks cpuset, this adds a call to a cpuset routine and failed bit test of the processor state flag PF_SPREAD_PAGE. On tasks in cpusets with "memory_spread" enabled, this adds a call to a cpuset routine that computes which of the tasks mems_allowed nodes should be preferred for this allocation. If memory spreading applies to a particular allocation, then any other NUMA mempolicy does not apply.

Paul Jackson committed 20 years ago

Commit 44110fe1 parent 825a46a2 files · +28 −0Browse files

Unified · Split

2 files
  1. include/linux/pagemap.h +5 −0
  2. mm/filemap.c +23 −0
include/linux/pagemap.h+5−0
@@ -51,6 +51,10 @@ static inline void mapping_set_gfp_mask(struct address_space *m, gfp_t mask) · 50 unmodified lines
51#define page_cache_release(page) put_page(page)51#define page_cache_release(page) put_page(page)
52void release_pages(struct page **pages, int nr, int cold);52void release_pages(struct page **pages, int nr, int cold);
53 53
54#ifdef CONFIG_NUMA
55extern struct page *page_cache_alloc(struct address_space *x);
56extern struct page *page_cache_alloc_cold(struct address_space *x);
57#else
54static inline struct page *page_cache_alloc(struct address_space *x)58static inline struct page *page_cache_alloc(struct address_space *x)
55{59{
56 return alloc_pages(mapping_gfp_mask(x), 0);60 return alloc_pages(mapping_gfp_mask(x), 0);
@@ -60,6 +64,7 @@ static inline struct page *page_cache_alloc_cold(struct address_space *x) · 3 unmodified lines
60{64{
61 return alloc_pages(mapping_gfp_mask(x)|__GFP_COLD, 0);65 return alloc_pages(mapping_gfp_mask(x)|__GFP_COLD, 0);
62}66}
67#endif
63 68
64typedef int filler_t(void *, struct page *);69typedef int filler_t(void *, struct page *);
65 70
mm/filemap.c+23−0
@@ -29,6 +29,7 @@ · 28 unmodified lines
29#include <linux/blkdev.h>29#include <linux/blkdev.h>
30#include <linux/security.h>30#include <linux/security.h>
31#include <linux/syscalls.h>31#include <linux/syscalls.h>
32#include <linux/cpuset.h>
32#include "filemap.h"33#include "filemap.h"
33#include "internal.h"34#include "internal.h"
34 35
@@ -427,6 +428,28 @@ int add_to_page_cache_lru(struct page *page, struct address_space *mapping, · 392 unmodified lines
427 return ret;428 return ret;
428}429}
429 430
431#ifdef CONFIG_NUMA
432struct page *page_cache_alloc(struct address_space *x)
433{
434 if (cpuset_do_page_mem_spread()) {
435 int n = cpuset_mem_spread_node();
436 return alloc_pages_node(n, mapping_gfp_mask(x), 0);
437 }
438 return alloc_pages(mapping_gfp_mask(x), 0);
439}
440EXPORT_SYMBOL(page_cache_alloc);
441
442struct page *page_cache_alloc_cold(struct address_space *x)
443{
444 if (cpuset_do_page_mem_spread()) {
445 int n = cpuset_mem_spread_node();
446 return alloc_pages_node(n, mapping_gfp_mask(x)|__GFP_COLD, 0);
447 }
448 return alloc_pages(mapping_gfp_mask(x)|__GFP_COLD, 0);
449}
450EXPORT_SYMBOL(page_cache_alloc_cold);
451#endif
452
430/*453/*
431 * In order to wait for pages to become available there must be454 * In order to wait for pages to become available there must be
432 * waitqueues associated with pages. By using a hash table of455 * waitqueues associated with pages. By using a hash table of