Re: Re: Re: linux-next: build failure after merge of the rdma tree

From: Bernard Metzler
Date: Mon Jul 08 2019 - 11:08:41 EST


-----"Jason Gunthorpe" <jgg@xxxxxxxxxxxx> wrote: -----

>To: "Bernard Metzler" <BMT@xxxxxxxxxxxxxx>
>From: "Jason Gunthorpe" <jgg@xxxxxxxxxxxx>
>Date: 07/08/2019 04:56PM
>Cc: "Stephen Rothwell" <sfr@xxxxxxxxxxxxxxxx>, "Doug Ledford"
><dledford@xxxxxxxxxx>, "Linux Next Mailing List"
><linux-next@xxxxxxxxxxxxxxx>, "Linux Kernel Mailing List"
><linux-kernel@xxxxxxxxxxxxxxx>, "linux-rdma@xxxxxxxxxxxxxxx"
><linux-rdma@xxxxxxxxxxxxxxx>
>Subject: [EXTERNAL] Re: Re: linux-next: build failure after merge of
>the rdma tree
>
>On Mon, Jul 08, 2019 at 02:28:13PM +0000, Bernard Metzler wrote:
>
>> Thanks for bringing this up. Indeed, that explicit
>> initialization seem to be inappropriate. Can you please
>> fix that as you suggest?
>
>I'm applying this to fix the PER_CPU stuff in siw:
>
>From 4c7d6dcd364843e408a60952ba914bb72bafc6cc Mon Sep 17 00:00:00
>2001
>From: Jason Gunthorpe <jgg@xxxxxxxxxxxx>
>Date: Mon, 8 Jul 2019 11:36:32 -0300
>Subject: [PATCH] RDMA/siw: Fix DEFINE_PER_CPU compilation when
> ARCH_NEEDS_WEAK_PER_CPU
>
>The initializer for the variable cannot be inside the macro (and zero
>initialization isn't needed anyhow).
>
>include/linux/percpu-defs.h:92:33: warning: '__pcpu_unique_use_cnt'
>initialized and declared 'extern'
> extern __PCPU_DUMMY_ATTRS char __pcpu_unique_##name; \
> ^~~~~~~~~~~~~~
>include/linux/percpu-defs.h:115:2: note: in expansion of macro
>'DEFINE_PER_CPU_SECTION'
> DEFINE_PER_CPU_SECTION(type, name, "")
> ^~~~~~~~~~~~~~~~~~~~~~
>drivers/infiniband/sw/siw/siw_main.c:129:8: note: in expansion of
>macro 'DEFINE_PER_CPU'
> static DEFINE_PER_CPU(atomic_t, use_cnt = ATOMIC_INIT(0));
> ^~~~~~~~~~~~~~
>
>Also the rules for PER_CPU require the variable names to be globally
>unique, so prefix them with siw_
>
>Fixes: b9be6f18cf9e ("rdma/siw: transmit path")
>Fixes: bdcf26bf9b3a ("rdma/siw: network and RDMA core interface")
>Reported-by: Stephen Rothwell <sfr@xxxxxxxxxxxxxxxx>
>Signed-off-by: Jason Gunthorpe <jgg@xxxxxxxxxxxx>
>---
> drivers/infiniband/sw/siw/siw_main.c | 8 ++++----
> drivers/infiniband/sw/siw/siw_qp_tx.c | 10 +++++-----
> 2 files changed, 9 insertions(+), 9 deletions(-)
>
>diff --git a/drivers/infiniband/sw/siw/siw_main.c
>b/drivers/infiniband/sw/siw/siw_main.c
>index 3f5f3d27ebe5a1..fd2552a9091dee 100644
>--- a/drivers/infiniband/sw/siw/siw_main.c
>+++ b/drivers/infiniband/sw/siw/siw_main.c
>@@ -126,7 +126,7 @@ static int siw_dev_qualified(struct net_device
>*netdev)
> return 0;
> }
>
>-static DEFINE_PER_CPU(atomic_t, use_cnt = ATOMIC_INIT(0));
>+static DEFINE_PER_CPU(atomic_t, siw_use_cnt);
>
> static struct {
> struct cpumask **tx_valid_cpus;
>@@ -215,7 +215,7 @@ int siw_get_tx_cpu(struct siw_device *sdev)
> if (!siw_tx_thread[cpu])
> continue;
>
>- usage = atomic_read(&per_cpu(use_cnt, cpu));
>+ usage = atomic_read(&per_cpu(siw_use_cnt, cpu));
> if (usage <= min_use) {
> tx_cpu = cpu;
> min_use = usage;
>@@ -226,7 +226,7 @@ int siw_get_tx_cpu(struct siw_device *sdev)
>
> out:
> if (tx_cpu >= 0)
>- atomic_inc(&per_cpu(use_cnt, tx_cpu));
>+ atomic_inc(&per_cpu(siw_use_cnt, tx_cpu));
> else
> pr_warn("siw: no tx cpu found\n");
>
>@@ -235,7 +235,7 @@ int siw_get_tx_cpu(struct siw_device *sdev)
>
> void siw_put_tx_cpu(int cpu)
> {
>- atomic_dec(&per_cpu(use_cnt, cpu));
>+ atomic_dec(&per_cpu(siw_use_cnt, cpu));
> }
>
> static struct ib_qp *siw_get_base_qp(struct ib_device *base_dev, int
>id)
>diff --git a/drivers/infiniband/sw/siw/siw_qp_tx.c
>b/drivers/infiniband/sw/siw/siw_qp_tx.c
>index 5e926fac51db30..1c9fa8fa96e513 100644
>--- a/drivers/infiniband/sw/siw/siw_qp_tx.c
>+++ b/drivers/infiniband/sw/siw/siw_qp_tx.c
>@@ -1183,12 +1183,12 @@ struct tx_task_t {
> wait_queue_head_t waiting;
> };
>
>-static DEFINE_PER_CPU(struct tx_task_t, tx_task_g);
>+static DEFINE_PER_CPU(struct tx_task_t, siw_tx_task_g);
>
> void siw_stop_tx_thread(int nr_cpu)
> {
> kthread_stop(siw_tx_thread[nr_cpu]);
>- wake_up(&per_cpu(tx_task_g, nr_cpu).waiting);
>+ wake_up(&per_cpu(siw_tx_task_g, nr_cpu).waiting);
> }
>
> int siw_run_sq(void *data)
>@@ -1196,7 +1196,7 @@ int siw_run_sq(void *data)
> const int nr_cpu = (unsigned int)(long)data;
> struct llist_node *active;
> struct siw_qp *qp;
>- struct tx_task_t *tx_task = &per_cpu(tx_task_g, nr_cpu);
>+ struct tx_task_t *tx_task = &per_cpu(siw_tx_task_g, nr_cpu);
>
> init_llist_head(&tx_task->active);
> init_waitqueue_head(&tx_task->waiting);
>@@ -1261,9 +1261,9 @@ int siw_sq_start(struct siw_qp *qp)
> }
> siw_qp_get(qp);
>
>- llist_add(&qp->tx_list, &per_cpu(tx_task_g, qp->tx_cpu).active);
>+ llist_add(&qp->tx_list, &per_cpu(siw_tx_task_g,
>qp->tx_cpu).active);
>
>- wake_up(&per_cpu(tx_task_g, qp->tx_cpu).waiting);
>+ wake_up(&per_cpu(siw_tx_task_g, qp->tx_cpu).waiting);
>
> return 0;
> }
>--
>2.21.0
>
>

Many thanks Jason!

Very much appreciated!

Bernard.