mirror of
https://github.com/NVIDIA/open-gpu-kernel-modules.git
synced 2026-02-26 18:04:16 +00:00
550.40.07
This commit is contained in:
@@ -101,6 +101,16 @@ const uvm_va_policy_t *uvm_va_policy_get_region(uvm_va_block_t *va_block, uvm_va
|
||||
}
|
||||
}
|
||||
|
||||
bool uvm_va_policy_preferred_location_equal(const uvm_va_policy_t *policy, uvm_processor_id_t proc, int cpu_numa_id)
|
||||
{
|
||||
bool equal = uvm_id_equal(policy->preferred_location, proc);
|
||||
|
||||
if (equal && UVM_ID_IS_CPU(policy->preferred_location))
|
||||
equal = uvm_numa_id_eq(policy->preferred_nid, cpu_numa_id);
|
||||
|
||||
return equal;
|
||||
}
|
||||
|
||||
#if UVM_IS_CONFIG_HMM()
|
||||
|
||||
static struct kmem_cache *g_uvm_va_policy_node_cache __read_mostly;
|
||||
@@ -401,12 +411,14 @@ void uvm_va_policy_clear(uvm_va_block_t *va_block, NvU64 start, NvU64 end)
|
||||
static void uvm_va_policy_node_set(uvm_va_policy_node_t *node,
|
||||
uvm_va_policy_type_t which,
|
||||
uvm_processor_id_t processor_id,
|
||||
int cpu_numa_nid,
|
||||
uvm_read_duplication_policy_t new_policy)
|
||||
{
|
||||
switch (which) {
|
||||
case UVM_VA_POLICY_PREFERRED_LOCATION:
|
||||
UVM_ASSERT(!UVM_ID_IS_INVALID(processor_id));
|
||||
node->policy.preferred_location = processor_id;
|
||||
node->policy.preferred_nid = cpu_numa_nid;
|
||||
break;
|
||||
|
||||
case UVM_VA_POLICY_ACCESSED_BY:
|
||||
@@ -436,6 +448,7 @@ static void uvm_va_policy_node_clear(uvm_va_block_t *va_block,
|
||||
case UVM_VA_POLICY_PREFERRED_LOCATION:
|
||||
UVM_ASSERT(UVM_ID_IS_INVALID(processor_id));
|
||||
node->policy.preferred_location = processor_id;
|
||||
node->policy.preferred_nid = NUMA_NO_NODE;
|
||||
break;
|
||||
|
||||
case UVM_VA_POLICY_ACCESSED_BY:
|
||||
@@ -464,6 +477,7 @@ static uvm_va_policy_node_t *create_node_and_set(uvm_va_block_t *va_block,
|
||||
NvU64 end,
|
||||
uvm_va_policy_type_t which,
|
||||
uvm_processor_id_t processor_id,
|
||||
int cpu_numa_nid,
|
||||
uvm_read_duplication_policy_t new_policy)
|
||||
{
|
||||
uvm_va_policy_node_t *node;
|
||||
@@ -473,7 +487,7 @@ static uvm_va_policy_node_t *create_node_and_set(uvm_va_block_t *va_block,
|
||||
if (!node)
|
||||
return node;
|
||||
|
||||
uvm_va_policy_node_set(node, which, processor_id, new_policy);
|
||||
uvm_va_policy_node_set(node, which, processor_id, cpu_numa_nid, new_policy);
|
||||
|
||||
return node;
|
||||
}
|
||||
@@ -484,6 +498,7 @@ static bool va_policy_node_split_needed(uvm_va_policy_node_t *node,
|
||||
uvm_va_policy_type_t which,
|
||||
bool is_default,
|
||||
uvm_processor_id_t processor_id,
|
||||
int cpu_numa_nid,
|
||||
uvm_read_duplication_policy_t new_policy)
|
||||
{
|
||||
// If the node doesn't extend beyond the range being set, it doesn't need
|
||||
@@ -494,7 +509,7 @@ static bool va_policy_node_split_needed(uvm_va_policy_node_t *node,
|
||||
// If the new policy value doesn't match the old value, a split is needed.
|
||||
switch (which) {
|
||||
case UVM_VA_POLICY_PREFERRED_LOCATION:
|
||||
return !uvm_id_equal(node->policy.preferred_location, processor_id);
|
||||
return !uvm_va_policy_preferred_location_equal(&node->policy, processor_id, cpu_numa_nid);
|
||||
|
||||
case UVM_VA_POLICY_ACCESSED_BY:
|
||||
if (is_default)
|
||||
@@ -517,6 +532,7 @@ NV_STATUS uvm_va_policy_set_range(uvm_va_block_t *va_block,
|
||||
uvm_va_policy_type_t which,
|
||||
bool is_default,
|
||||
uvm_processor_id_t processor_id,
|
||||
int cpu_numa_nid,
|
||||
uvm_read_duplication_policy_t new_policy)
|
||||
{
|
||||
uvm_va_policy_node_t *node, *next, *new;
|
||||
@@ -548,6 +564,7 @@ NV_STATUS uvm_va_policy_set_range(uvm_va_block_t *va_block,
|
||||
end,
|
||||
which,
|
||||
processor_id,
|
||||
cpu_numa_nid,
|
||||
new_policy);
|
||||
if (!node)
|
||||
return NV_ERR_NO_MEMORY;
|
||||
@@ -560,7 +577,14 @@ NV_STATUS uvm_va_policy_set_range(uvm_va_block_t *va_block,
|
||||
node_end = node->node.end;
|
||||
|
||||
// Nodes should have been split before setting policy so verify that.
|
||||
UVM_ASSERT(!va_policy_node_split_needed(node, start, end, which, is_default, processor_id, new_policy));
|
||||
UVM_ASSERT(!va_policy_node_split_needed(node,
|
||||
start,
|
||||
end,
|
||||
which,
|
||||
is_default,
|
||||
processor_id,
|
||||
cpu_numa_nid,
|
||||
new_policy));
|
||||
|
||||
next = uvm_va_policy_node_iter_next(va_block, node, end);
|
||||
|
||||
@@ -569,7 +593,7 @@ NV_STATUS uvm_va_policy_set_range(uvm_va_block_t *va_block,
|
||||
// Note that node may have been deleted.
|
||||
}
|
||||
else {
|
||||
uvm_va_policy_node_set(node, which, processor_id, new_policy);
|
||||
uvm_va_policy_node_set(node, which, processor_id, cpu_numa_nid, new_policy);
|
||||
|
||||
// TODO: Bug 1707562: Add support for merging policy ranges.
|
||||
}
|
||||
@@ -581,6 +605,7 @@ NV_STATUS uvm_va_policy_set_range(uvm_va_block_t *va_block,
|
||||
node_start - 1,
|
||||
which,
|
||||
processor_id,
|
||||
cpu_numa_nid,
|
||||
new_policy);
|
||||
if (!new)
|
||||
return NV_ERR_NO_MEMORY;
|
||||
@@ -592,6 +617,7 @@ NV_STATUS uvm_va_policy_set_range(uvm_va_block_t *va_block,
|
||||
end,
|
||||
which,
|
||||
processor_id,
|
||||
cpu_numa_nid,
|
||||
new_policy);
|
||||
if (!new)
|
||||
return NV_ERR_NO_MEMORY;
|
||||
@@ -605,6 +631,7 @@ NV_STATUS uvm_va_policy_set_range(uvm_va_block_t *va_block,
|
||||
const uvm_va_policy_t *uvm_va_policy_set_preferred_location(uvm_va_block_t *va_block,
|
||||
uvm_va_block_region_t region,
|
||||
uvm_processor_id_t processor_id,
|
||||
int cpu_node_id,
|
||||
const uvm_va_policy_t *old_policy)
|
||||
{
|
||||
NvU64 start = uvm_va_block_region_start(va_block, region);
|
||||
@@ -633,6 +660,7 @@ const uvm_va_policy_t *uvm_va_policy_set_preferred_location(uvm_va_block_t *va_b
|
||||
}
|
||||
|
||||
node->policy.preferred_location = processor_id;
|
||||
node->policy.preferred_nid = cpu_node_id;
|
||||
|
||||
return &node->policy;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user