Commit fce29030 authored by Daniel Jurgens's avatar Daniel Jurgens Committed by Paolo Abeni

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: default avatarDaniel Jurgens <danielj@nvidia.com>
Reviewed-by: default avatarJiri Pirko <jiri@nvidia.com>
Reviewed-by: default avatarHeng Qi <hengqi@linux.alibaba.com>
Tested-by: default avatarHeng Qi <hengqi@linux.alibaba.com>
Acked-by: default avatarJason Wang <jasowang@redhat.com>
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent d8dcf5bd
...@@ -373,7 +373,6 @@ struct control_buf { ...@@ -373,7 +373,6 @@ struct control_buf {
u8 allmulti; u8 allmulti;
__virtio16 vid; __virtio16 vid;
__virtio64 offloads; __virtio64 offloads;
struct virtio_net_ctrl_rss rss;
struct virtio_net_ctrl_coal_tx coal_tx; struct virtio_net_ctrl_coal_tx coal_tx;
struct virtio_net_ctrl_coal_rx coal_rx; struct virtio_net_ctrl_coal_rx coal_rx;
struct virtio_net_ctrl_coal_vq coal_vq; struct virtio_net_ctrl_coal_vq coal_vq;
...@@ -416,6 +415,7 @@ struct virtnet_info { ...@@ -416,6 +415,7 @@ struct virtnet_info {
u16 rss_indir_table_size; u16 rss_indir_table_size;
u32 rss_hash_types_supported; u32 rss_hash_types_supported;
u32 rss_hash_types_saved; u32 rss_hash_types_saved;
struct virtio_net_ctrl_rss rss;
/* Has control virtqueue */ /* Has control virtqueue */
bool has_cvq; bool has_cvq;
...@@ -3243,17 +3243,17 @@ static bool virtnet_commit_rss_command(struct virtnet_info *vi) ...@@ -3243,17 +3243,17 @@ static bool virtnet_commit_rss_command(struct virtnet_info *vi)
sg_init_table(sgs, 4); sg_init_table(sgs, 4);
sg_buf_size = offsetof(struct virtio_net_ctrl_rss, indirection_table); 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_buf_size = sizeof(uint16_t) * (vi->rss.indirection_table_mask + 1);
sg_set_buf(&sgs[1], vi->ctrl->rss.indirection_table, sg_buf_size); sg_set_buf(&sgs[1], vi->rss.indirection_table, sg_buf_size);
sg_buf_size = offsetof(struct virtio_net_ctrl_rss, key) sg_buf_size = offsetof(struct virtio_net_ctrl_rss, key)
- offsetof(struct virtio_net_ctrl_rss, max_tx_vq); - 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_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, if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_MQ,
vi->has_rss ? VIRTIO_NET_CTRL_MQ_RSS_CONFIG vi->has_rss ? VIRTIO_NET_CTRL_MQ_RSS_CONFIG
...@@ -3269,21 +3269,21 @@ static void virtnet_init_default_rss(struct virtnet_info *vi) ...@@ -3269,21 +3269,21 @@ static void virtnet_init_default_rss(struct virtnet_info *vi)
u32 indir_val = 0; u32 indir_val = 0;
int i = 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->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->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) { for (; i < vi->rss_indir_table_size; ++i) {
indir_val = ethtool_rxfh_indir_default(i, vi->curr_queue_pairs); 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->rss.max_tx_vq = vi->has_rss ? vi->curr_queue_pairs : 0;
vi->ctrl->rss.hash_key_length = vi->rss_key_size; 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) 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 * ...@@ -3394,7 +3394,7 @@ static bool virtnet_set_hashflow(struct virtnet_info *vi, struct ethtool_rxnfc *
if (new_hashtypes != vi->rss_hash_types_saved) { if (new_hashtypes != vi->rss_hash_types_saved) {
vi->rss_hash_types_saved = new_hashtypes; 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) if (vi->dev->features & NETIF_F_RXHASH)
return virtnet_commit_rss_command(vi); return virtnet_commit_rss_command(vi);
} }
...@@ -4574,11 +4574,11 @@ static int virtnet_get_rxfh(struct net_device *dev, ...@@ -4574,11 +4574,11 @@ static int virtnet_get_rxfh(struct net_device *dev,
if (rxfh->indir) { if (rxfh->indir) {
for (i = 0; i < vi->rss_indir_table_size; ++i) 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) 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; rxfh->hfunc = ETH_RSS_HASH_TOP;
...@@ -4602,7 +4602,7 @@ static int virtnet_set_rxfh(struct net_device *dev, ...@@ -4602,7 +4602,7 @@ static int virtnet_set_rxfh(struct net_device *dev,
return -EOPNOTSUPP; return -EOPNOTSUPP;
for (i = 0; i < vi->rss_indir_table_size; ++i) 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; update = true;
} }
...@@ -4614,7 +4614,7 @@ static int virtnet_set_rxfh(struct net_device *dev, ...@@ -4614,7 +4614,7 @@ static int virtnet_set_rxfh(struct net_device *dev,
if (!vi->has_rss && !vi->has_rss_hash_report) if (!vi->has_rss && !vi->has_rss_hash_report)
return -EOPNOTSUPP; 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; update = true;
} }
...@@ -5028,9 +5028,9 @@ static int virtnet_set_features(struct net_device *dev, ...@@ -5028,9 +5028,9 @@ static int virtnet_set_features(struct net_device *dev,
if ((dev->features ^ features) & NETIF_F_RXHASH) { if ((dev->features ^ features) & NETIF_F_RXHASH) {
if (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 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)) if (!virtnet_commit_rss_command(vi))
return -EINVAL; return -EINVAL;
......
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