Skip to content

Commit

Permalink
virtio_net: Store RSS setting in virtnet_info
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Daniel Jurgens authored and Paolo Abeni committed May 7, 2024
1 parent d8dcf5b commit fce2903
Showing 1 changed file with 20 additions and 20 deletions.
40 changes: 20 additions & 20 deletions drivers/net/virtio_net.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand All @@ -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)
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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;

Expand All @@ -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;
}

Expand All @@ -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;
}

Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit fce2903

Please sign in to comment.