[ovs-dev] [PATCH] dpdk: Refuse running on cpu >= RTE_MAX_LCORE.
David Marchand
david.marchand at redhat.com
Thu Jul 2 13:56:50 UTC 2020
On Thu, Jul 2, 2020 at 3:09 PM Ilya Maximets <i.maximets at ovn.org> wrote:
>
> On 6/26/20 2:27 PM, David Marchand wrote:
> > DPDK lcores range is [0, RTE_MAX_LCORE[.
> > Trying to use a lcore out of this range expose OVS to crashes in DPDK mempool
> > local cache array.
> > Prefer a "clean" abort so that users know that something is wrong with
> > their configuration.
> >
> > Signed-off-by: David Marchand <david.marchand at redhat.com>
> > ---
> > lib/dpdk.c | 7 +++++++
> > 1 file changed, 7 insertions(+)
> >
> > diff --git a/lib/dpdk.c b/lib/dpdk.c
> > index 98d0e2643e..55ce9a9221 100644
> > --- a/lib/dpdk.c
> > +++ b/lib/dpdk.c
> > @@ -617,7 +617,14 @@ dpdk_set_lcore_id(unsigned cpu)
> > {
> > /* NON_PMD_CORE_ID is reserved for use by non pmd threads. */
> > ovs_assert(cpu != NON_PMD_CORE_ID);
> > + if (cpu >= RTE_MAX_LCORE) {
> > + cpu = LCORE_ID_ANY;
> > + }
> > RTE_PER_LCORE(_lcore_id) = cpu;
> > + if (rte_lcore_id() == LCORE_ID_ANY) {
> > + ovs_abort(0, "PMD thread init failed, trying to use more cores than "
> > + "DPDK supports (RTE_MAX_LCORE %u).", RTE_MAX_LCORE);
>
> I don't think that random OVS abort after pmd-cpu-mask change or port addition
> is a good thing to have. Maybe it's better to limit CPU core discovery?
> This way OVS will never try to create thread on unwanted cores.
>
> Since ovs-numa module is mostly used by userspace datapath this will not
> affect non-DPDK setups.
>
> Something like this (not tested):
>
> diff --git a/lib/ovs-numa.c b/lib/ovs-numa.c
> index 6d0a68522..7c8a3b036 100644
> --- a/lib/ovs-numa.c
> +++ b/lib/ovs-numa.c
> @@ -27,6 +27,7 @@
> #include <unistd.h>
> #endif /* __linux__ */
>
> +#include "dpdk.h"
> #include "hash.h"
> #include "openvswitch/hmap.h"
> #include "openvswitch/list.h"
> @@ -58,6 +59,13 @@ VLOG_DEFINE_THIS_MODULE(ovs_numa);
>
> #define MAX_NUMA_NODES 128
>
> +#ifdef DPDK_NETDEV
> +/* DPDK will not work correctly for cores with core_id >= RTE_MAX_LCORE. */
> +#define MAX_CORE_ID (RTE_MAX_LCORE - 1)
> +#else
> +#define MAX_CORE_ID INT_MAX
> +#endif
> +
> /* numa node. */
> struct numa_node {
> struct hmap_node hmap_node; /* In the 'all_numa_nodes'. */
> @@ -112,6 +120,12 @@ insert_new_numa_node(int numa_id)
> static struct cpu_core *
> insert_new_cpu_core(struct numa_node *n, unsigned core_id)
> {
> + if (core_id > MAX_CORE_ID) {
> + VLOG_DBG("Ignoring CPU core with id %u ( %u > %d).",
> + core_id, core_id, MAX_CORE_ID);
> + return NULL;
> + }
> +
> struct cpu_core *c = xzalloc(sizeof *c);
>
> hmap_insert(&all_cpu_cores, &c->hmap_node, hash_int(core_id, 0));
> @@ -278,6 +292,11 @@ ovs_numa_init(void)
> if (ovsthread_once_start(&once)) {
> const struct numa_node *n;
>
> + if (MAX_CORE_ID != INT_MAX) {
> + VLOG_INFO("Maximum allowed CPU core id is %d. "
> + "Other cores will not be available.", MAX_CORE_ID);
> + }
> +
> if (dummy_numa) {
> discover_numa_and_core_dummy();
> } else {
> ---
>
> What do you think?
pmd threads will never run on any core >= RTE_MAX_LCORE ok, it works.
Though, it binds OVS core id and DPDK lcore id.
Should OVS really care about this?
--
David Marchand
More information about the dev
mailing list