]> git.dujemihanovic.xyz Git - linux.git/commitdiff
virtio_net: Store RSS setting in virtnet_info
authorDaniel Jurgens <danielj@nvidia.com>
Fri, 3 May 2024 20:24:40 +0000 (23:24 +0300)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 7 May 2024 09:42:00 +0000 (11:42 +0200)
Stop storing RSS setting in the control buffer. This is prep work for
removing RTNL lock protection of the control buffer.

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 1fa84790041b949a56f4cb8ee59e3cd21481a6ff..9cf93a8a44464d2c4bf4f38b868fca14f4674533 100644 (file)
@@ -373,7 +373,6 @@ struct control_buf {
        u8 allmulti;
        __virtio16 vid;
        __virtio64 offloads;
-       struct virtio_net_ctrl_rss rss;
        struct virtio_net_ctrl_coal_tx coal_tx;
        struct virtio_net_ctrl_coal_rx coal_rx;
        struct virtio_net_ctrl_coal_vq coal_vq;
@@ -416,6 +415,7 @@ struct virtnet_info {
        u16 rss_indir_table_size;
        u32 rss_hash_types_supported;
        u32 rss_hash_types_saved;
+       struct virtio_net_ctrl_rss rss;
 
        /* Has control virtqueue */
        bool has_cvq;
@@ -3243,17 +3243,17 @@ static bool virtnet_commit_rss_command(struct virtnet_info *vi)
        sg_init_table(sgs, 4);
 
        sg_buf_size = offsetof(struct virtio_net_ctrl_rss, indirection_table);
-       sg_set_buf(&sgs[0], &vi->ctrl->rss, sg_buf_size);
+       sg_set_buf(&sgs[0], &vi->rss, sg_buf_size);
 
-       sg_buf_size = sizeof(uint16_t) * (vi->ctrl->rss.indirection_table_mask + 1);
-       sg_set_buf(&sgs[1], vi->ctrl->rss.indirection_table, sg_buf_size);
+       sg_buf_size = sizeof(uint16_t) * (vi->rss.indirection_table_mask + 1);
+       sg_set_buf(&sgs[1], vi->rss.indirection_table, sg_buf_size);
 
        sg_buf_size = offsetof(struct virtio_net_ctrl_rss, key)
                        - offsetof(struct virtio_net_ctrl_rss, max_tx_vq);
-       sg_set_buf(&sgs[2], &vi->ctrl->rss.max_tx_vq, sg_buf_size);
+       sg_set_buf(&sgs[2], &vi->rss.max_tx_vq, sg_buf_size);
 
        sg_buf_size = vi->rss_key_size;
-       sg_set_buf(&sgs[3], vi->ctrl->rss.key, sg_buf_size);
+       sg_set_buf(&sgs[3], vi->rss.key, sg_buf_size);
 
        if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_MQ,
                                  vi->has_rss ? VIRTIO_NET_CTRL_MQ_RSS_CONFIG
@@ -3269,21 +3269,21 @@ static void virtnet_init_default_rss(struct virtnet_info *vi)
        u32 indir_val = 0;
        int i = 0;
 
-       vi->ctrl->rss.hash_types = vi->rss_hash_types_supported;
+       vi->rss.hash_types = vi->rss_hash_types_supported;
        vi->rss_hash_types_saved = vi->rss_hash_types_supported;
-       vi->ctrl->rss.indirection_table_mask = vi->rss_indir_table_size
+       vi->rss.indirection_table_mask = vi->rss_indir_table_size
                                                ? vi->rss_indir_table_size - 1 : 0;
-       vi->ctrl->rss.unclassified_queue = 0;
+       vi->rss.unclassified_queue = 0;
 
        for (; i < vi->rss_indir_table_size; ++i) {
                indir_val = ethtool_rxfh_indir_default(i, vi->curr_queue_pairs);
-               vi->ctrl->rss.indirection_table[i] = indir_val;
+               vi->rss.indirection_table[i] = indir_val;
        }
 
-       vi->ctrl->rss.max_tx_vq = vi->has_rss ? vi->curr_queue_pairs : 0;
-       vi->ctrl->rss.hash_key_length = vi->rss_key_size;
+       vi->rss.max_tx_vq = vi->has_rss ? vi->curr_queue_pairs : 0;
+       vi->rss.hash_key_length = vi->rss_key_size;
 
-       netdev_rss_key_fill(vi->ctrl->rss.key, vi->rss_key_size);
+       netdev_rss_key_fill(vi->rss.key, vi->rss_key_size);
 }
 
 static void virtnet_get_hashflow(const struct virtnet_info *vi, struct ethtool_rxnfc *info)
@@ -3394,7 +3394,7 @@ static bool virtnet_set_hashflow(struct virtnet_info *vi, struct ethtool_rxnfc *
 
        if (new_hashtypes != vi->rss_hash_types_saved) {
                vi->rss_hash_types_saved = new_hashtypes;
-               vi->ctrl->rss.hash_types = vi->rss_hash_types_saved;
+               vi->rss.hash_types = vi->rss_hash_types_saved;
                if (vi->dev->features & NETIF_F_RXHASH)
                        return virtnet_commit_rss_command(vi);
        }
@@ -4574,11 +4574,11 @@ static int virtnet_get_rxfh(struct net_device *dev,
 
        if (rxfh->indir) {
                for (i = 0; i < vi->rss_indir_table_size; ++i)
-                       rxfh->indir[i] = vi->ctrl->rss.indirection_table[i];
+                       rxfh->indir[i] = vi->rss.indirection_table[i];
        }
 
        if (rxfh->key)
-               memcpy(rxfh->key, vi->ctrl->rss.key, vi->rss_key_size);
+               memcpy(rxfh->key, vi->rss.key, vi->rss_key_size);
 
        rxfh->hfunc = ETH_RSS_HASH_TOP;
 
@@ -4602,7 +4602,7 @@ static int virtnet_set_rxfh(struct net_device *dev,
                        return -EOPNOTSUPP;
 
                for (i = 0; i < vi->rss_indir_table_size; ++i)
-                       vi->ctrl->rss.indirection_table[i] = rxfh->indir[i];
+                       vi->rss.indirection_table[i] = rxfh->indir[i];
                update = true;
        }
 
@@ -4614,7 +4614,7 @@ static int virtnet_set_rxfh(struct net_device *dev,
                if (!vi->has_rss && !vi->has_rss_hash_report)
                        return -EOPNOTSUPP;
 
-               memcpy(vi->ctrl->rss.key, rxfh->key, vi->rss_key_size);
+               memcpy(vi->rss.key, rxfh->key, vi->rss_key_size);
                update = true;
        }
 
@@ -5028,9 +5028,9 @@ static int virtnet_set_features(struct net_device *dev,
 
        if ((dev->features ^ features) & NETIF_F_RXHASH) {
                if (features & NETIF_F_RXHASH)
-                       vi->ctrl->rss.hash_types = vi->rss_hash_types_saved;
+                       vi->rss.hash_types = vi->rss_hash_types_saved;
                else
-                       vi->ctrl->rss.hash_types = VIRTIO_NET_HASH_REPORT_NONE;
+                       vi->rss.hash_types = VIRTIO_NET_HASH_REPORT_NONE;
 
                if (!virtnet_commit_rss_command(vi))
                        return -EINVAL;