+ def get_mems(self):
+ """ return a list of available cpu identifiers: [0,1,2,3...]
+ """
+
+ # the cpus never change, so if it's already been computed then don't
+ # worry about it.
+ if self.mems!=[]:
+ return self.mems
+
+ self.mems = self.get_cgroup_var(self.cgroup_mem_name)
+
+ # build a mapping from memory nodes to the cpus they can be used with
+
+ mems_map={}
+ for item in self.mems:
+ mems_map[item] = self.get_memnode_cpus(item)
+
+ if (len(mems_map)>0):
+ # when NUMA_EMU is enabled, only the last memory node will contain
+ # the cpu_map. For example, if there were originally 2 nodes and
+ # we used NUM_EMU to raise it to 12, then
+ # mems_map[0]=[]
+ # ...
+ # mems_map[4]=[]
+ # mems_map[5]=[1,3,5,7,9,11]
+ # mems_map[6]=[]
+ # ...
+ # mems_map[10]=[]
+ # mems_map[11]=[0,2,4,6,8,10]
+ # so, we go from back to front, copying the entries as necessary.
+
+ if mems_map[self.mems[0]] == []:
+ work = []
+ for item in reversed(self.mems):
+ if mems_map[item]!=[]:
+ work = mems_map[item]
+ else: # mems_map[item]==[]
+ mems_map[item] = work
+
+ self.mems_map = mems_map
+
+ return self.mems
+
+ def find_associated_memnode(self, mems, cpu):
+ """ Given a list of memory nodes and a cpu, see if one of the nodes in
+ the list can be used with that cpu.
+ """
+ for item in mems:
+ if cpu in self.mems_map[item]:
+ return item
+ return None
+
+ def get_memnode_cpus(self, index):
+ """ for a given memory node, return the CPUs that it is associated
+ with.
+ """
+ fn = "/sys/devices/system/node/node" + str(index) + "/cpulist"
+ if not os.path.exists(fn):
+ logger.log("CoreSched: failed to locate memory node" + fn)
+ return []
+
+ return self.get_cgroup_var(filename=fn)
+
+ def get_core_siblings(self, index):
+ # use core_siblings rather than core_siblings_list, as it's compatible
+ # with older kernels
+ fn = "/sys/devices/system/cpu/cpu" + str(index) + "/topology/core_siblings"
+ if not os.path.exists(fn):
+ return []
+ siblings = []
+
+ x = int(open(fn,"rt").readline().strip(),16)
+ cpuid = 0
+ while (x>0):
+ if (x&1)!=0:
+ siblings.append(cpuid)
+ x = x >> 1
+ cpuid += 1
+
+ return siblings
+
+