hugetlb_sysfs.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * HugeTLB sysfs interfaces.
  4. * (C) Nadia Yvette Chambers, April 2004
  5. */
  6. #include <linux/swap.h>
  7. #include <linux/page_owner.h>
  8. #include <linux/page-isolation.h>
  9. #include "hugetlb_vmemmap.h"
  10. #include "hugetlb_internal.h"
  11. #define HSTATE_ATTR_RO(_name) \
  12. static struct kobj_attribute _name##_attr = __ATTR_RO(_name)
  13. #define HSTATE_ATTR_WO(_name) \
  14. static struct kobj_attribute _name##_attr = __ATTR_WO(_name)
  15. #define HSTATE_ATTR(_name) \
  16. static struct kobj_attribute _name##_attr = __ATTR_RW(_name)
  17. static struct kobject *hugepages_kobj;
  18. static struct kobject *hstate_kobjs[HUGE_MAX_HSTATE];
  19. static struct hstate *kobj_to_node_hstate(struct kobject *kobj, int *nidp);
  20. static struct hstate *kobj_to_hstate(struct kobject *kobj, int *nidp)
  21. {
  22. int i;
  23. for (i = 0; i < HUGE_MAX_HSTATE; i++)
  24. if (hstate_kobjs[i] == kobj) {
  25. if (nidp)
  26. *nidp = NUMA_NO_NODE;
  27. return &hstates[i];
  28. }
  29. return kobj_to_node_hstate(kobj, nidp);
  30. }
  31. static ssize_t nr_hugepages_show_common(struct kobject *kobj,
  32. struct kobj_attribute *attr, char *buf)
  33. {
  34. struct hstate *h;
  35. unsigned long nr_huge_pages;
  36. int nid;
  37. h = kobj_to_hstate(kobj, &nid);
  38. if (nid == NUMA_NO_NODE)
  39. nr_huge_pages = h->nr_huge_pages;
  40. else
  41. nr_huge_pages = h->nr_huge_pages_node[nid];
  42. return sysfs_emit(buf, "%lu\n", nr_huge_pages);
  43. }
  44. static ssize_t nr_hugepages_store_common(bool obey_mempolicy,
  45. struct kobject *kobj, const char *buf,
  46. size_t len)
  47. {
  48. struct hstate *h;
  49. unsigned long count;
  50. int nid;
  51. int err;
  52. err = kstrtoul(buf, 10, &count);
  53. if (err)
  54. return err;
  55. h = kobj_to_hstate(kobj, &nid);
  56. return __nr_hugepages_store_common(obey_mempolicy, h, nid, count, len);
  57. }
  58. static ssize_t nr_hugepages_show(struct kobject *kobj,
  59. struct kobj_attribute *attr, char *buf)
  60. {
  61. return nr_hugepages_show_common(kobj, attr, buf);
  62. }
  63. static ssize_t nr_hugepages_store(struct kobject *kobj,
  64. struct kobj_attribute *attr, const char *buf, size_t len)
  65. {
  66. return nr_hugepages_store_common(false, kobj, buf, len);
  67. }
  68. HSTATE_ATTR(nr_hugepages);
  69. #ifdef CONFIG_NUMA
  70. /*
  71. * hstate attribute for optionally mempolicy-based constraint on persistent
  72. * huge page alloc/free.
  73. */
  74. static ssize_t nr_hugepages_mempolicy_show(struct kobject *kobj,
  75. struct kobj_attribute *attr,
  76. char *buf)
  77. {
  78. return nr_hugepages_show_common(kobj, attr, buf);
  79. }
  80. static ssize_t nr_hugepages_mempolicy_store(struct kobject *kobj,
  81. struct kobj_attribute *attr, const char *buf, size_t len)
  82. {
  83. return nr_hugepages_store_common(true, kobj, buf, len);
  84. }
  85. HSTATE_ATTR(nr_hugepages_mempolicy);
  86. #endif
  87. static ssize_t nr_overcommit_hugepages_show(struct kobject *kobj,
  88. struct kobj_attribute *attr, char *buf)
  89. {
  90. struct hstate *h = kobj_to_hstate(kobj, NULL);
  91. return sysfs_emit(buf, "%lu\n", h->nr_overcommit_huge_pages);
  92. }
  93. static ssize_t nr_overcommit_hugepages_store(struct kobject *kobj,
  94. struct kobj_attribute *attr, const char *buf, size_t count)
  95. {
  96. int err;
  97. unsigned long input;
  98. struct hstate *h = kobj_to_hstate(kobj, NULL);
  99. if (hstate_is_gigantic_no_runtime(h))
  100. return -EINVAL;
  101. err = kstrtoul(buf, 10, &input);
  102. if (err)
  103. return err;
  104. spin_lock_irq(&hugetlb_lock);
  105. h->nr_overcommit_huge_pages = input;
  106. spin_unlock_irq(&hugetlb_lock);
  107. return count;
  108. }
  109. HSTATE_ATTR(nr_overcommit_hugepages);
  110. static ssize_t free_hugepages_show(struct kobject *kobj,
  111. struct kobj_attribute *attr, char *buf)
  112. {
  113. struct hstate *h;
  114. unsigned long free_huge_pages;
  115. int nid;
  116. h = kobj_to_hstate(kobj, &nid);
  117. if (nid == NUMA_NO_NODE)
  118. free_huge_pages = h->free_huge_pages;
  119. else
  120. free_huge_pages = h->free_huge_pages_node[nid];
  121. return sysfs_emit(buf, "%lu\n", free_huge_pages);
  122. }
  123. HSTATE_ATTR_RO(free_hugepages);
  124. static ssize_t resv_hugepages_show(struct kobject *kobj,
  125. struct kobj_attribute *attr, char *buf)
  126. {
  127. struct hstate *h = kobj_to_hstate(kobj, NULL);
  128. return sysfs_emit(buf, "%lu\n", h->resv_huge_pages);
  129. }
  130. HSTATE_ATTR_RO(resv_hugepages);
  131. static ssize_t surplus_hugepages_show(struct kobject *kobj,
  132. struct kobj_attribute *attr, char *buf)
  133. {
  134. struct hstate *h;
  135. unsigned long surplus_huge_pages;
  136. int nid;
  137. h = kobj_to_hstate(kobj, &nid);
  138. if (nid == NUMA_NO_NODE)
  139. surplus_huge_pages = h->surplus_huge_pages;
  140. else
  141. surplus_huge_pages = h->surplus_huge_pages_node[nid];
  142. return sysfs_emit(buf, "%lu\n", surplus_huge_pages);
  143. }
  144. HSTATE_ATTR_RO(surplus_hugepages);
  145. static ssize_t demote_store(struct kobject *kobj,
  146. struct kobj_attribute *attr, const char *buf, size_t len)
  147. {
  148. unsigned long nr_demote;
  149. unsigned long nr_available;
  150. nodemask_t nodes_allowed, *n_mask;
  151. struct hstate *h;
  152. int err;
  153. int nid;
  154. err = kstrtoul(buf, 10, &nr_demote);
  155. if (err)
  156. return err;
  157. h = kobj_to_hstate(kobj, &nid);
  158. if (nid != NUMA_NO_NODE) {
  159. init_nodemask_of_node(&nodes_allowed, nid);
  160. n_mask = &nodes_allowed;
  161. } else {
  162. n_mask = &node_states[N_MEMORY];
  163. }
  164. /* Synchronize with other sysfs operations modifying huge pages */
  165. mutex_lock(&h->resize_lock);
  166. spin_lock_irq(&hugetlb_lock);
  167. while (nr_demote) {
  168. long rc;
  169. /*
  170. * Check for available pages to demote each time thorough the
  171. * loop as demote_pool_huge_page will drop hugetlb_lock.
  172. */
  173. if (nid != NUMA_NO_NODE)
  174. nr_available = h->free_huge_pages_node[nid];
  175. else
  176. nr_available = h->free_huge_pages;
  177. nr_available -= h->resv_huge_pages;
  178. if (!nr_available)
  179. break;
  180. rc = demote_pool_huge_page(h, n_mask, nr_demote);
  181. if (rc < 0) {
  182. err = rc;
  183. break;
  184. }
  185. nr_demote -= rc;
  186. }
  187. spin_unlock_irq(&hugetlb_lock);
  188. mutex_unlock(&h->resize_lock);
  189. if (err)
  190. return err;
  191. return len;
  192. }
  193. HSTATE_ATTR_WO(demote);
  194. static ssize_t demote_size_show(struct kobject *kobj,
  195. struct kobj_attribute *attr, char *buf)
  196. {
  197. struct hstate *h = kobj_to_hstate(kobj, NULL);
  198. unsigned long demote_size = (PAGE_SIZE << h->demote_order) / SZ_1K;
  199. return sysfs_emit(buf, "%lukB\n", demote_size);
  200. }
  201. static ssize_t demote_size_store(struct kobject *kobj,
  202. struct kobj_attribute *attr,
  203. const char *buf, size_t count)
  204. {
  205. struct hstate *h, *demote_hstate;
  206. unsigned long demote_size;
  207. unsigned int demote_order;
  208. demote_size = (unsigned long)memparse(buf, NULL);
  209. demote_hstate = size_to_hstate(demote_size);
  210. if (!demote_hstate)
  211. return -EINVAL;
  212. demote_order = demote_hstate->order;
  213. if (demote_order < HUGETLB_PAGE_ORDER)
  214. return -EINVAL;
  215. /* demote order must be smaller than hstate order */
  216. h = kobj_to_hstate(kobj, NULL);
  217. if (demote_order >= h->order)
  218. return -EINVAL;
  219. /* resize_lock synchronizes access to demote size and writes */
  220. mutex_lock(&h->resize_lock);
  221. h->demote_order = demote_order;
  222. mutex_unlock(&h->resize_lock);
  223. return count;
  224. }
  225. HSTATE_ATTR(demote_size);
  226. static struct attribute *hstate_attrs[] = {
  227. &nr_hugepages_attr.attr,
  228. &nr_overcommit_hugepages_attr.attr,
  229. &free_hugepages_attr.attr,
  230. &resv_hugepages_attr.attr,
  231. &surplus_hugepages_attr.attr,
  232. #ifdef CONFIG_NUMA
  233. &nr_hugepages_mempolicy_attr.attr,
  234. #endif
  235. NULL,
  236. };
  237. static const struct attribute_group hstate_attr_group = {
  238. .attrs = hstate_attrs,
  239. };
  240. static struct attribute *hstate_demote_attrs[] = {
  241. &demote_size_attr.attr,
  242. &demote_attr.attr,
  243. NULL,
  244. };
  245. static const struct attribute_group hstate_demote_attr_group = {
  246. .attrs = hstate_demote_attrs,
  247. };
  248. static int hugetlb_sysfs_add_hstate(struct hstate *h, struct kobject *parent,
  249. struct kobject **hstate_kobjs,
  250. const struct attribute_group *hstate_attr_group)
  251. {
  252. int retval;
  253. int hi = hstate_index(h);
  254. hstate_kobjs[hi] = kobject_create_and_add(h->name, parent);
  255. if (!hstate_kobjs[hi])
  256. return -ENOMEM;
  257. retval = sysfs_create_group(hstate_kobjs[hi], hstate_attr_group);
  258. if (retval) {
  259. kobject_put(hstate_kobjs[hi]);
  260. hstate_kobjs[hi] = NULL;
  261. return retval;
  262. }
  263. if (h->demote_order) {
  264. retval = sysfs_create_group(hstate_kobjs[hi],
  265. &hstate_demote_attr_group);
  266. if (retval) {
  267. pr_warn("HugeTLB unable to create demote interfaces for %s\n", h->name);
  268. sysfs_remove_group(hstate_kobjs[hi], hstate_attr_group);
  269. kobject_put(hstate_kobjs[hi]);
  270. hstate_kobjs[hi] = NULL;
  271. return retval;
  272. }
  273. }
  274. return 0;
  275. }
  276. #ifdef CONFIG_NUMA
  277. static bool hugetlb_sysfs_initialized __ro_after_init;
  278. /*
  279. * node_hstate/s - associate per node hstate attributes, via their kobjects,
  280. * with node devices in node_devices[] using a parallel array. The array
  281. * index of a node device or _hstate == node id.
  282. * This is here to avoid any static dependency of the node device driver, in
  283. * the base kernel, on the hugetlb module.
  284. */
  285. struct node_hstate {
  286. struct kobject *hugepages_kobj;
  287. struct kobject *hstate_kobjs[HUGE_MAX_HSTATE];
  288. };
  289. static struct node_hstate node_hstates[MAX_NUMNODES];
  290. /*
  291. * A subset of global hstate attributes for node devices
  292. */
  293. static struct attribute *per_node_hstate_attrs[] = {
  294. &nr_hugepages_attr.attr,
  295. &free_hugepages_attr.attr,
  296. &surplus_hugepages_attr.attr,
  297. NULL,
  298. };
  299. static const struct attribute_group per_node_hstate_attr_group = {
  300. .attrs = per_node_hstate_attrs,
  301. };
  302. /*
  303. * kobj_to_node_hstate - lookup global hstate for node device hstate attr kobj.
  304. * Returns node id via non-NULL nidp.
  305. */
  306. static struct hstate *kobj_to_node_hstate(struct kobject *kobj, int *nidp)
  307. {
  308. int nid;
  309. for (nid = 0; nid < nr_node_ids; nid++) {
  310. struct node_hstate *nhs = &node_hstates[nid];
  311. int i;
  312. for (i = 0; i < HUGE_MAX_HSTATE; i++)
  313. if (nhs->hstate_kobjs[i] == kobj) {
  314. if (nidp)
  315. *nidp = nid;
  316. return &hstates[i];
  317. }
  318. }
  319. BUG();
  320. return NULL;
  321. }
  322. /*
  323. * Unregister hstate attributes from a single node device.
  324. * No-op if no hstate attributes attached.
  325. */
  326. void hugetlb_unregister_node(struct node *node)
  327. {
  328. struct hstate *h;
  329. struct node_hstate *nhs = &node_hstates[node->dev.id];
  330. if (!nhs->hugepages_kobj)
  331. return; /* no hstate attributes */
  332. for_each_hstate(h) {
  333. int idx = hstate_index(h);
  334. struct kobject *hstate_kobj = nhs->hstate_kobjs[idx];
  335. if (!hstate_kobj)
  336. continue;
  337. if (h->demote_order)
  338. sysfs_remove_group(hstate_kobj, &hstate_demote_attr_group);
  339. sysfs_remove_group(hstate_kobj, &per_node_hstate_attr_group);
  340. kobject_put(hstate_kobj);
  341. nhs->hstate_kobjs[idx] = NULL;
  342. }
  343. kobject_put(nhs->hugepages_kobj);
  344. nhs->hugepages_kobj = NULL;
  345. }
  346. /*
  347. * Register hstate attributes for a single node device.
  348. * No-op if attributes already registered.
  349. */
  350. void hugetlb_register_node(struct node *node)
  351. {
  352. struct hstate *h;
  353. struct node_hstate *nhs = &node_hstates[node->dev.id];
  354. int err;
  355. if (!hugetlb_sysfs_initialized)
  356. return;
  357. if (nhs->hugepages_kobj)
  358. return; /* already allocated */
  359. nhs->hugepages_kobj = kobject_create_and_add("hugepages",
  360. &node->dev.kobj);
  361. if (!nhs->hugepages_kobj)
  362. return;
  363. for_each_hstate(h) {
  364. err = hugetlb_sysfs_add_hstate(h, nhs->hugepages_kobj,
  365. nhs->hstate_kobjs,
  366. &per_node_hstate_attr_group);
  367. if (err) {
  368. pr_err("HugeTLB: Unable to add hstate %s for node %d\n",
  369. h->name, node->dev.id);
  370. hugetlb_unregister_node(node);
  371. break;
  372. }
  373. }
  374. }
  375. /*
  376. * hugetlb init time: register hstate attributes for all registered node
  377. * devices of nodes that have memory. All on-line nodes should have
  378. * registered their associated device by this time.
  379. */
  380. static void __init hugetlb_register_all_nodes(void)
  381. {
  382. int nid;
  383. for_each_online_node(nid)
  384. hugetlb_register_node(node_devices[nid]);
  385. }
  386. #else /* !CONFIG_NUMA */
  387. static struct hstate *kobj_to_node_hstate(struct kobject *kobj, int *nidp)
  388. {
  389. BUG();
  390. if (nidp)
  391. *nidp = -1;
  392. return NULL;
  393. }
  394. static void hugetlb_register_all_nodes(void) { }
  395. #endif
  396. void __init hugetlb_sysfs_init(void)
  397. {
  398. struct hstate *h;
  399. int err;
  400. hugepages_kobj = kobject_create_and_add("hugepages", mm_kobj);
  401. if (!hugepages_kobj)
  402. return;
  403. for_each_hstate(h) {
  404. err = hugetlb_sysfs_add_hstate(h, hugepages_kobj,
  405. hstate_kobjs, &hstate_attr_group);
  406. if (err)
  407. pr_err("HugeTLB: Unable to add hstate %s\n", h->name);
  408. }
  409. #ifdef CONFIG_NUMA
  410. hugetlb_sysfs_initialized = true;
  411. #endif
  412. hugetlb_register_all_nodes();
  413. }