Piotr Caban : ntdll: Added numa nodes information to SystemLogicalProcessorInformation (linux).

Alexandre Julliard julliard at winehq.org
Tue Sep 4 12:38:37 CDT 2012


Module: wine
Branch: master
Commit: 59a54b0f8a223f6b1c31706d96894ac698b65831
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=59a54b0f8a223f6b1c31706d96894ac698b65831

Author: Piotr Caban <piotr at 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;
 }




More information about the wine-cvs mailing list