Skip to content

Commit 9a30523

Browse files
Lee Schermerhorntorvalds
authored andcommitted
hugetlb: add per node hstate attributes
Add the per huge page size control/query attributes to the per node sysdevs: /sys/devices/system/node/node<ID>/hugepages/hugepages-<size>/ nr_hugepages - r/w free_huge_pages - r/o surplus_huge_pages - r/o The patch attempts to re-use/share as much of the existing global hstate attribute initialization and handling, and the "nodes_allowed" constraint processing as possible. Calling set_max_huge_pages() with no node indicates a change to global hstate parameters. In this case, any non-default task mempolicy will be used to generate the nodes_allowed mask. A valid node id indicates an update to that node's hstate parameters, and the count argument specifies the target count for the specified node. From this info, we compute the target global count for the hstate and construct a nodes_allowed node mask contain only the specified node. Setting the node specific nr_hugepages via the per node attribute effectively ignores any task mempolicy or cpuset constraints. With this patch: (me):ls /sys/devices/system/node/node0/hugepages/hugepages-2048kB ./ ../ free_hugepages nr_hugepages surplus_hugepages Starting from: Node 0 HugePages_Total: 0 Node 0 HugePages_Free: 0 Node 0 HugePages_Surp: 0 Node 1 HugePages_Total: 0 Node 1 HugePages_Free: 0 Node 1 HugePages_Surp: 0 Node 2 HugePages_Total: 0 Node 2 HugePages_Free: 0 Node 2 HugePages_Surp: 0 Node 3 HugePages_Total: 0 Node 3 HugePages_Free: 0 Node 3 HugePages_Surp: 0 vm.nr_hugepages = 0 Allocate 16 persistent huge pages on node 2: (me):echo 16 >/sys/devices/system/node/node2/hugepages/hugepages-2048kB/nr_hugepages [Note that this is equivalent to: numactl -m 2 hugeadmin --pool-pages-min 2M:+16 ] Yields: Node 0 HugePages_Total: 0 Node 0 HugePages_Free: 0 Node 0 HugePages_Surp: 0 Node 1 HugePages_Total: 0 Node 1 HugePages_Free: 0 Node 1 HugePages_Surp: 0 Node 2 HugePages_Total: 16 Node 2 HugePages_Free: 16 Node 2 HugePages_Surp: 0 Node 3 HugePages_Total: 0 Node 3 HugePages_Free: 0 Node 3 HugePages_Surp: 0 vm.nr_hugepages = 16 Global controls work as expected--reduce pool to 8 persistent huge pages: (me):echo 8 >/sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages Node 0 HugePages_Total: 0 Node 0 HugePages_Free: 0 Node 0 HugePages_Surp: 0 Node 1 HugePages_Total: 0 Node 1 HugePages_Free: 0 Node 1 HugePages_Surp: 0 Node 2 HugePages_Total: 8 Node 2 HugePages_Free: 8 Node 2 HugePages_Surp: 0 Node 3 HugePages_Total: 0 Node 3 HugePages_Free: 0 Node 3 HugePages_Surp: 0 Signed-off-by: Lee Schermerhorn <[email protected]> Acked-by: Mel Gorman <[email protected]> Reviewed-by: Andi Kleen <[email protected]> Cc: KAMEZAWA Hiroyuki <[email protected]> Cc: Randy Dunlap <[email protected]> Cc: Nishanth Aravamudan <[email protected]> Cc: David Rientjes <[email protected]> Cc: Adam Litke <[email protected]> Cc: Andy Whitcroft <[email protected]> Cc: Eric Whitney <[email protected]> Cc: Christoph Lameter <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent 4e25b25 commit 9a30523

File tree

3 files changed

+298
-26
lines changed

3 files changed

+298
-26
lines changed

drivers/base/node.c

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,43 @@ static ssize_t node_read_distance(struct sys_device * dev,
173173
}
174174
static SYSDEV_ATTR(distance, S_IRUGO, node_read_distance, NULL);
175175

176+
#ifdef CONFIG_HUGETLBFS
177+
/*
178+
* hugetlbfs per node attributes registration interface:
179+
* When/if hugetlb[fs] subsystem initializes [sometime after this module],
180+
* it will register its per node attributes for all nodes online at that
181+
* time. It will also call register_hugetlbfs_with_node(), below, to
182+
* register its attribute registration functions with this node driver.
183+
* Once these hooks have been initialized, the node driver will call into
184+
* the hugetlb module to [un]register attributes for hot-plugged nodes.
185+
*/
186+
static node_registration_func_t __hugetlb_register_node;
187+
static node_registration_func_t __hugetlb_unregister_node;
188+
189+
static inline void hugetlb_register_node(struct node *node)
190+
{
191+
if (__hugetlb_register_node)
192+
__hugetlb_register_node(node);
193+
}
194+
195+
static inline void hugetlb_unregister_node(struct node *node)
196+
{
197+
if (__hugetlb_unregister_node)
198+
__hugetlb_unregister_node(node);
199+
}
200+
201+
void register_hugetlbfs_with_node(node_registration_func_t doregister,
202+
node_registration_func_t unregister)
203+
{
204+
__hugetlb_register_node = doregister;
205+
__hugetlb_unregister_node = unregister;
206+
}
207+
#else
208+
static inline void hugetlb_register_node(struct node *node) {}
209+
210+
static inline void hugetlb_unregister_node(struct node *node) {}
211+
#endif
212+
176213

177214
/*
178215
* register_node - Setup a sysfs device for a node.
@@ -196,6 +233,7 @@ int register_node(struct node *node, int num, struct node *parent)
196233
sysdev_create_file(&node->sysdev, &attr_distance);
197234

198235
scan_unevictable_register_node(node);
236+
hugetlb_register_node(node);
199237
}
200238
return error;
201239
}
@@ -216,6 +254,7 @@ void unregister_node(struct node *node)
216254
sysdev_remove_file(&node->sysdev, &attr_distance);
217255

218256
scan_unevictable_unregister_node(node);
257+
hugetlb_unregister_node(node);
219258

220259
sysdev_unregister(&node->sysdev);
221260
}

include/linux/node.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ struct node {
2828

2929
struct memory_block;
3030
extern struct node node_devices[];
31+
typedef void (*node_registration_func_t)(struct node *);
3132

3233
extern int register_node(struct node *, int, struct node *);
3334
extern void unregister_node(struct node *node);
@@ -39,6 +40,11 @@ extern int unregister_cpu_under_node(unsigned int cpu, unsigned int nid);
3940
extern int register_mem_sect_under_node(struct memory_block *mem_blk,
4041
int nid);
4142
extern int unregister_mem_sect_under_nodes(struct memory_block *mem_blk);
43+
44+
#ifdef CONFIG_HUGETLBFS
45+
extern void register_hugetlbfs_with_node(node_registration_func_t doregister,
46+
node_registration_func_t unregister);
47+
#endif
4248
#else
4349
static inline int register_one_node(int nid)
4450
{
@@ -65,6 +71,11 @@ static inline int unregister_mem_sect_under_nodes(struct memory_block *mem_blk)
6571
{
6672
return 0;
6773
}
74+
75+
static inline void register_hugetlbfs_with_node(node_registration_func_t reg,
76+
node_registration_func_t unreg)
77+
{
78+
}
6879
#endif
6980

7081
#define to_node(sys_device) container_of(sys_device, struct node, sysdev)

0 commit comments

Comments
 (0)