From: Andrew Melnichenko <andrew@daynix.com> To: Jason Wang <jasowang@redhat.com> Cc: netdev@vger.kernel.org, virtualization@lists.linux-foundation.org, linux-kernel@vger.kernel.org, davem@davemloft.net, kuba@kernel.org, "Michael S. Tsirkin" <mst@redhat.com>, Yan Vugenfirer <yan@daynix.com>, Yuri Benditovich <yuri.benditovich@daynix.com> Subject: Re: [PATCH 4/4] drivers/net/virtio_net: Added RSS hash report control. Date: Mon, 17 Jan 2022 09:58:47 +0200 [thread overview] Message-ID: <CABcq3pFOL9u9rdwjyERzf06314MU9q3P0dFkQGzX2XxJv_Fe7w@mail.gmail.com> (raw) In-Reply-To: <e92eba5b-1fd6-0b58-6fb5-2e322fdad3ef@redhat.com> Hi all, > e.g RXH_VLAN with port hash? > Any way to merge the two switch? The code is hard to be reviewed anyhow. I'll refactor virtnet_set_hashflow. > I think it's better to use VIRTIO_NET_HASH_REPORT_NONE here. Yes, I'll fix that. On Tue, Jan 11, 2022 at 6:33 AM Jason Wang <jasowang@redhat.com> wrote: > > > 在 2022/1/10 上午5:06, Andrew Melnychenko 写道: > > Now it's possible to control supported hashflows. > > Also added hashflow set/get callbacks. > > Also, disabling RXH_IP_SRC/DST for TCP would disable then for UDP. > > TCP and UDP supports only: > > ethtool -U eth0 rx-flow-hash tcp4 sd > > RXH_IP_SRC + RXH_IP_DST > > ethtool -U eth0 rx-flow-hash tcp4 sdfn > > RXH_IP_SRC + RXH_IP_DST + RXH_L4_B_0_1 + RXH_L4_B_2_3 > > > > Signed-off-by: Andrew Melnychenko <andrew@daynix.com> > > --- > > drivers/net/virtio_net.c | 159 +++++++++++++++++++++++++++++++++++++++ > > 1 file changed, 159 insertions(+) > > > > diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c > > index 6e7461b01f87..1b8dd384483c 100644 > > --- a/drivers/net/virtio_net.c > > +++ b/drivers/net/virtio_net.c > > @@ -235,6 +235,7 @@ struct virtnet_info { > > u8 rss_key_size; > > u16 rss_indir_table_size; > > u32 rss_hash_types_supported; > > + u32 rss_hash_types_saved; > > > > /* Has control virtqueue */ > > bool has_cvq; > > @@ -2275,6 +2276,7 @@ static void virtnet_init_default_rss(struct virtnet_info *vi) > > int i = 0; > > > > vi->ctrl->rss.table_info.hash_types = vi->rss_hash_types_supported; > > + vi->rss_hash_types_saved = vi->rss_hash_types_supported; > > vi->ctrl->rss.table_info.indirection_table_mask = vi->rss_indir_table_size - 1; > > vi->ctrl->rss.table_info.unclassified_queue = 0; > > > > @@ -2289,6 +2291,131 @@ static void virtnet_init_default_rss(struct virtnet_info *vi) > > netdev_rss_key_fill(vi->ctrl->rss.key, vi->rss_key_size); > > } > > > > +static void virtnet_get_hashflow(const struct virtnet_info *vi, struct ethtool_rxnfc *info) > > +{ > > + info->data = 0; > > + switch (info->flow_type) { > > + case TCP_V4_FLOW: > > + if (vi->rss_hash_types_saved & VIRTIO_NET_RSS_HASH_TYPE_TCPv4) { > > + info->data = RXH_IP_SRC | RXH_IP_DST | > > + RXH_L4_B_0_1 | RXH_L4_B_2_3; > > + } else if (vi->rss_hash_types_saved & VIRTIO_NET_RSS_HASH_TYPE_IPv4) { > > + info->data = RXH_IP_SRC | RXH_IP_DST; > > + } > > + break; > > + case TCP_V6_FLOW: > > + if (vi->rss_hash_types_saved & VIRTIO_NET_RSS_HASH_TYPE_TCPv6) { > > + info->data = RXH_IP_SRC | RXH_IP_DST | > > + RXH_L4_B_0_1 | RXH_L4_B_2_3; > > + } else if (vi->rss_hash_types_saved & VIRTIO_NET_RSS_HASH_TYPE_IPv6) { > > + info->data = RXH_IP_SRC | RXH_IP_DST; > > + } > > + break; > > + case UDP_V4_FLOW: > > + if (vi->rss_hash_types_saved & VIRTIO_NET_RSS_HASH_TYPE_UDPv4) { > > + info->data = RXH_IP_SRC | RXH_IP_DST | > > + RXH_L4_B_0_1 | RXH_L4_B_2_3; > > + } else if (vi->rss_hash_types_saved & VIRTIO_NET_RSS_HASH_TYPE_IPv4) { > > + info->data = RXH_IP_SRC | RXH_IP_DST; > > + } > > + break; > > + case UDP_V6_FLOW: > > + if (vi->rss_hash_types_saved & VIRTIO_NET_RSS_HASH_TYPE_UDPv6) { > > + info->data = RXH_IP_SRC | RXH_IP_DST | > > + RXH_L4_B_0_1 | RXH_L4_B_2_3; > > + } else if (vi->rss_hash_types_saved & VIRTIO_NET_RSS_HASH_TYPE_IPv6) { > > + info->data = RXH_IP_SRC | RXH_IP_DST; > > + } > > + break; > > + case IPV4_FLOW: > > + if (vi->rss_hash_types_saved & VIRTIO_NET_RSS_HASH_TYPE_IPv4) > > + info->data = RXH_IP_SRC | RXH_IP_DST; > > + > > + break; > > + case IPV6_FLOW: > > + if (vi->rss_hash_types_saved & VIRTIO_NET_RSS_HASH_TYPE_IPv4) > > + info->data = RXH_IP_SRC | RXH_IP_DST; > > + > > + break; > > + default: > > + info->data = 0; > > + break; > > + } > > +} > > + > > +static bool virtnet_set_hashflow(struct virtnet_info *vi, struct ethtool_rxnfc *info) > > +{ > > + u64 is_iphash = info->data & (RXH_IP_SRC | RXH_IP_DST); > > + u64 is_porthash = info->data & (RXH_L4_B_0_1 | RXH_L4_B_2_3); > > + u32 new_hashtypes = vi->rss_hash_types_saved; > > + > > + if ((is_iphash && (is_iphash != (RXH_IP_SRC | RXH_IP_DST))) || > > + (is_porthash && (is_porthash != (RXH_L4_B_0_1 | RXH_L4_B_2_3)))) { > > + return false; > > + } > > + > > + if (!is_iphash && is_porthash) > > + return false; > > > This seems not filter out all the combinations: > > e.g RXH_VLAN with port hash? > > > > + > > + switch (info->flow_type) { > > + case TCP_V4_FLOW: > > + case UDP_V4_FLOW: > > + case IPV4_FLOW: > > + new_hashtypes &= ~VIRTIO_NET_RSS_HASH_TYPE_IPv4; > > + if (is_iphash) > > + new_hashtypes |= VIRTIO_NET_RSS_HASH_TYPE_IPv4; > > + > > + break; > > + case TCP_V6_FLOW: > > + case UDP_V6_FLOW: > > + case IPV6_FLOW: > > + new_hashtypes &= ~VIRTIO_NET_RSS_HASH_TYPE_IPv6; > > + if (is_iphash) > > + new_hashtypes |= VIRTIO_NET_RSS_HASH_TYPE_IPv6; > > + > > + break; > > + default: > > + break; > > + } > > + > > + switch (info->flow_type) { > > + case TCP_V4_FLOW: > > + new_hashtypes &= ~VIRTIO_NET_RSS_HASH_TYPE_TCPv4; > > > Any way to merge the two switch? The code is hard to be reviewed anyhow. > > > > + if (is_porthash) > > + new_hashtypes |= VIRTIO_NET_RSS_HASH_TYPE_TCPv4; > > + > > + break; > > + case UDP_V4_FLOW: > > + new_hashtypes &= ~VIRTIO_NET_RSS_HASH_TYPE_UDPv4; > > + if (is_porthash) > > + new_hashtypes |= VIRTIO_NET_RSS_HASH_TYPE_UDPv4; > > + > > + break; > > + case TCP_V6_FLOW: > > + new_hashtypes &= ~VIRTIO_NET_RSS_HASH_TYPE_TCPv6; > > + if (is_porthash) > > + new_hashtypes |= VIRTIO_NET_RSS_HASH_TYPE_TCPv6; > > + > > + break; > > + case UDP_V6_FLOW: > > + new_hashtypes &= ~VIRTIO_NET_RSS_HASH_TYPE_UDPv6; > > + if (is_porthash) > > + new_hashtypes |= VIRTIO_NET_RSS_HASH_TYPE_UDPv6; > > + > > + break; > > + default: > > + break; > > + } > > + > > + if (new_hashtypes != vi->rss_hash_types_saved) { > > + vi->rss_hash_types_saved = new_hashtypes; > > + vi->ctrl->rss.table_info.hash_types = vi->rss_hash_types_saved; > > + if (vi->dev->features & NETIF_F_RXHASH) > > + return virtnet_commit_rss_command(vi); > > + } > > + > > + return true; > > +} > > > > static void virtnet_get_drvinfo(struct net_device *dev, > > struct ethtool_drvinfo *info) > > @@ -2574,6 +2701,27 @@ static int virtnet_get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *info, > > switch (info->cmd) { > > case ETHTOOL_GRXRINGS: > > info->data = vi->curr_queue_pairs; > > + break; > > + case ETHTOOL_GRXFH: > > + virtnet_get_hashflow(vi, info); > > + break; > > + default: > > + rc = -EOPNOTSUPP; > > + } > > + > > + return rc; > > +} > > + > > +static int virtnet_set_rxnfc(struct net_device *dev, struct ethtool_rxnfc *info) > > +{ > > + struct virtnet_info *vi = netdev_priv(dev); > > + int rc = 0; > > + > > + switch (info->cmd) { > > + case ETHTOOL_SRXFH: > > + if (!virtnet_set_hashflow(vi, info)) > > + rc = -EINVAL; > > + > > break; > > default: > > rc = -EOPNOTSUPP; > > @@ -2602,6 +2750,7 @@ static const struct ethtool_ops virtnet_ethtool_ops = { > > .get_rxfh = virtnet_get_rxfh, > > .set_rxfh = virtnet_set_rxfh, > > .get_rxnfc = virtnet_get_rxnfc, > > + .set_rxnfc = virtnet_set_rxnfc, > > }; > > > > static void virtnet_freeze_down(struct virtio_device *vdev) > > @@ -2854,6 +3003,16 @@ static int virtnet_set_features(struct net_device *dev, > > vi->guest_offloads = offloads; > > } > > > > + if ((dev->features ^ features) & NETIF_F_RXHASH) { > > + if (features & NETIF_F_RXHASH) > > + vi->ctrl->rss.table_info.hash_types = vi->rss_hash_types_saved; > > + else > > + vi->ctrl->rss.table_info.hash_types = 0; > > > I think it's better to use VIRTIO_NET_HASH_REPORT_NONE here. > > Thanks > > > > + > > + if (!virtnet_commit_rss_command(vi)) > > + return -EINVAL; > > + } > > + > > return 0; > > } > > >
WARNING: multiple messages have this Message-ID (diff)
From: Andrew Melnichenko <andrew@daynix.com> To: Jason Wang <jasowang@redhat.com> Cc: "Michael S. Tsirkin" <mst@redhat.com>, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, virtualization@lists.linux-foundation.org, Yuri Benditovich <yuri.benditovich@daynix.com>, Yan Vugenfirer <yan@daynix.com>, kuba@kernel.org, davem@davemloft.net Subject: Re: [PATCH 4/4] drivers/net/virtio_net: Added RSS hash report control. Date: Mon, 17 Jan 2022 09:58:47 +0200 [thread overview] Message-ID: <CABcq3pFOL9u9rdwjyERzf06314MU9q3P0dFkQGzX2XxJv_Fe7w@mail.gmail.com> (raw) In-Reply-To: <e92eba5b-1fd6-0b58-6fb5-2e322fdad3ef@redhat.com> Hi all, > e.g RXH_VLAN with port hash? > Any way to merge the two switch? The code is hard to be reviewed anyhow. I'll refactor virtnet_set_hashflow. > I think it's better to use VIRTIO_NET_HASH_REPORT_NONE here. Yes, I'll fix that. On Tue, Jan 11, 2022 at 6:33 AM Jason Wang <jasowang@redhat.com> wrote: > > > 在 2022/1/10 上午5:06, Andrew Melnychenko 写道: > > Now it's possible to control supported hashflows. > > Also added hashflow set/get callbacks. > > Also, disabling RXH_IP_SRC/DST for TCP would disable then for UDP. > > TCP and UDP supports only: > > ethtool -U eth0 rx-flow-hash tcp4 sd > > RXH_IP_SRC + RXH_IP_DST > > ethtool -U eth0 rx-flow-hash tcp4 sdfn > > RXH_IP_SRC + RXH_IP_DST + RXH_L4_B_0_1 + RXH_L4_B_2_3 > > > > Signed-off-by: Andrew Melnychenko <andrew@daynix.com> > > --- > > drivers/net/virtio_net.c | 159 +++++++++++++++++++++++++++++++++++++++ > > 1 file changed, 159 insertions(+) > > > > diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c > > index 6e7461b01f87..1b8dd384483c 100644 > > --- a/drivers/net/virtio_net.c > > +++ b/drivers/net/virtio_net.c > > @@ -235,6 +235,7 @@ struct virtnet_info { > > u8 rss_key_size; > > u16 rss_indir_table_size; > > u32 rss_hash_types_supported; > > + u32 rss_hash_types_saved; > > > > /* Has control virtqueue */ > > bool has_cvq; > > @@ -2275,6 +2276,7 @@ static void virtnet_init_default_rss(struct virtnet_info *vi) > > int i = 0; > > > > vi->ctrl->rss.table_info.hash_types = vi->rss_hash_types_supported; > > + vi->rss_hash_types_saved = vi->rss_hash_types_supported; > > vi->ctrl->rss.table_info.indirection_table_mask = vi->rss_indir_table_size - 1; > > vi->ctrl->rss.table_info.unclassified_queue = 0; > > > > @@ -2289,6 +2291,131 @@ static void virtnet_init_default_rss(struct virtnet_info *vi) > > netdev_rss_key_fill(vi->ctrl->rss.key, vi->rss_key_size); > > } > > > > +static void virtnet_get_hashflow(const struct virtnet_info *vi, struct ethtool_rxnfc *info) > > +{ > > + info->data = 0; > > + switch (info->flow_type) { > > + case TCP_V4_FLOW: > > + if (vi->rss_hash_types_saved & VIRTIO_NET_RSS_HASH_TYPE_TCPv4) { > > + info->data = RXH_IP_SRC | RXH_IP_DST | > > + RXH_L4_B_0_1 | RXH_L4_B_2_3; > > + } else if (vi->rss_hash_types_saved & VIRTIO_NET_RSS_HASH_TYPE_IPv4) { > > + info->data = RXH_IP_SRC | RXH_IP_DST; > > + } > > + break; > > + case TCP_V6_FLOW: > > + if (vi->rss_hash_types_saved & VIRTIO_NET_RSS_HASH_TYPE_TCPv6) { > > + info->data = RXH_IP_SRC | RXH_IP_DST | > > + RXH_L4_B_0_1 | RXH_L4_B_2_3; > > + } else if (vi->rss_hash_types_saved & VIRTIO_NET_RSS_HASH_TYPE_IPv6) { > > + info->data = RXH_IP_SRC | RXH_IP_DST; > > + } > > + break; > > + case UDP_V4_FLOW: > > + if (vi->rss_hash_types_saved & VIRTIO_NET_RSS_HASH_TYPE_UDPv4) { > > + info->data = RXH_IP_SRC | RXH_IP_DST | > > + RXH_L4_B_0_1 | RXH_L4_B_2_3; > > + } else if (vi->rss_hash_types_saved & VIRTIO_NET_RSS_HASH_TYPE_IPv4) { > > + info->data = RXH_IP_SRC | RXH_IP_DST; > > + } > > + break; > > + case UDP_V6_FLOW: > > + if (vi->rss_hash_types_saved & VIRTIO_NET_RSS_HASH_TYPE_UDPv6) { > > + info->data = RXH_IP_SRC | RXH_IP_DST | > > + RXH_L4_B_0_1 | RXH_L4_B_2_3; > > + } else if (vi->rss_hash_types_saved & VIRTIO_NET_RSS_HASH_TYPE_IPv6) { > > + info->data = RXH_IP_SRC | RXH_IP_DST; > > + } > > + break; > > + case IPV4_FLOW: > > + if (vi->rss_hash_types_saved & VIRTIO_NET_RSS_HASH_TYPE_IPv4) > > + info->data = RXH_IP_SRC | RXH_IP_DST; > > + > > + break; > > + case IPV6_FLOW: > > + if (vi->rss_hash_types_saved & VIRTIO_NET_RSS_HASH_TYPE_IPv4) > > + info->data = RXH_IP_SRC | RXH_IP_DST; > > + > > + break; > > + default: > > + info->data = 0; > > + break; > > + } > > +} > > + > > +static bool virtnet_set_hashflow(struct virtnet_info *vi, struct ethtool_rxnfc *info) > > +{ > > + u64 is_iphash = info->data & (RXH_IP_SRC | RXH_IP_DST); > > + u64 is_porthash = info->data & (RXH_L4_B_0_1 | RXH_L4_B_2_3); > > + u32 new_hashtypes = vi->rss_hash_types_saved; > > + > > + if ((is_iphash && (is_iphash != (RXH_IP_SRC | RXH_IP_DST))) || > > + (is_porthash && (is_porthash != (RXH_L4_B_0_1 | RXH_L4_B_2_3)))) { > > + return false; > > + } > > + > > + if (!is_iphash && is_porthash) > > + return false; > > > This seems not filter out all the combinations: > > e.g RXH_VLAN with port hash? > > > > + > > + switch (info->flow_type) { > > + case TCP_V4_FLOW: > > + case UDP_V4_FLOW: > > + case IPV4_FLOW: > > + new_hashtypes &= ~VIRTIO_NET_RSS_HASH_TYPE_IPv4; > > + if (is_iphash) > > + new_hashtypes |= VIRTIO_NET_RSS_HASH_TYPE_IPv4; > > + > > + break; > > + case TCP_V6_FLOW: > > + case UDP_V6_FLOW: > > + case IPV6_FLOW: > > + new_hashtypes &= ~VIRTIO_NET_RSS_HASH_TYPE_IPv6; > > + if (is_iphash) > > + new_hashtypes |= VIRTIO_NET_RSS_HASH_TYPE_IPv6; > > + > > + break; > > + default: > > + break; > > + } > > + > > + switch (info->flow_type) { > > + case TCP_V4_FLOW: > > + new_hashtypes &= ~VIRTIO_NET_RSS_HASH_TYPE_TCPv4; > > > Any way to merge the two switch? The code is hard to be reviewed anyhow. > > > > + if (is_porthash) > > + new_hashtypes |= VIRTIO_NET_RSS_HASH_TYPE_TCPv4; > > + > > + break; > > + case UDP_V4_FLOW: > > + new_hashtypes &= ~VIRTIO_NET_RSS_HASH_TYPE_UDPv4; > > + if (is_porthash) > > + new_hashtypes |= VIRTIO_NET_RSS_HASH_TYPE_UDPv4; > > + > > + break; > > + case TCP_V6_FLOW: > > + new_hashtypes &= ~VIRTIO_NET_RSS_HASH_TYPE_TCPv6; > > + if (is_porthash) > > + new_hashtypes |= VIRTIO_NET_RSS_HASH_TYPE_TCPv6; > > + > > + break; > > + case UDP_V6_FLOW: > > + new_hashtypes &= ~VIRTIO_NET_RSS_HASH_TYPE_UDPv6; > > + if (is_porthash) > > + new_hashtypes |= VIRTIO_NET_RSS_HASH_TYPE_UDPv6; > > + > > + break; > > + default: > > + break; > > + } > > + > > + if (new_hashtypes != vi->rss_hash_types_saved) { > > + vi->rss_hash_types_saved = new_hashtypes; > > + vi->ctrl->rss.table_info.hash_types = vi->rss_hash_types_saved; > > + if (vi->dev->features & NETIF_F_RXHASH) > > + return virtnet_commit_rss_command(vi); > > + } > > + > > + return true; > > +} > > > > static void virtnet_get_drvinfo(struct net_device *dev, > > struct ethtool_drvinfo *info) > > @@ -2574,6 +2701,27 @@ static int virtnet_get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *info, > > switch (info->cmd) { > > case ETHTOOL_GRXRINGS: > > info->data = vi->curr_queue_pairs; > > + break; > > + case ETHTOOL_GRXFH: > > + virtnet_get_hashflow(vi, info); > > + break; > > + default: > > + rc = -EOPNOTSUPP; > > + } > > + > > + return rc; > > +} > > + > > +static int virtnet_set_rxnfc(struct net_device *dev, struct ethtool_rxnfc *info) > > +{ > > + struct virtnet_info *vi = netdev_priv(dev); > > + int rc = 0; > > + > > + switch (info->cmd) { > > + case ETHTOOL_SRXFH: > > + if (!virtnet_set_hashflow(vi, info)) > > + rc = -EINVAL; > > + > > break; > > default: > > rc = -EOPNOTSUPP; > > @@ -2602,6 +2750,7 @@ static const struct ethtool_ops virtnet_ethtool_ops = { > > .get_rxfh = virtnet_get_rxfh, > > .set_rxfh = virtnet_set_rxfh, > > .get_rxnfc = virtnet_get_rxnfc, > > + .set_rxnfc = virtnet_set_rxnfc, > > }; > > > > static void virtnet_freeze_down(struct virtio_device *vdev) > > @@ -2854,6 +3003,16 @@ static int virtnet_set_features(struct net_device *dev, > > vi->guest_offloads = offloads; > > } > > > > + if ((dev->features ^ features) & NETIF_F_RXHASH) { > > + if (features & NETIF_F_RXHASH) > > + vi->ctrl->rss.table_info.hash_types = vi->rss_hash_types_saved; > > + else > > + vi->ctrl->rss.table_info.hash_types = 0; > > > I think it's better to use VIRTIO_NET_HASH_REPORT_NONE here. > > Thanks > > > > + > > + if (!virtnet_commit_rss_command(vi)) > > + return -EINVAL; > > + } > > + > > return 0; > > } > > > _______________________________________________ Virtualization mailing list Virtualization@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/virtualization
next prev parent reply other threads:[~2022-01-17 7:59 UTC|newest] Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top 2022-01-09 21:06 [PATCH 0/4] RSS support for VirtioNet Andrew Melnychenko 2022-01-09 21:06 ` Andrew Melnychenko 2022-01-09 21:06 ` [PATCH 1/4] drivers/net/virtio_net: Fixed padded vheader to use v1 with hash Andrew Melnychenko 2022-01-09 21:06 ` Andrew Melnychenko 2022-01-09 22:21 ` Jakub Kicinski 2022-01-09 21:06 ` [PATCH 2/4] drivers/net/virtio_net: Added basic RSS support Andrew Melnychenko 2022-01-09 21:06 ` Andrew Melnychenko 2022-01-11 3:44 ` Jason Wang 2022-01-11 3:44 ` Jason Wang 2022-01-11 12:00 ` Michael S. Tsirkin 2022-01-11 12:00 ` Michael S. Tsirkin 2022-01-17 7:49 ` Andrew Melnichenko 2022-01-17 7:49 ` Andrew Melnichenko 2022-01-09 21:06 ` [PATCH 3/4] drivers/net/virtio_net: Added RSS hash report Andrew Melnychenko 2022-01-09 21:06 ` Andrew Melnychenko 2022-01-11 4:05 ` Jason Wang 2022-01-11 4:05 ` Jason Wang 2022-01-17 7:57 ` Andrew Melnichenko 2022-01-17 7:57 ` Andrew Melnichenko 2022-01-09 21:06 ` [PATCH 4/4] drivers/net/virtio_net: Added RSS hash report control Andrew Melnychenko 2022-01-09 21:06 ` Andrew Melnychenko 2022-01-11 4:32 ` Jason Wang 2022-01-11 4:32 ` Jason Wang 2022-01-17 7:58 ` Andrew Melnichenko [this message] 2022-01-17 7:58 ` Andrew Melnichenko
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=CABcq3pFOL9u9rdwjyERzf06314MU9q3P0dFkQGzX2XxJv_Fe7w@mail.gmail.com \ --to=andrew@daynix.com \ --cc=davem@davemloft.net \ --cc=jasowang@redhat.com \ --cc=kuba@kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=mst@redhat.com \ --cc=netdev@vger.kernel.org \ --cc=virtualization@lists.linux-foundation.org \ --cc=yan@daynix.com \ --cc=yuri.benditovich@daynix.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.