|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [PATCH v2 3/9] xen/x86: move generically usable NUMA code from x86 to common
Hi Jan,
> -----Original Message-----
> From: Jan Beulich <jbeulich@xxxxxxxx>
> Sent: 2022年7月12日 21:13
> To: Wei Chen <Wei.Chen@xxxxxxx>
> Cc: nd <nd@xxxxxxx>; Andrew Cooper <andrew.cooper3@xxxxxxxxxx>; Roger Pau
> Monné <roger.pau@xxxxxxxxxx>; Wei Liu <wl@xxxxxxx>; George Dunlap
> <george.dunlap@xxxxxxxxxx>; Julien Grall <julien@xxxxxxx>; Stefano
> Stabellini <sstabellini@xxxxxxxxxx>; xen-devel@xxxxxxxxxxxxxxxxxxxx
> Subject: Re: [PATCH v2 3/9] xen/x86: move generically usable NUMA code
> from x86 to common
>
> On 08.07.2022 16:54, Wei Chen wrote:
> > --- /dev/null
> > +++ b/xen/common/numa.c
> > @@ -0,0 +1,439 @@
> > +/*
> > + * Generic VM initialization for NUMA setups.
> > + * Copyright 2002,2003 Andi Kleen, SuSE Labs.
> > + * Adapted for Xen: Ryan Harper <ryanh@xxxxxxxxxx>
> > + */
> > +
> > +#include <xen/init.h>
> > +#include <xen/keyhandler.h>
> > +#include <xen/mm.h>
> > +#include <xen/nodemask.h>
> > +#include <xen/numa.h>
> > +#include <xen/param.h>
> > +#include <xen/sched.h>
> > +#include <xen/softirq.h>
> > +#include <asm/acpi.h>
>
> Isn't the goal for the now common code to not be dependent upon ACPI?
>
Ah, good catch, current common code should be ACPI decoupled.
I will remove "#include <asm/acpi.h>"
Thanks,
Wei Chen
> > +struct node_data node_data[MAX_NUMNODES];
> > +
> > +/* Mapping from pdx to node id */
> > +int memnode_shift;
> > +static typeof(*memnodemap) _memnodemap[64];
> > +unsigned long memnodemapsize;
> > +u8 *memnodemap;
>
> For code moved, please switch to (in this case) uint8_t. I'm on the
> edge of asking to go further and
> - also use __read_mostly for some / all of these,
> - make memnode_shift unsigned int (sadly this looks to require more
> adjustments, even if negative shift counts are meaningless),
> - convert from plain int to unsigned int elsewhere as appropriate,
> - add const where appropriate / possible.
>
Ok, I will address them in next version.
> > +nodeid_t cpu_to_node[NR_CPUS] __read_mostly = {
> > + [0 ... NR_CPUS-1] = NUMA_NO_NODE
> > +};
> > +
> > +cpumask_t node_to_cpumask[MAX_NUMNODES] __read_mostly;
>
> For these two please put __read_mostly into its more conventional
> place (right after the type).
>
Ok.
> > +nodemask_t __read_mostly node_online_map = { { [0] = 1UL } };
> > +
> > +enum numa_mode numa_status;
>
> This should probably have been __read_mostly already in the earlier
> patch introducing it.
>
Ok.
> > +#ifdef CONFIG_NUMA_EMU
> > +static int numa_fake __initdata = 0;
>
> The __initdata again wants to move, and the initializer can be omitted.
>
Ok.
> > +/* [numa=off] */
> > +static int __init cf_check numa_setup(const char *opt)
> > +{
> > + if ( !strncmp(opt,"off",3) )
>
> As you're correcting style violations elsewhere, please also insert the
> missing spaces here and below.
>
Ack.
> > --- a/xen/include/xen/numa.h
> > +++ b/xen/include/xen/numa.h
> > @@ -18,4 +18,78 @@
> > (((d)->vcpu != NULL && (d)->vcpu[0] != NULL) \
> > ? vcpu_to_node((d)->vcpu[0]) : NUMA_NO_NODE)
> >
> > +/* The following content can be used when NUMA feature is enabled */
> > +#ifdef CONFIG_NUMA
> > +
> > +extern nodeid_t cpu_to_node[NR_CPUS];
> > +extern cpumask_t node_to_cpumask[];
> > +
> > +#define cpu_to_node(cpu) (cpu_to_node[cpu])
> > +#define parent_node(node) (node)
> > +#define node_to_first_cpu(node) (__ffs(node_to_cpumask[node]))
> > +#define node_to_cpumask(node) (node_to_cpumask[node])
> > +
> > +struct node {
> > + paddr_t start, end;
> > +};
> > +
> > +extern int compute_hash_shift(struct node *nodes, int numnodes,
> > + nodeid_t *nodeids);
> > +
> > +#define VIRTUAL_BUG_ON(x)
> > +
> > +/* Enumerations for NUMA status. */
> > +enum numa_mode {
> > + numa_on = 0,
> > + numa_off,
> > + /* NUMA turns on, but ACPI table is bad or disabled. */
> > + numa_no_acpi,
> > + /* NUMA turns on, and ACPI table works well. */
> > + numa_acpi,
> > +};
> > +
> > +extern void numa_add_cpu(int cpu);
> > +extern void numa_init_array(void);
> > +extern void numa_initmem_init(unsigned long start_pfn, unsigned long
> end_pfn);
> > +extern bool numa_enabled_with_firmware(void);
> > +extern enum numa_mode numa_status;
> > +
> > +extern void numa_set_node(int cpu, nodeid_t node);
> > +extern void setup_node_bootmem(nodeid_t nodeid, paddr_t start, paddr_t
> end);
> > +
> > +static inline void clear_node_cpumask(int cpu)
> > +{
> > + cpumask_clear_cpu(cpu, &node_to_cpumask[cpu_to_node(cpu)]);
> > +}
> > +
> > +/* Simple perfect hash to map pdx to node numbers */
> > +extern int memnode_shift;
> > +extern unsigned long memnodemapsize;
> > +extern u8 *memnodemap;
> > +
> > +struct node_data {
> > + unsigned long node_start_pfn;
> > + unsigned long node_spanned_pages;
> > +};
> > +
> > +extern struct node_data node_data[];
> > +
> > +static inline __attribute__((pure)) nodeid_t phys_to_nid(paddr_t addr)
>
> Please use __attribute_pure__.
>
Ack.
> Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |