[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v5 2/6] xen/x86: move generically usable NUMA code from x86 to common
On 29.09.2022 09:43, Wei Chen wrote: > On 2022/9/27 16:19, Jan Beulich wrote: >> On 20.09.2022 11:12, Wei Chen wrote: >>> + nodes_used++; >>> + if ( epdx > memtop ) >>> + memtop = epdx; >>> + } >>> + >>> + if ( nodes_used <= 1 ) >>> + i = BITS_PER_LONG - 1; >> >> Is this actually going to be correct for all architectures? Aiui >> Arm64 has only up to 48 physical address bits, but what about an >> architecture allowing the use of all 64 bits? I think at the very >> least we want BUILD_BUG_ON(PADDR_BITS >= BITS_PER_LONG) here. >> > > Ok I will add above BUILD_BUG_ON. And I also have question why can't > we use PADDR_BITS here directly? Well, if you used PADDR_BITS, then you would use it without subtracting 1, and you'd be in trouble again when PADDR_BITS == BITS_PER_LONG. What may be possible to do instead of BUILD_BUG_ON() is if ( nodes_used <= 1 ) i = min(PADDR_BITS, BITS_PER_LONG - 1); >>> + else >>> + i = find_first_bit(&bitfield, sizeof(unsigned long) * 8); >>> + >>> + memnodemapsize = (memtop >> i) + 1; >> >> Again perhaps the subject of a separate patch: Isn't there an off-by-1 >> mistake here? memtop is the maximum of all epdx-es, which are >> calculated to be the first PDX following the region. Hence I'd expect >> >> memnodemapsize = ((memtop - 1) >> i) + 1; >> >> here. I guess I'll make patches for both issues, which you may then >> need to re-base over. >> > > Thanks, I will wait your patches. Already sent out yesterday. >>> +static void cf_check dump_numa(unsigned char key) >>> +{ >>> + s_time_t now = NOW(); >>> + unsigned int i, j, n; >>> + struct domain *d; >>> + const struct page_info *page; >>> + unsigned int page_num_node[MAX_NUMNODES]; >>> + const struct vnuma_info *vnuma; >>> + >>> + printk("'%c' pressed -> dumping numa info (now = %"PRI_stime")\n", key, >>> + now); >>> + >>> + for_each_online_node ( i ) >>> + { >>> + paddr_t pa = pfn_to_paddr(node_start_pfn(i) + 1); >>> + >>> + printk("NODE%u start->%lu size->%lu free->%lu\n", >>> + i, node_start_pfn(i), node_spanned_pages(i), >>> + avail_node_heap_pages(i)); >>> + /* Sanity check phys_to_nid() */ >>> + if ( phys_to_nid(pa) != i ) >>> + printk("phys_to_nid(%"PRIpaddr") -> %d should be %u\n", >>> + pa, phys_to_nid(pa), i); >>> + } >>> + >>> + j = cpumask_first(&cpu_online_map); >>> + n = 0; >>> + for_each_online_cpu ( i ) >>> + { >>> + if ( i != j + n || cpu_to_node[j] != cpu_to_node[i] ) >>> + { >>> + if ( n > 1 ) >>> + printk("CPU%u...%u -> NODE%d\n", j, j + n - 1, >>> cpu_to_node[j]); >>> + else >>> + printk("CPU%u -> NODE%d\n", j, cpu_to_node[j]); >>> + j = i; >>> + n = 1; >>> + } >>> + else >>> + ++n; >>> + } >>> + if ( n > 1 ) >>> + printk("CPU%u...%u -> NODE%d\n", j, j + n - 1, cpu_to_node[j]); >>> + else >>> + printk("CPU%u -> NODE%d\n", j, cpu_to_node[j]); >>> + >>> + rcu_read_lock(&domlist_read_lock); >>> + >>> + printk("Memory location of each domain:\n"); >>> + for_each_domain ( d ) >>> + { >>> + process_pending_softirqs(); >>> + >>> + printk("Domain %u (total: %u):\n", d->domain_id, >>> domain_tot_pages(d)); >>> + >>> + for_each_online_node ( i ) >>> + page_num_node[i] = 0; >> >> I'd be inclined to suggest to use memset() here, but I won't insist >> on you doing this "on the fly". Along with this would likely go the >> request to limit the scope of page_num_node[] (and then perhaps also >> vnuma and page). >> > > memset for page_num_node makes sense, I will do it before > for_each_domain ( d ). That won't be right - array elements need clearing on every iteration. Plus ... > About limit the scope, did you mean, we should move: > > "const struct page_info *page; > unsigned int page_num_node[MAX_NUMNODES]; > const struct vnuma_info *vnuma;" > > to the block of for_each_domain ( d )? ... this limiting of scope (yes to your question) would also conflict with the movement you suggest. It is actually (among other things) such a mistaken movement which the more narrow scope is intended to prevent. Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |