|
@@ -1758,23 +1758,25 @@ unsigned int mempolicy_slab_node(void)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-/* Do static interleaving for a VMA with known offset. */
|
|
|
+/*
|
|
|
+ * Do static interleaving for a VMA with known offset @n. Returns the n'th
|
|
|
+ * node in pol->v.nodes (starting from n=0), wrapping around if n exceeds the
|
|
|
+ * number of present nodes.
|
|
|
+ */
|
|
|
static unsigned offset_il_node(struct mempolicy *pol,
|
|
|
- struct vm_area_struct *vma, unsigned long off)
|
|
|
+ struct vm_area_struct *vma, unsigned long n)
|
|
|
{
|
|
|
unsigned nnodes = nodes_weight(pol->v.nodes);
|
|
|
unsigned target;
|
|
|
- int c;
|
|
|
- int nid = NUMA_NO_NODE;
|
|
|
+ int i;
|
|
|
+ int nid;
|
|
|
|
|
|
if (!nnodes)
|
|
|
return numa_node_id();
|
|
|
- target = (unsigned int)off % nnodes;
|
|
|
- c = 0;
|
|
|
- do {
|
|
|
+ target = (unsigned int)n % nnodes;
|
|
|
+ nid = first_node(pol->v.nodes);
|
|
|
+ for (i = 0; i < target; i++)
|
|
|
nid = next_node(nid, pol->v.nodes);
|
|
|
- c++;
|
|
|
- } while (c <= target);
|
|
|
return nid;
|
|
|
}
|
|
|
|