Commit e73798f2 authored by Jason Gunthorpe's avatar Jason Gunthorpe

RDMA/uverbs: Fix RCU annotation for radix slot deference

The uapi radix tree is a write-once data structure protected by kref.
Once we get to the ioctl() fop it is not possible for anything else
to be writing to it, so the access should use rcu_dereference_protected.
Reported-by: default avatarMatthew Wilcox <willy@infradead.org>
Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
parent 914e5d7d
...@@ -386,8 +386,7 @@ static int uverbs_set_attr(struct bundle_priv *pbundle, ...@@ -386,8 +386,7 @@ static int uverbs_set_attr(struct bundle_priv *pbundle,
return -EPROTONOSUPPORT; return -EPROTONOSUPPORT;
return 0; return 0;
} }
attr = srcu_dereference( attr = rcu_dereference_protected(*slot, true);
*slot, &pbundle->bundle.ufile->device->disassociate_srcu);
/* Reject duplicate attributes from user-space */ /* Reject duplicate attributes from user-space */
if (test_bit(attr_bkey, pbundle->bundle.attr_present)) if (test_bit(attr_bkey, pbundle->bundle.attr_present))
...@@ -498,9 +497,7 @@ static int bundle_destroy(struct bundle_priv *pbundle, bool commit) ...@@ -498,9 +497,7 @@ static int bundle_destroy(struct bundle_priv *pbundle, bool commit)
if (WARN_ON(!slot)) if (WARN_ON(!slot))
continue; continue;
attr_uapi = srcu_dereference( attr_uapi = rcu_dereference_protected(*slot, true);
*slot,
&pbundle->bundle.ufile->device->disassociate_srcu);
if (attr_uapi->spec.type == UVERBS_ATTR_TYPE_IDRS_ARRAY) { if (attr_uapi->spec.type == UVERBS_ATTR_TYPE_IDRS_ARRAY) {
current_ret = uverbs_free_idrs_array( current_ret = uverbs_free_idrs_array(
...@@ -542,7 +539,7 @@ static int ib_uverbs_cmd_verbs(struct ib_uverbs_file *ufile, ...@@ -542,7 +539,7 @@ static int ib_uverbs_cmd_verbs(struct ib_uverbs_file *ufile,
uapi_key_ioctl_method(hdr->method_id)); uapi_key_ioctl_method(hdr->method_id));
if (unlikely(!slot)) if (unlikely(!slot))
return -EPROTONOSUPPORT; return -EPROTONOSUPPORT;
method_elm = srcu_dereference(*slot, &ufile->device->disassociate_srcu); method_elm = rcu_dereference_protected(*slot, true);
if (!method_elm->use_stack) { if (!method_elm->use_stack) {
pbundle = kmalloc(method_elm->bundle_size, GFP_KERNEL); pbundle = kmalloc(method_elm->bundle_size, GFP_KERNEL);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment