On Mon, Nov 11, 2019 at 3:39 AM Aneesh Kumar K.V <aneesh.kumar@xxxxxxxxxxxxx> wrote: > > Dan Williams <dan.j.williams@xxxxxxxxx> writes: > > > The acpi_map_pxm_to_online_node() helper is used to find the closest > > online node to a given proximity domain. This is used to map devices in > > a proximity domain with no online memory or cpus to the closest online > > node and populate a device's 'numa_node' property. The numa_node > > property allows applications to be migrated "close" to a resource. > > > > In preparation for providing a generic facility to optionally map an > > address range to its closest online node, or the node the range would > > represent were it to be onlined (target_node), up-level the core of > > acpi_map_pxm_to_online_node() to a generic mm/numa helper. > > > > Cc: Michal Hocko <mhocko@xxxxxxxx> > > Cc: "Rafael J. Wysocki" <rjw@xxxxxxxxxxxxx> > > Signed-off-by: Dan Williams <dan.j.williams@xxxxxxxxx> > > --- > > drivers/acpi/numa.c | 41 ----------------------------------------- > > include/linux/acpi.h | 23 ++++++++++++++++++++++- > > include/linux/numa.h | 2 ++ > > mm/mempolicy.c | 30 ++++++++++++++++++++++++++++++ > > 4 files changed, 54 insertions(+), 42 deletions(-) > > > > diff --git a/drivers/acpi/numa.c b/drivers/acpi/numa.c > > index eadbf90e65d1..47b4969d9b93 100644 > > --- a/drivers/acpi/numa.c > > +++ b/drivers/acpi/numa.c > > @@ -72,47 +72,6 @@ int acpi_map_pxm_to_node(int pxm) > > } > > EXPORT_SYMBOL(acpi_map_pxm_to_node); > > > > -/** > > - * acpi_map_pxm_to_online_node - Map proximity ID to online node > > - * @pxm: ACPI proximity ID > > - * > > - * This is similar to acpi_map_pxm_to_node(), but always returns an online > > - * node. When the mapped node from a given proximity ID is offline, it > > - * looks up the node distance table and returns the nearest online node. > > - * > > - * ACPI device drivers, which are called after the NUMA initialization has > > - * completed in the kernel, can call this interface to obtain their device > > - * NUMA topology from ACPI tables. Such drivers do not have to deal with > > - * offline nodes. A node may be offline when a device proximity ID is > > - * unique, SRAT memory entry does not exist, or NUMA is disabled, ex. > > - * "numa=off" on x86. > > - */ > > -int acpi_map_pxm_to_online_node(int pxm) > > -{ > > - int node, min_node; > > - > > - node = acpi_map_pxm_to_node(pxm); > > - > > - if (node == NUMA_NO_NODE) > > - node = 0; > > - > > - min_node = node; > > - if (!node_online(node)) { > > - int min_dist = INT_MAX, dist, n; > > - > > - for_each_online_node(n) { > > - dist = node_distance(node, n); > > - if (dist < min_dist) { > > - min_dist = dist; > > - min_node = n; > > - } > > - } > > - } > > - > > - return min_node; > > -} > > -EXPORT_SYMBOL(acpi_map_pxm_to_online_node); > > - > > static void __init > > acpi_table_print_srat_entry(struct acpi_subtable_header *header) > > { > > diff --git a/include/linux/acpi.h b/include/linux/acpi.h > > index 8b4e516bac00..aeedd09f2f71 100644 > > --- a/include/linux/acpi.h > > +++ b/include/linux/acpi.h > > @@ -401,9 +401,30 @@ extern void acpi_osi_setup(char *str); > > extern bool acpi_osi_is_win8(void); > > > > #ifdef CONFIG_ACPI_NUMA > > -int acpi_map_pxm_to_online_node(int pxm); > > int acpi_map_pxm_to_node(int pxm); > > int acpi_get_node(acpi_handle handle); > > + > > +/** > > + * acpi_map_pxm_to_online_node - Map proximity ID to online node > > + * @pxm: ACPI proximity ID > > + * > > + * This is similar to acpi_map_pxm_to_node(), but always returns an online > > + * node. When the mapped node from a given proximity ID is offline, it > > + * looks up the node distance table and returns the nearest online node. > > + * > > + * ACPI device drivers, which are called after the NUMA initialization has > > + * completed in the kernel, can call this interface to obtain their device > > + * NUMA topology from ACPI tables. Such drivers do not have to deal with > > + * offline nodes. A node may be offline when a device proximity ID is > > + * unique, SRAT memory entry does not exist, or NUMA is disabled, ex. > > + * "numa=off" on x86. > > + */ > > +static inline int acpi_map_pxm_to_online_node(int pxm) > > +{ > > + int node = acpi_map_pxm_to_node(pxm); > > + > > + return numa_map_to_online_node(node); > > +} > > #else > > static inline int acpi_map_pxm_to_online_node(int pxm) > > { > > diff --git a/include/linux/numa.h b/include/linux/numa.h > > index 110b0e5d0fb0..4fd80f42be43 100644 > > --- a/include/linux/numa.h > > +++ b/include/linux/numa.h > > @@ -13,4 +13,6 @@ > > > > #define NUMA_NO_NODE (-1) > > > > +int numa_map_to_online_node(int node); > > + > > #endif /* _LINUX_NUMA_H */ > > diff --git a/mm/mempolicy.c b/mm/mempolicy.c > > index 4ae967bcf954..e2d8dd21ce9d 100644 > > --- a/mm/mempolicy.c > > +++ b/mm/mempolicy.c > > @@ -127,6 +127,36 @@ static struct mempolicy default_policy = { > > > > static struct mempolicy preferred_node_policy[MAX_NUMNODES]; > > > > +/** > > + * numa_map_to_online_node - Find closest online node > > + * @nid: Node id to start the search > > + * > > + * Lookup the next closest node by distance if @nid is not online. > > + */ > > +int numa_map_to_online_node(int node) > > +{ > > + int min_node; > > + > > + if (node == NUMA_NO_NODE) > > + node = 0; > > The ppc64 variant papr_scm_node return the NUMA_NO_NODE in this case. > Most of the mm helpers can handle with that value . So instead of > forcing node = 0, let the subsystem decide what to do with the > NUMA_NO_NODE value.? > > > + > > + min_node = node; > > + if (!node_online(node)) { > > + int min_dist = INT_MAX, dist, n; > > + > > + for_each_online_node(n) { > > + dist = node_distance(node, n); > > + if (dist < min_dist) { > > + min_dist = dist; > > + min_node = n; > > + } > > + } > > + } > > + > > + return min_node; > > +} > > +EXPORT_SYMBOL_GPL(numa_map_to_online_node); > > + > > struct mempolicy *get_task_policy(struct task_struct *p) > > { > > struct mempolicy *pol = p->mempolicy; > > > Can we also switch papr_scm_node to numa_map_to_online_node()? Sure, I'll take a look. May I ask for a review of patches 1-12? Should be quick as they're mostly following the same theme.