Module: wine Branch: master Commit: 59a54b0f8a223f6b1c31706d96894ac698b65831 URL: http://source.winehq.org/git/wine.git/?a=commit;h=59a54b0f8a223f6b1c31706d96...
Author: Piotr Caban piotr@codeweavers.com Date: Tue Sep 4 13:38:36 2012 +0200
ntdll: Added numa nodes information to SystemLogicalProcessorInformation (linux).
---
dlls/ntdll/nt.c | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 81 insertions(+), 1 deletions(-)
diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c index 0b18d24..863844a 100644 --- a/dlls/ntdll/nt.c +++ b/dlls/ntdll/nt.c @@ -1369,12 +1369,26 @@ static inline BOOL logical_proc_info_add_cache(SYSTEM_LOGICAL_PROCESSOR_INFORMAT return TRUE; }
+static inline BOOL logical_proc_info_add_numa_node(SYSTEM_LOGICAL_PROCESSOR_INFORMATION *data, + DWORD *len, DWORD max_len, ULONG_PTR mask, DWORD node_id) +{ + if(*len == max_len) + return FALSE; + + data[*len].Relationship = RelationNumaNode; + data[*len].ProcessorMask = mask; + data[*len].u.NumaNode.NodeNumber = node_id; + (*len)++; + return TRUE; +} + static NTSTATUS create_logical_proc_info(SYSTEM_LOGICAL_PROCESSOR_INFORMATION **data, DWORD *max_len) { static const char core_info[] = "/sys/devices/system/cpu/cpu%d/%s"; static const char cache_info[] = "/sys/devices/system/cpu/cpu%d/cache/index%d/%s"; + static const char numa_info[] = "/sys/devices/system/node/node%d/cpumap";
- FILE *fcpu_list, *f; + FILE *fcpu_list, *fnuma_list, *f; DWORD len = 0, beg, end, i, j, r; char op, name[MAX_PATH];
@@ -1523,6 +1537,72 @@ static NTSTATUS create_logical_proc_info(SYSTEM_LOGICAL_PROCESSOR_INFORMATION ** } fclose(fcpu_list);
+ fnuma_list = fopen("/sys/devices/system/node/online", "r"); + if(!fnuma_list) + { + ULONG_PTR mask = 0; + + for(i=0; i<len; i++) + if((*data)[i].Relationship == RelationProcessorCore) + mask |= (*data)[i].ProcessorMask; + + if(len == *max_len) + { + SYSTEM_LOGICAL_PROCESSOR_INFORMATION *new_data; + + *max_len *= 2; + new_data = RtlReAllocateHeap(GetProcessHeap(), 0, *data, *max_len*sizeof(*new_data)); + if(!new_data) + return STATUS_NO_MEMORY; + + *data = new_data; + } + logical_proc_info_add_numa_node(*data, &len, *max_len, mask, 0); + } + else + { + while(!feof(fnuma_list)) + { + if(!fscanf(fnuma_list, "%u%c ", &beg, &op)) + break; + if(op == '-') fscanf(fnuma_list, "%u%c ", &end, &op); + else end = beg; + + for(i=beg; i<=end; i++) + { + ULONG_PTR mask = 0; + + sprintf(name, numa_info, i); + f = fopen(name, "r"); + if(!f) continue; + while(!feof(f)) + { + if(!fscanf(f, "%x%c ", &r, &op)) + break; + mask = (sizeof(ULONG_PTR)>sizeof(int) ? mask<<(8*sizeof(DWORD)) : 0) + r; + } + fclose(f); + + if(len == *max_len) + { + SYSTEM_LOGICAL_PROCESSOR_INFORMATION *new_data; + + *max_len *= 2; + new_data = RtlReAllocateHeap(GetProcessHeap(), 0, *data, *max_len*sizeof(*new_data)); + if(!new_data) + { + fclose(fnuma_list); + return STATUS_NO_MEMORY; + } + + *data = new_data; + } + logical_proc_info_add_numa_node(*data, &len, *max_len, mask, i); + } + } + fclose(fnuma_list); + } + *max_len = len * sizeof(**data); return STATUS_SUCCESS; }