]> git.dujemihanovic.xyz Git - linux.git/commitdiff
virtio_net: Remove rtnl lock protection of command buffers
authorDaniel Jurgens <danielj@nvidia.com>
Fri, 3 May 2024 20:24:45 +0000 (23:24 +0300)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 7 May 2024 09:42:00 +0000 (11:42 +0200)
The rtnl lock is no longer needed to protect the control buffer and
command VQ.

Signed-off-by: Daniel Jurgens <danielj@nvidia.com>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
Reviewed-by: Heng Qi <hengqi@linux.alibaba.com>
Tested-by: Heng Qi <hengqi@linux.alibaba.com>
Acked-by: Jason Wang <jasowang@redhat.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/virtio_net.c

index a7cbfa7f5311c98a574a2aff5fa845c29a3199df..218a446c4c278e7054d471287a0644dbc3280fdb 100644 (file)
@@ -2824,14 +2824,12 @@ static void virtnet_stats(struct net_device *dev,
 
 static void virtnet_ack_link_announce(struct virtnet_info *vi)
 {
-       rtnl_lock();
        if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_ANNOUNCE,
                                  VIRTIO_NET_CTRL_ANNOUNCE_ACK, NULL))
                dev_warn(&vi->dev->dev, "Failed to ack link announce.\n");
-       rtnl_unlock();
 }
 
-static int _virtnet_set_queues(struct virtnet_info *vi, u16 queue_pairs)
+static int virtnet_set_queues(struct virtnet_info *vi, u16 queue_pairs)
 {
        struct virtio_net_ctrl_mq *mq __free(kfree) = NULL;
        struct scatterlist sg;
@@ -2862,16 +2860,6 @@ static int _virtnet_set_queues(struct virtnet_info *vi, u16 queue_pairs)
        return 0;
 }
 
-static int virtnet_set_queues(struct virtnet_info *vi, u16 queue_pairs)
-{
-       int err;
-
-       rtnl_lock();
-       err = _virtnet_set_queues(vi, queue_pairs);
-       rtnl_unlock();
-       return err;
-}
-
 static int virtnet_close(struct net_device *dev)
 {
        u8 *promisc_allmulti  __free(kfree) = NULL;
@@ -3477,7 +3465,7 @@ static int virtnet_set_channels(struct net_device *dev,
                return -EINVAL;
 
        cpus_read_lock();
-       err = _virtnet_set_queues(vi, queue_pairs);
+       err = virtnet_set_queues(vi, queue_pairs);
        if (err) {
                cpus_read_unlock();
                goto err;
@@ -4409,9 +4397,6 @@ static void virtnet_rx_dim_work(struct work_struct *work)
        struct dim_cq_moder update_moder;
        int qnum, err;
 
-       if (!rtnl_trylock())
-               return;
-
        qnum = rq - vi->rq;
 
        mutex_lock(&rq->dim_lock);
@@ -4431,7 +4416,6 @@ static void virtnet_rx_dim_work(struct work_struct *work)
        }
 out:
        mutex_unlock(&rq->dim_lock);
-       rtnl_unlock();
 }
 
 static int virtnet_coal_params_supported(struct ethtool_coalesce *ec)
@@ -4989,7 +4973,7 @@ static int virtnet_xdp_set(struct net_device *dev, struct bpf_prog *prog,
                synchronize_net();
        }
 
-       err = _virtnet_set_queues(vi, curr_qp + xdp_qp);
+       err = virtnet_set_queues(vi, curr_qp + xdp_qp);
        if (err)
                goto err;
        netif_set_real_num_rx_queues(dev, curr_qp + xdp_qp);
@@ -5855,7 +5839,7 @@ static int virtnet_probe(struct virtio_device *vdev)
 
        virtio_device_ready(vdev);
 
-       _virtnet_set_queues(vi, vi->curr_queue_pairs);
+       virtnet_set_queues(vi, vi->curr_queue_pairs);
 
        /* a random MAC address has been assigned, notify the device.
         * We don't fail probe if VIRTIO_NET_F_CTRL_MAC_ADDR is not there