tree:
https://git.kernel.org/pub/scm/linux/kernel/git/leon/linux-rdma.git rdma-next
head: 00379b407ab12167a4a0e8264392c8c9bfb5ef2d
commit: a65107565e609c005cb5a3b12d41697ac25eb3d2 [3/31] RDMA/counter: Combine allocation
and bind logic
config: i386-randconfig-m021-20201115 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp(a)intel.com>
Reported-by: Dan Carpenter <dan.carpenter(a)oracle.com>
smatch warnings:
drivers/infiniband/core/counters.c:154 alloc_and_bind() error: double unlocked
'port_counter->lock' (orig line 139)
vim +154 drivers/infiniband/core/counters.c
a65107565e609c Leon Romanovsky 2020-08-16 98 static struct rdma_counter
*alloc_and_bind(struct ib_device *dev, u8 port,
a65107565e609c Leon Romanovsky 2020-08-16 99 struct ib_qp *qp,
99fa331dc8629b Mark Zhang 2019-07-02 100 enum rdma_nl_counter_mode mode)
99fa331dc8629b Mark Zhang 2019-07-02 101 {
1bd8e0a9d0fd1b Mark Zhang 2019-07-02 102 struct rdma_port_counter *port_counter;
99fa331dc8629b Mark Zhang 2019-07-02 103 struct rdma_counter *counter;
1bd8e0a9d0fd1b Mark Zhang 2019-07-02 104 int ret;
99fa331dc8629b Mark Zhang 2019-07-02 105
c4ffee7c9bdba7 Mark Zhang 2019-07-02 106 if (!dev->ops.counter_dealloc ||
!dev->ops.counter_alloc_stats)
99fa331dc8629b Mark Zhang 2019-07-02 107 return NULL;
99fa331dc8629b Mark Zhang 2019-07-02 108
99fa331dc8629b Mark Zhang 2019-07-02 109 counter = kzalloc(sizeof(*counter),
GFP_KERNEL);
99fa331dc8629b Mark Zhang 2019-07-02 110 if (!counter)
99fa331dc8629b Mark Zhang 2019-07-02 111 return NULL;
99fa331dc8629b Mark Zhang 2019-07-02 112
99fa331dc8629b Mark Zhang 2019-07-02 113 counter->device = dev;
99fa331dc8629b Mark Zhang 2019-07-02 114 counter->port = port;
13ef5539def732 Leon Romanovsky 2020-09-22 115
13ef5539def732 Leon Romanovsky 2020-09-22 116 rdma_restrack_new(&counter->res,
RDMA_RESTRACK_COUNTER);
c4ffee7c9bdba7 Mark Zhang 2019-07-02 117 counter->stats =
dev->ops.counter_alloc_stats(counter);
c4ffee7c9bdba7 Mark Zhang 2019-07-02 118 if (!counter->stats)
c4ffee7c9bdba7 Mark Zhang 2019-07-02 119 goto err_stats;
c4ffee7c9bdba7 Mark Zhang 2019-07-02 120
1bd8e0a9d0fd1b Mark Zhang 2019-07-02 121 port_counter =
&dev->port_data[port].port_counter;
1bd8e0a9d0fd1b Mark Zhang 2019-07-02 122 mutex_lock(&port_counter->lock);
a65107565e609c Leon Romanovsky 2020-08-16 123 switch (mode) {
a65107565e609c Leon Romanovsky 2020-08-16 124 case RDMA_COUNTER_MODE_MANUAL:
1bd8e0a9d0fd1b Mark Zhang 2019-07-02 125 ret =
__counter_set_mode(&port_counter->mode,
1bd8e0a9d0fd1b Mark Zhang 2019-07-02 126 RDMA_COUNTER_MODE_MANUAL, 0);
1bd8e0a9d0fd1b Mark Zhang 2019-07-02 127 if (ret)
1bd8e0a9d0fd1b Mark Zhang 2019-07-02 128 goto err_mode;
a65107565e609c Leon Romanovsky 2020-08-16 129 break;
a65107565e609c Leon Romanovsky 2020-08-16 130 case RDMA_COUNTER_MODE_AUTO:
a65107565e609c Leon Romanovsky 2020-08-16 131 auto_mode_init_counter(counter, qp,
port_counter->mode.mask);
a65107565e609c Leon Romanovsky 2020-08-16 132 break;
a65107565e609c Leon Romanovsky 2020-08-16 133 default:
a65107565e609c Leon Romanovsky 2020-08-16 134 ret = -EOPNOTSUPP;
a65107565e609c Leon Romanovsky 2020-08-16 135 goto err_mode;
1bd8e0a9d0fd1b Mark Zhang 2019-07-02 136 }
1bd8e0a9d0fd1b Mark Zhang 2019-07-02 137
1bd8e0a9d0fd1b Mark Zhang 2019-07-02 138 port_counter->num_counters++;
1bd8e0a9d0fd1b Mark Zhang 2019-07-02 @139
mutex_unlock(&port_counter->lock);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Unlocked
1bd8e0a9d0fd1b Mark Zhang 2019-07-02 140
99fa331dc8629b Mark Zhang 2019-07-02 141 counter->mode.mode = mode;
99fa331dc8629b Mark Zhang 2019-07-02 142 kref_init(&counter->kref);
99fa331dc8629b Mark Zhang 2019-07-02 143 mutex_init(&counter->lock);
99fa331dc8629b Mark Zhang 2019-07-02 144
a65107565e609c Leon Romanovsky 2020-08-16 145 ret = __rdma_counter_bind_qp(counter,
qp);
a65107565e609c Leon Romanovsky 2020-08-16 146 if (ret)
a65107565e609c Leon Romanovsky 2020-08-16 147 goto err_mode;
^^^^^^^^^^^^^
Goto
a65107565e609c Leon Romanovsky 2020-08-16 148
a65107565e609c Leon Romanovsky 2020-08-16 149
rdma_restrack_parent_name(&counter->res, &qp->res);
a65107565e609c Leon Romanovsky 2020-08-16 150 rdma_restrack_add(&counter->res);
99fa331dc8629b Mark Zhang 2019-07-02 151 return counter;
c4ffee7c9bdba7 Mark Zhang 2019-07-02 152
1bd8e0a9d0fd1b Mark Zhang 2019-07-02 153 err_mode:
1bd8e0a9d0fd1b Mark Zhang 2019-07-02 @154
mutex_unlock(&port_counter->lock);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Unlocked again
1bd8e0a9d0fd1b Mark Zhang 2019-07-02 155 kfree(counter->stats);
c4ffee7c9bdba7 Mark Zhang 2019-07-02 156 err_stats:
13ef5539def732 Leon Romanovsky 2020-09-22 157 rdma_restrack_put(&counter->res);
c4ffee7c9bdba7 Mark Zhang 2019-07-02 158 kfree(counter);
c4ffee7c9bdba7 Mark Zhang 2019-07-02 159 return NULL;
99fa331dc8629b Mark Zhang 2019-07-02 160 }
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org