virtio_net: Store RSS setting in virtnet_info
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>
This commit is contained in:
parent
d8dcf5bd6d
commit
fce29030c5
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user