x86/sgx: Report SGX memory in /sys/devices/system/node/node*/meminfo
Subsystems (5)
Jarkko Sakkinen
maintainerPATCH v4 1/3 x86/sgx: Report SGX memory in /sys/devices/system/node/node*/meminfo
The amount of SGX memory on the system is determined by the BIOS and it varies wildly between systems. It can be from dozens of MB's on desktops or VM's, up to many GB's on servers. Just like for regular memory, it is sometimes useful to know the amount of usable SGX memory in the system.
Add SGX_MemTotal field to /sys/devices/system/node/node*/meminfo, showing the total SGX memory in each NUMA node. The total memory for each NUMA node is calculated by adding the sizes of contained EPC sections together.
Introduce arch_node_read_meminfo(), which can optionally be rewritten by the arch code, and rewrite it for x86 so it prints SGX_MemTotal.
---
v4:
* A new patch.
arch/x86/kernel/cpu/sgx/main.c | 14 ++++++++++++++ arch/x86/kernel/cpu/sgx/sgx.h | 6 ++++++ drivers/base/node.c | 10 +++++++++- 3 files changed, 29 insertions(+), 1 deletion(-)
arch/x86/kernel/cpu/sgx/main.c +14 -0
@@ -717,6 +717,7 @@ static bool __init sgx_page_cache_init(void) } sgx_epc_sections[i].node = &sgx_numa_nodes[nid]; + sgx_numa_nodes[nid].size += size; sgx_nr_epc_sections++; }
@@ -790,6 +791,19 @@ int sgx_set_attribute(unsigned long *allowed_attributes, }EXPORT_SYMBOL_GPL (sgx_set_attribute); +ssize_t arch_node_read_meminfo (struct device *dev, +struct device_attribute *attr, +char *buf,int len) +{ +struct sgx_numa_node *node = &sgx_numa_nodes[dev->id]; + + len +=sysfs_emit_at (buf, len, +"Node %d SGX_MemTotal: %8lu kB\n" , + dev->id, node->size); + +return len; +} +static int __init sgx_init (void ) {int ret;
arch/x86/kernel/cpu/sgx/sgx.h +6 -0
@@ -39,6 +39,7 @@ struct sgx_epc_page {*/ struct sgx_numa_node {struct list_head free_page_list; +unsigned long size;spinlock_t lock; };
@@ -95,4 +96,9 @@ static inline int __init sgx_vepc_init(void)void sgx_update_lepubkeyhash (u64 *lepubkeyhash); +extern ssize_t arch_node_read_meminfo (struct device *dev, +struct device_attribute *attr, +char *buf,int len); + +#endif /* _X86_SGX_H */
drivers/base/node.c +9 -1
@@ -361,6 +361,13 @@ static void node_init_caches(unsigned int nid) { }static void node_remove_caches (struct node *node) { }#endif +ssize_t __weak arch_node_read_meminfo (struct device *dev, +struct device_attribute *attr, +char *buf,int len) +{ +return len; +} +#define K (x) ((x) << (PAGE_SHIFT - 10))static ssize_t node_read_meminfo (struct device *dev,struct device_attribute *attr,char *buf)
@@ -473,7 +480,8 @@ static ssize_t node_read_meminfo(struct device *dev,#endif ); len +=hugetlb_report_node_meminfo (buf, len, nid); -return len; + +return arch_node_read_meminfo (dev, attr, buf, len); }#undef K
Signature · 1 line
2.25.1
Jarkko Sakkinen
maintainerPATCH v4 2/3 x86/sgx: Report SGX memory in /proc/meminfo
The amount of SGX memory on the system is determined by the BIOS and it varies wildly between systems. It can be from dozens of MB's on desktops or VM's, up to many GB's on servers. Just like for regular memory, it is sometimes useful to know the amount of usable SGX memory in the system.
Add SGX_MemTotal field to /proc/meminfo, which shows the total amount of usable SGX memory in the system. E.g. with 32 MB reserved for SGX from BIOS, the printout would be:
SGX_MemTotal: 22528 kB
---
v4:
* Calculate sgx_mem_total by adding up the sizes of the NUMA node EPC's, only once all of them have been set up correctly.
* Move documentation to a separate patch, as it clearly is a separate issue.
v2:
* Move ifdef fix for sgx_set_attribute() to a separate patch.
--- arch/x86/include/asm/sgx.h | 2 ++ arch/x86/kernel/cpu/sgx/main.c | 10 ++++++++-- arch/x86/mm/pat/set_memory.c | 5 +++++ 3 files changed, 15 insertions(+), 2 deletions(-)
arch/x86/include/asm/sgx.h +2 -0
@@ -365,6 +365,8 @@ struct sgx_sigstruct {* comment! */ +extern unsigned long sgx_mem_total; +#ifdef CONFIG_X86_SGX_KVM int sgx_virt_ecreate (struct sgx_pageinfo *pageinfo,void __user *secs,int *trapnr);
arch/x86/kernel/cpu/sgx/main.c +8 -2
@@ -28,7 +28,10 @@ static DECLARE_WAIT_QUEUE_HEAD(ksgxd_waitq);static LIST_HEAD (sgx_active_page_list);static DEFINE_SPINLOCK (sgx_reclaimer_lock); -/* The free page list lock protected variables prepend the lock. */ +/* Total size of the Enclave Page Cache (EPC) in the system. */ +unsigned long sgx_mem_total; + +/* The number of free EPC pages in all nodes. */ static unsigned long sgx_nr_free_pages;/* Nodes with one or more EPC sections. */
@@ -727,6 +730,9 @@ static bool __init sgx_page_cache_init(void)return false; } +for (i =0 ; i <num_possible_nodes (); i++) + sgx_mem_total += sgx_numa_nodes[nid].size; +return true; }
@@ -799,7 +805,7 @@ ssize_t arch_node_read_meminfo(struct device *dev, len +=sysfs_emit_at (buf, len,"Node %d SGX_MemTotal: %8lu kB\n" , - dev->id, node->size); + dev->id, node->size /1024 );return len; }
arch/x86/mm/pat/set_memory.c +5 -0
@@ -29,6 +29,7 @@#include <asm/proto.h> #include <asm/memtype.h> #include <asm/set_memory.h> +#include <asm/sgx.h> #include "../mm_internal.h"
@@ -116,6 +117,10 @@ void arch_report_meminfo(struct seq_file *m)if (direct_gbpages)seq_printf (m,"DirectMap1G: %8lu kB\n" , direct_pages_count[PG_LEVEL_1G ] <<20 ); + +#if defined(CONFIG_X86_SGX ) || defined(CONFIG_X86_SGX_KVM ) +seq_printf (m,"SGX_MemTotal: %8lu kB\n" , sgx_mem_total /1024 ); +#endif }#else static inline void split_page_count (int level) { }
Signature · 1 line
2.25.1
Jarkko Sakkinen
maintainerRe: [PATCH v4 2/3] x86/sgx: Report SGX memory in /proc/meminfo
arch/x86/kernel/cpu/sgx/main.c ssize_t arch_node_read_meminfo(struct device *dev, · line 811
Quoted 9 lines · Jarkko Sakkinen
arch/x86/kernel/cpu/sgx/main.c +1
-1@@ -799,7 +805,7 @@ ssize_t arch_node_read_meminfo(struct device *dev, len +=sysfs_emit_at (buf, len,"Node %d SGX_MemTotal: %8lu kB\n" , - dev->id, node->size); + dev->id, node->size /1024 );return len; }
This should have been in 1/3.
/Jarkko
Jarkko Sakkinen
maintainerPATCH v4 3/3 x86/sgx: Document SGX_MemTotal to Documentation/x86/meminfo.rst
In reply to Jarkko SakkinenDocument SGX_MemTotal field of /proc/meminfo to Documentation/x86/meminfo.rst. This is a new file for x86 specific meminfo fields.
---
v4:
* A new patch.
Documentation/x86/meminfo.rst | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 Documentation/x86/meminfo.rst
Documentation/x86/meminfo.rst new file +11 -0
@@ -0,0 +1,11 @@ +This document describes x86 specific fields of /proc/meminfo. + +Supplemental fields for /proc/meminfo +===================================== + +SGX_MemTotal + Total usable physical SGX memory, also known as Enclave + Page Cache (EPC), in kB's. This is the physical memory + used for enclave pages. It is below the amount set in + the BIOS: a portion of that memory is required for + the state of the enclave pages.
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerQuoted 13 lines · Jarkko Sakkinen
The amount of SGX memory on the system is determined by the BIOS and it varies wildly between systems. It can be from dozens of MB's on desktops or VM's, up to many GB's on servers. Just like for regular memory, it is sometimes useful to know the amount of usable SGX memory in the system.
Add
SGX_MemTotalfield to/sys/devices/system/node/node*/meminfo, showing the total SGX memory in each NUMA node. The total memory for each NUMA node is calculated by adding the sizes of contained EPC sections together.Introduce
arch_node_read_meminfo(), which can optionally be rewritten by the arch code, and rewrite it for x86 so it printsSGX_MemTotal.
Quoted 8 lines
Signed-off-by Jarkko Sakkinen <[email protected]>---
v4:
* A new patch.arch/x86/kernel/cpu/sgx/main.c | 14 ++++++++++++++ arch/x86/kernel/cpu/sgx/sgx.h | 6 ++++++ drivers/base/node.c | 10 +++++++++- 3 files changed, 29 insertions(+), 1 deletion(-)
Where is the Documentation/ABI/ update for this new sysfs file?
Quoted 16 lines
arch/x86/kernel/cpu/sgx/main.c +1
-0@@ -717,6 +717,7 @@ static bool __init sgx_page_cache_init(void) } sgx_epc_sections[i].node = &sgx_numa_nodes[nid]; + sgx_numa_nodes[nid].size += size; sgx_nr_epc_sections++; }@@ -790,6 +791,19 @@ int sgx_set_attribute(unsigned long *allowed_attributes, }EXPORT_SYMBOL_GPL (sgx_set_attribute);
arch/x86/kernel/cpu/sgx/main.c int sgx_set_attribute(unsigned long *allowed_attributes, · line 802
Quoted 10 lines
arch/x86/kernel/cpu/sgx/main.c +9
-0+ssize_t arch_node_read_meminfo (struct device *dev, +struct device_attribute *attr, +char *buf,int len) +{ +struct sgx_numa_node *node = &sgx_numa_nodes[dev->id]; + + len +=sysfs_emit_at (buf, len, +"Node %d SGX_MemTotal: %8lu kB\n" , + dev->id, node->size);
Wait, that is not how sysfs files work. they are "one value per file" Please do not have multiple values in a single sysfs file, that is not acceptable at all.
thanks,
greg k-h
Jarkko Sakkinen
maintainerQuoted 23 lines · Greg Kroah-Hartman
Quoted 13 lines · Jarkko Sakkinen
The amount of SGX memory on the system is determined by the BIOS and it varies wildly between systems. It can be from dozens of MB's on desktops or VM's, up to many GB's on servers. Just like for regular memory, it is sometimes useful to know the amount of usable SGX memory in the system.
Add
SGX_MemTotalfield to/sys/devices/system/node/node*/meminfo, showing the total SGX memory in each NUMA node. The total memory for each NUMA node is calculated by adding the sizes of contained EPC sections together.Introduce
arch_node_read_meminfo(), which can optionally be rewritten by the arch code, and rewrite it for x86 so it printsSGX_MemTotal.Quoted 8 lines
Signed-off-by Jarkko Sakkinen <[email protected]>---
v4:
* A new patch.arch/x86/kernel/cpu/sgx/main.c | 14 ++++++++++++++ arch/x86/kernel/cpu/sgx/sgx.h | 6 ++++++ drivers/base/node.c | 10 +++++++++- 3 files changed, 29 insertions(+), 1 deletion(-)
Quoted 1 line
Where is the
Documentation/ABI/update for this new sysfs file?
It's has been existed for a long time, e.g.
cat /sys/devices/system/node/node0/meminfo
Node 0 MemTotal: 32706792 kB Node 0 MemFree: 5382988 kB Node 0 MemUsed: 27323804 kB Node 0 SwapCached: 8 kB Node 0 Active: 3640612 kB Node 0 Inactive: 21757684 kB Node 0 Active(anon): 2833772 kB Node 0 Inactive(anon): 14392 kB Node 0 Active(file): 806840 kB Node 0 Inactive(file): 21743292 kB Node 0 Unevictable: 80640 kB Node 0 Mlocked: 80640 kB Node 0 Dirty: 36 kB Node 0 Writeback: 0 kB Node 0 FilePages: 22833124 kB Node 0 Mapped: 1112832 kB Node 0 AnonPages: 2645812 kB Node 0 Shmem: 282984 kB Node 0 KernelStack: 18544 kB Node 0 PageTables: 46704 kB Node 0 NFS_Unstable: 0 kB Node 0 Bounce: 0 kB Node 0 WritebackTmp: 0 kB Node 0 KReclaimable: 1311812 kB Node 0 Slab: 1542220 kB Node 0 SReclaimable: 1311812 kB Node 0 SUnreclaim: 230408 kB Node 0 AnonHugePages: 0 kB Node 0 ShmemHugePages: 0 kB Node 0 ShmemPmdMapped: 0 kB Node 0 FileHugePages: 0 kB Node 0 FilePmdMapped: 0 kB Node 0 HugePages_Total: 0 Node 0 HugePages_Free: 0 Node 0 HugePages_Surp: 0
This file is undocumented but the fields seem to reflect what is in /proc/meminfo, so I added additional patch for documentation:
https://lore.kernel.org/linux-sgx/[email protected]/
I have no idea why things are how they are. I'm just merely trying to follow the existing patterns. I'm also fully aware of the defacto sysfs pattern, i.e. one value per file.
I figured, since the situation is how it is, that I end up doing this wrong in a way or another, so this the anti-pattern I picked for my wrong doings :-) I'm sorry about it.
Quoted 16 lines
Quoted 16 lines
arch/x86/kernel/cpu/sgx/main.c +1
-0@@ -717,6 +717,7 @@ static bool __init sgx_page_cache_init(void) } sgx_epc_sections[i].node = &sgx_numa_nodes[nid]; + sgx_numa_nodes[nid].size += size; sgx_nr_epc_sections++; }@@ -790,6 +791,19 @@ int sgx_set_attribute(unsigned long *allowed_attributes, }EXPORT_SYMBOL_GPL (sgx_set_attribute);
Quoted 13 lines
arch/x86/kernel/cpu/sgx/main.c int sgx_set_attribute(unsigned long *allowed_attributes, · line 802
Quoted 9 lines
arch/x86/kernel/cpu/sgx/main.c +9
-0+ssize_t arch_node_read_meminfo (struct device *dev, +struct device_attribute *attr, +char *buf,int len) +{ +struct sgx_numa_node *node = &sgx_numa_nodes[dev->id]; + + len +=sysfs_emit_at (buf, len, +"Node %d SGX_MemTotal: %8lu kB\n" , + dev->id, node->size);Wait, that is not how sysfs files work. they are "one value per file" Please do not have multiple values in a single sysfs file, that is not acceptable at all.
Yeah, I'm wondering what would be the right corrective steps, given the "established science".
Quoted 3 lines
thanks,
greg k-h
/Jarkko
Greg Kroah-Hartman
maintainerQuoted 65 lines · Jarkko Sakkinen
Quoted 23 lines · Greg Kroah-Hartman
Quoted 13 lines · Jarkko Sakkinen
The amount of SGX memory on the system is determined by the BIOS and it varies wildly between systems. It can be from dozens of MB's on desktops or VM's, up to many GB's on servers. Just like for regular memory, it is sometimes useful to know the amount of usable SGX memory in the system.
Add
SGX_MemTotalfield to/sys/devices/system/node/node*/meminfo, showing the total SGX memory in each NUMA node. The total memory for each NUMA node is calculated by adding the sizes of contained EPC sections together.Introduce
arch_node_read_meminfo(), which can optionally be rewritten by the arch code, and rewrite it for x86 so it printsSGX_MemTotal.Quoted 8 lines
Signed-off-by Jarkko Sakkinen <[email protected]>---
v4:
* A new patch.arch/x86/kernel/cpu/sgx/main.c | 14 ++++++++++++++ arch/x86/kernel/cpu/sgx/sgx.h | 6 ++++++ drivers/base/node.c | 10 +++++++++- 3 files changed, 29 insertions(+), 1 deletion(-)Quoted 1 line
Where is the
Documentation/ABI/update for this new sysfs file?It's has been existed for a long time, e.g.
cat
/sys/devices/system/node/node0/meminfoNode 0 MemTotal: 32706792 kB Node 0 MemFree: 5382988 kB Node 0 MemUsed: 27323804 kB Node 0 SwapCached: 8 kB Node 0 Active: 3640612 kB Node 0 Inactive: 21757684 kB Node 0 Active(anon): 2833772 kB Node 0 Inactive(anon): 14392 kB Node 0 Active(file): 806840 kB Node 0 Inactive(file): 21743292 kB Node 0 Unevictable: 80640 kB Node 0 Mlocked: 80640 kB Node 0 Dirty: 36 kB Node 0 Writeback: 0 kB Node 0 FilePages: 22833124 kB Node 0 Mapped: 1112832 kB Node 0 AnonPages: 2645812 kB Node 0 Shmem: 282984 kB Node 0 KernelStack: 18544 kB Node 0 PageTables: 46704 kB Node 0 NFS_Unstable: 0 kB Node 0 Bounce: 0 kB Node 0 WritebackTmp: 0 kB Node 0 KReclaimable: 1311812 kB Node 0 Slab: 1542220 kB Node 0 SReclaimable: 1311812 kB Node 0 SUnreclaim: 230408 kB Node 0 AnonHugePages: 0 kB Node 0 ShmemHugePages: 0 kB Node 0 ShmemPmdMapped: 0 kB Node 0 FileHugePages: 0 kB Node 0 FilePmdMapped: 0 kB Node 0 HugePages_Total: 0 Node 0 HugePages_Free: 0 Node 0 HugePages_Surp: 0
Quoted 8 lines
This file is undocumented but the fields seem to reflect what is in
/proc/meminfo, so I added additional patch for documentation:https://lore.kernel.org/linux-sgx/[email protected]/
I have no idea why things are how they are. I'm just merely trying to follow the existing patterns. I'm also fully aware of the defacto sysfs pattern, i.e. one value per file.
Then please do not add anything else to this nightmare of a mess.
thanks,
greg k-h
Jarkko Sakkinen
maintainerQuoted 57 lines · Greg Kroah-Hartman
Quoted 56 lines · Jarkko Sakkinen
Quoted 23 lines · Greg Kroah-Hartman
Quoted 13 lines · Jarkko Sakkinen
The amount of SGX memory on the system is determined by the BIOS and it varies wildly between systems. It can be from dozens of MB's on desktops or VM's, up to many GB's on servers. Just like for regular memory, it is sometimes useful to know the amount of usable SGX memory in the system.
Add
SGX_MemTotalfield to/sys/devices/system/node/node*/meminfo, showing the total SGX memory in each NUMA node. The total memory for each NUMA node is calculated by adding the sizes of contained EPC sections together.Introduce
arch_node_read_meminfo(), which can optionally be rewritten by the arch code, and rewrite it for x86 so it printsSGX_MemTotal.Quoted 8 lines
Signed-off-by Jarkko Sakkinen <[email protected]>---
v4:
* A new patch.arch/x86/kernel/cpu/sgx/main.c | 14 ++++++++++++++ arch/x86/kernel/cpu/sgx/sgx.h | 6 ++++++ drivers/base/node.c | 10 +++++++++- 3 files changed, 29 insertions(+), 1 deletion(-)Quoted 1 line
Where is the
Documentation/ABI/update for this new sysfs file?It's has been existed for a long time, e.g.
cat
/sys/devices/system/node/node0/meminfoNode 0 MemTotal: 32706792 kB Node 0 MemFree: 5382988 kB Node 0 MemUsed: 27323804 kB Node 0 SwapCached: 8 kB Node 0 Active: 3640612 kB Node 0 Inactive: 21757684 kB Node 0 Active(anon): 2833772 kB Node 0 Inactive(anon): 14392 kB Node 0 Active(file): 806840 kB Node 0 Inactive(file): 21743292 kB Node 0 Unevictable: 80640 kB Node 0 Mlocked: 80640 kB Node 0 Dirty: 36 kB Node 0 Writeback: 0 kB Node 0 FilePages: 22833124 kB Node 0 Mapped: 1112832 kB Node 0 AnonPages: 2645812 kB Node 0 Shmem: 282984 kB Node 0 KernelStack: 18544 kB Node 0 PageTables: 46704 kB Node 0 NFS_Unstable: 0 kB Node 0 Bounce: 0 kB Node 0 WritebackTmp: 0 kB Node 0 KReclaimable: 1311812 kB Node 0 Slab: 1542220 kB Node 0 SReclaimable: 1311812 kB Node 0 SUnreclaim: 230408 kB
Quoted 8 lines
Quoted 8 lines
Node 0 AnonHugePages: 0 kB Node 0 ShmemHugePages: 0 kB Node 0 ShmemPmdMapped: 0 kB Node 0 FileHugePages: 0 kB Node 0 FilePmdMapped: 0 kB Node 0 HugePages_Total: 0 Node 0 HugePages_Free: 0 Node 0 HugePages_Surp: 0
This was something also spinned my head a bit, i.e. why hugepages fields are not aligned correctly.
Quoted 11 lines
Quoted 9 lines
This file is undocumented but the fields seem to reflect what is in
/proc/meminfo, so I added additional patch for documentation:https://lore.kernel.org/linux-sgx/[email protected]/
I have no idea why things are how they are. I'm just merely trying to follow the existing patterns. I'm also fully aware of the defacto sysfs pattern, i.e. one value per file.
Then please do not add anything else to this nightmare of a mess.
There is already /sys/devices/system/node/node0/hugepages/.
It has alike data to the contents of meminfo:
/sys/devices/system/node/node0/hugepages/hugepages-2048kB:surplus_hugepagesnr_hugepagesfree_hugepages
/sys/devices/system/node/node0/hugepages/hugepages-1048576kB:surplus_hugepagesnr_hugepagesfree_hugepages
[I'm wondering tho, how the fields in meminfo are supposed to be interpreted,
given that there are two types of huge pages, but let's just ignore that for the moment.]
Following this pattern, I'd perhaps go and create (and document):
/sys/devices/system/node/node0/sgx/memory_size
which would have the size in bytes.
Quoted 3 lines
thanks,
greg k-h
/Jarkko
Greg Kroah-Hartman
maintainerQuoted 100 lines · Jarkko Sakkinen
Quoted 57 lines · Greg Kroah-Hartman
Quoted 56 lines · Jarkko Sakkinen
Quoted 23 lines · Greg Kroah-Hartman
Quoted 13 lines · Jarkko Sakkinen
The amount of SGX memory on the system is determined by the BIOS and it varies wildly between systems. It can be from dozens of MB's on desktops or VM's, up to many GB's on servers. Just like for regular memory, it is sometimes useful to know the amount of usable SGX memory in the system.
Add
SGX_MemTotalfield to/sys/devices/system/node/node*/meminfo, showing the total SGX memory in each NUMA node. The total memory for each NUMA node is calculated by adding the sizes of contained EPC sections together.Introduce
arch_node_read_meminfo(), which can optionally be rewritten by the arch code, and rewrite it for x86 so it printsSGX_MemTotal.Quoted 8 lines
Signed-off-by Jarkko Sakkinen <[email protected]>---
v4:
* A new patch.arch/x86/kernel/cpu/sgx/main.c | 14 ++++++++++++++ arch/x86/kernel/cpu/sgx/sgx.h | 6 ++++++ drivers/base/node.c | 10 +++++++++- 3 files changed, 29 insertions(+), 1 deletion(-)Quoted 1 line
Where is the
Documentation/ABI/update for this new sysfs file?It's has been existed for a long time, e.g.
cat
/sys/devices/system/node/node0/meminfoNode 0 MemTotal: 32706792 kB Node 0 MemFree: 5382988 kB Node 0 MemUsed: 27323804 kB Node 0 SwapCached: 8 kB Node 0 Active: 3640612 kB Node 0 Inactive: 21757684 kB Node 0 Active(anon): 2833772 kB Node 0 Inactive(anon): 14392 kB Node 0 Active(file): 806840 kB Node 0 Inactive(file): 21743292 kB Node 0 Unevictable: 80640 kB Node 0 Mlocked: 80640 kB Node 0 Dirty: 36 kB Node 0 Writeback: 0 kB Node 0 FilePages: 22833124 kB Node 0 Mapped: 1112832 kB Node 0 AnonPages: 2645812 kB Node 0 Shmem: 282984 kB Node 0 KernelStack: 18544 kB Node 0 PageTables: 46704 kB Node 0 NFS_Unstable: 0 kB Node 0 Bounce: 0 kB Node 0 WritebackTmp: 0 kB Node 0 KReclaimable: 1311812 kB Node 0 Slab: 1542220 kB Node 0 SReclaimable: 1311812 kB Node 0 SUnreclaim: 230408 kBQuoted 8 lines
Quoted 8 lines
Node 0 AnonHugePages: 0 kB Node 0 ShmemHugePages: 0 kB Node 0 ShmemPmdMapped: 0 kB Node 0 FileHugePages: 0 kB Node 0 FilePmdMapped: 0 kB Node 0 HugePages_Total: 0 Node 0 HugePages_Free: 0 Node 0 HugePages_Surp: 0This was something also spinned my head a bit, i.e. why hugepages fields are not aligned correctly.
Quoted 11 lines
Quoted 9 lines
This file is undocumented but the fields seem to reflect what is in
/proc/meminfo, so I added additional patch for documentation:https://lore.kernel.org/linux-sgx/[email protected]/
I have no idea why things are how they are. I'm just merely trying to follow the existing patterns. I'm also fully aware of the defacto sysfs pattern, i.e. one value per file.
Then please do not add anything else to this nightmare of a mess.
There is already
/sys/devices/system/node/node0/hugepages/.It has alike data to the contents of meminfo:
/sys/devices/system/node/node0/hugepages/hugepages-2048kB:surplus_hugepagesnr_hugepagesfree_hugepages
/sys/devices/system/node/node0/hugepages/hugepages-1048576kB:surplus_hugepagesnr_hugepagesfree_hugepages[I'm wondering tho, how the fields in meminfo are supposed to be interpreted,
given that there are two types of huge pages, but let's just ignore that for the moment.]
Quoted 5 lines
Following this pattern, I'd perhaps go and create (and document):
/sys/devices/system/node/node0/sgx/memory_sizewhich would have the size in bytes.
If it is one-value-per-file, that's fine with me.
thanks,
greg k-h
Jarkko Sakkinen
maintainerQuoted 100 lines · Greg Kroah-Hartman
Quoted 99 lines · Jarkko Sakkinen
Quoted 57 lines · Greg Kroah-Hartman
Quoted 56 lines · Jarkko Sakkinen
Quoted 23 lines · Greg Kroah-Hartman
Quoted 13 lines · Jarkko Sakkinen
The amount of SGX memory on the system is determined by the BIOS and it varies wildly between systems. It can be from dozens of MB's on desktops or VM's, up to many GB's on servers. Just like for regular memory, it is sometimes useful to know the amount of usable SGX memory in the system.
Add
SGX_MemTotalfield to/sys/devices/system/node/node*/meminfo, showing the total SGX memory in each NUMA node. The total memory for each NUMA node is calculated by adding the sizes of contained EPC sections together.Introduce
arch_node_read_meminfo(), which can optionally be rewritten by the arch code, and rewrite it for x86 so it printsSGX_MemTotal.Quoted 8 lines
Signed-off-by Jarkko Sakkinen <[email protected]>---
v4:
* A new patch.arch/x86/kernel/cpu/sgx/main.c | 14 ++++++++++++++ arch/x86/kernel/cpu/sgx/sgx.h | 6 ++++++ drivers/base/node.c | 10 +++++++++- 3 files changed, 29 insertions(+), 1 deletion(-)Quoted 1 line
Where is the
Documentation/ABI/update for this new sysfs file?It's has been existed for a long time, e.g.
cat
/sys/devices/system/node/node0/meminfoNode 0 MemTotal: 32706792 kB Node 0 MemFree: 5382988 kB Node 0 MemUsed: 27323804 kB Node 0 SwapCached: 8 kB Node 0 Active: 3640612 kB Node 0 Inactive: 21757684 kB Node 0 Active(anon): 2833772 kB Node 0 Inactive(anon): 14392 kB Node 0 Active(file): 806840 kB Node 0 Inactive(file): 21743292 kB Node 0 Unevictable: 80640 kB Node 0 Mlocked: 80640 kB Node 0 Dirty: 36 kB Node 0 Writeback: 0 kB Node 0 FilePages: 22833124 kB Node 0 Mapped: 1112832 kB Node 0 AnonPages: 2645812 kB Node 0 Shmem: 282984 kB Node 0 KernelStack: 18544 kB Node 0 PageTables: 46704 kB Node 0 NFS_Unstable: 0 kB Node 0 Bounce: 0 kB Node 0 WritebackTmp: 0 kB Node 0 KReclaimable: 1311812 kB Node 0 Slab: 1542220 kB Node 0 SReclaimable: 1311812 kB Node 0 SUnreclaim: 230408 kBQuoted 8 lines
Quoted 8 lines
Node 0 AnonHugePages: 0 kB Node 0 ShmemHugePages: 0 kB Node 0 ShmemPmdMapped: 0 kB Node 0 FileHugePages: 0 kB Node 0 FilePmdMapped: 0 kB Node 0 HugePages_Total: 0 Node 0 HugePages_Free: 0 Node 0 HugePages_Surp: 0This was something also spinned my head a bit, i.e. why hugepages fields are not aligned correctly.
Quoted 10 lines
Quoted 8 lines
This file is undocumented but the fields seem to reflect what is in
/proc/meminfo, so I added additional patch for documentation:https://lore.kernel.org/linux-sgx/[email protected]/
I have no idea why things are how they are. I'm just merely trying to follow the existing patterns. I'm also fully aware of the defacto sysfs pattern, i.e. one value per file.
Then please do not add anything else to this nightmare of a mess.
There is already
/sys/devices/system/node/node0/hugepages/.It has alike data to the contents of meminfo:
/sys/devices/system/node/node0/hugepages/hugepages-2048kB:surplus_hugepagesnr_hugepagesfree_hugepages
/sys/devices/system/node/node0/hugepages/hugepages-1048576kB:surplus_hugepagesnr_hugepagesfree_hugepages[I'm wondering tho, how the fields in meminfo are supposed to be interpreted,
given that there are two types of huge pages, but let's just ignore that for the moment.]
Quoted 7 lines
Quoted 5 lines
Following this pattern, I'd perhaps go and create (and document):
/sys/devices/system/node/node0/sgx/memory_sizewhich would have the size in bytes.
If it is one-value-per-file, that's fine with me.
And if it's represented like this to user space, I think that /proc/meminfo change is unnecessary: it's less involving (e.g. in scripting) to parse these files in a loop and sum then, than grep the appropriate line from /proc/meminfo. Would no make much common sense to maintain it.
For me the only open here is: would it make more sense to add x86 subdirectory to each node? With this approach the path would be something like:
* /sys/devices/system/node/node0/x86/sgx_memory_size
I guess huge pages is different in the sense that it's not just one arch thing, whereas SGX is directly arch related, so I think that this would be a more civilized way to deal with SGX. This way things won't bloat, if or when something else ought to need a NUMA node specific attribute.
Quoted 3 lines
thanks,
greg k-h
/Jarkko