|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v4 7/8] xen/x86: add detection of memory interleaves for different nodes
On 01.06.2022 04:53, Wei Chen wrote:
>> From: Jan Beulich <jbeulich@xxxxxxxx>
>> Sent: 2022年5月31日 21:21
>>
>> On 23.05.2022 08:25, Wei Chen wrote:
>>> @@ -119,20 +125,45 @@ int valid_numa_range(paddr_t start, paddr_t end,
>> nodeid_t node)
>>> return 0;
>>> }
>>>
>>> -static __init int conflicting_memblks(paddr_t start, paddr_t end)
>>> +static
>>> +enum conflicts __init conflicting_memblks(nodeid_t nid, paddr_t start,
>>> + paddr_t end, paddr_t nd_start,
>>> + paddr_t nd_end, unsigned int *mblkid)
>>> {
>>> - int i;
>>> + unsigned int i;
>>>
>>> + /*
>>> + * Scan all recorded nodes' memory blocks to check conflicts:
>>> + * Overlap or interleave.
>>> + */
>>> for (i = 0; i < num_node_memblks; i++) {
>>> struct node *nd = &node_memblk_range[i];
>>> +
>>> + *mblkid = i;
>>> +
>>> + /* Skip 0 bytes node memory block. */
>>> if (nd->start == nd->end)
>>> continue;
>>> + /*
>>> + * Use memblk range to check memblk overlaps, include the
>>> + * self-overlap case.
>>> + */
>>> if (nd->end > start && nd->start < end)
>>> - return i;
>>> + return OVERLAP;
>>> if (nd->end == end && nd->start == start)
>>> - return i;
>>> + return OVERLAP;
>>
>> Knowing that nd's range is non-empty, is this 2nd condition actually
>> needed here? (Such an adjustment, if you decided to make it and if not
>> split out to a separate patch, would need calling out in the
>> description.)
>
> The 2nd condition here, you meant is "(nd->end == end && nd->start == start)"
> or just "nd->start == start" after "&&"?
No, I mean the entire 2nd if().
>>> + /*
>>> + * Use node memory range to check whether new range contains
>>> + * memory from other nodes - interleave check. We just need
>>> + * to check full contains situation. Because overlaps have
>>> + * been checked above.
>>> + */
>>> + if (nid != memblk_nodeid[i] &&
>>> + (nd_start < nd->start && nd->end < nd_end))
>>> + return INTERLEAVE;
>>
>> Doesn't this need to be <= in both cases (albeit I think one of the two
>> expressions would want switching around, to better line up with the
>> earlier one, visible in context further up).
>>
>
> Yes, I will add "="in both cases. But for switching around, I also
> wanted to make a better line up. But if nid == memblk_nodeid[i],
> the check of (nd_start < nd->start && nd->end < nd_end) is meaningless.
> I'll adjust their order in the next version if you think this is
> acceptable.
I wasn't referring to the "nid != memblk_nodeid[i]" part at all. What
I'm after is for the two range checks to come as close as possible to
what the other range check does. (Which, as I notice only now, would
include the dropping of the unnecessary inner pair of parentheses.)
E.g. (there are other variations of it)
if (nid != memblk_nodeid[i] &&
nd->start >= nd_start && nd->end <= nd_end)
return INTERLEAVE;
>>> @@ -275,10 +306,13 @@ acpi_numa_processor_affinity_init(const struct
>> acpi_srat_cpu_affinity *pa)
>>> void __init
>>> acpi_numa_memory_affinity_init(const struct acpi_srat_mem_affinity *ma)
>>> {
>>> + enum conflicts status;
>>
>> I don't think you need this local variable.
>>
>
> Why I don't need this one? Did you mean I can use
> switch (conflicting_memblks(...)) directly?
Yes. Why could this not be possible?
>>> node_memblk_range[i].start, node_memblk_range[i].end);
>>> bad_srat();
>>> return;
>>> }
>>> - if (!(ma->flags & ACPI_SRAT_MEM_HOT_PLUGGABLE)) {
>>> - struct node *nd = &nodes[node];
>>>
>>> - if (!node_test_and_set(node, memory_nodes_parsed)) {
>>> - nd->start = start;
>>> - nd->end = end;
>>> - } else {
>>> - if (start < nd->start)
>>> - nd->start = start;
>>> - if (nd->end < end)
>>> - nd->end = end;
>>> - }
>>> + default:
>>> + break;
>>
>> This wants to be "case NO_CONFLICT:", such that the compiler would
>> warn if a new enumerator appears without adding code here. (An
>> alternative - which personally I don't like - would be to put
>> ASSERT_UNREACHABLE() in the default: case. The downside is that
>> then the issue would only be noticeable at runtime.)
>>
>
> Thanks, I will adjust it to:
> case NO_CONFLICT:
> break;
> default:
> ASSERT_UNREACHABLE();
> in next version.
As said - I consider this form less desirable, as it'll defer
noticing of an issue from build-time to runtime. If you think that
form is better, may I ask why?
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |