RDMA/core: Fix missed initialization of rdma_hw_stats::lock
authorMark Zhang <markzhang@nvidia.com>
Tue, 26 Oct 2021 08:43:03 +0000 (11:43 +0300)
committerJason Gunthorpe <jgg@nvidia.com>
Thu, 28 Oct 2021 11:58:26 +0000 (08:58 -0300)
alloc_and_bind() creates a new rdma_hw_stats structure but misses
initializing the mutex lock.

This causes debug kernel failures:

 DEBUG_LOCKS_WARN_ON(lock->magic != lock)
 WARNING: CPU: 4 PID: 64464 at kernel/locking/mutex.c:575 __mutex_lock+0x9c3/0x12b0
 Call Trace:
  fill_res_counter_entry+0x6ee/0x1020 [ib_core]
  res_get_common_dumpit+0x907/0x10a0 [ib_core]
  nldev_stat_get_dumpit+0x20a/0x290 [ib_core]
  netlink_dump+0x451/0x1040
  __netlink_dump_start+0x583/0x830
  rdma_nl_rcv_msg+0x3f3/0x7c0 [ib_core]
  rdma_nl_rcv+0x264/0x410 [ib_core]
  netlink_unicast+0x433/0x700
  netlink_sendmsg+0x707/0xbf0
  sock_sendmsg+0xb0/0xe0
  __sys_sendto+0x193/0x240
  __x64_sys_sendto+0xdd/0x1b0
  do_syscall_64+0x3d/0x90
  entry_SYSCALL_64_after_hwframe+0x44/0xae

Instead of requiring all users to open code initialization of the lock put
it in the general rdma_alloc_hw_stats_struct() function and remove
duplicates.

Fixes: c4ffee7c9bdb ("RDMA/netlink: Implement counter dumpit calback")
Link: https://lore.kernel.org/r/4a22986c4685058d2c735d91703ee7d865815bb9.1635237668.git.leonro@nvidia.com
Signed-off-by: Mark Zhang <markzhang@nvidia.com>
Reviewed-by: Maor Gottlieb <maorg@nvidia.com>
Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/infiniband/core/sysfs.c
drivers/infiniband/core/verbs.c

index 8626dfbf21995b837e75f9b98e0207d7f49f2f8a..a3f84b50c46ac513ac57a5d7d1d761effc459a8b 100644 (file)
@@ -911,7 +911,6 @@ alloc_hw_stats_device(struct ib_device *ibdev)
        if (!data->group.attrs)
                goto err_free_data;
 
-       mutex_init(&stats->lock);
        data->group.name = "hw_counters";
        data->stats = stats;
        return data;
@@ -1018,7 +1017,6 @@ alloc_hw_stats_port(struct ib_port *port, struct attribute_group *group)
        if (!group->attrs)
                goto err_free_data;
 
-       mutex_init(&stats->lock);
        group->name = "hw_counters";
        data->stats = stats;
        return data;
index 47cf273d06780da0f576622e131648d44b53903c..692d5ff657dfa2c1e37884e484fe8b192cf067a6 100644 (file)
@@ -3002,6 +3002,7 @@ struct rdma_hw_stats *rdma_alloc_hw_stats_struct(
        stats->descs = descs;
        stats->num_counters = num_counters;
        stats->lifespan = msecs_to_jiffies(lifespan);
+       mutex_init(&stats->lock);
 
        return stats;