Re: [PATCH RESEND] virtio: virtio_pci_legacy: Remove default y from Kconfig

2020-02-29 Thread Michael S. Tsirkin
On Fri, Feb 28, 2020 at 03:27:36PM -0800, Ram Muthiah wrote:
> The legacy pci driver should no longer be default enabled. QEMU has
> implemented support for Virtio 1 for virtio-pci since June 2015
> on SHA dfb8e184db75.
> 
> Signed-off-by: Ram Muthiah 

I see little reason to do this: y is safer and will boot on more
hypervisors, so people that aren't sure should enable it.

> ---
>  drivers/virtio/Kconfig | 6 --
>  1 file changed, 6 deletions(-)
> 
> diff --git a/drivers/virtio/Kconfig b/drivers/virtio/Kconfig
> index 078615cf2afc..eacd0b90d32b 100644
> --- a/drivers/virtio/Kconfig
> +++ b/drivers/virtio/Kconfig
> @@ -26,7 +26,6 @@ config VIRTIO_PCI
>  
>  config VIRTIO_PCI_LEGACY
>   bool "Support for legacy virtio draft 0.9.X and older devices"
> - default y
>   depends on VIRTIO_PCI
>   ---help---
>Virtio PCI Card 0.9.X Draft (circa 2014) and older device support.
> @@ -36,11 +35,6 @@ config VIRTIO_PCI_LEGACY
> If disabled, you get a slightly smaller, non-transitional driver,
> with no legacy compatibility.
>  
> -  So look out into your driveway.  Do you have a flying car?  If
> -  so, you can happily disable this option and virtio will not
> -  break.  Otherwise, leave it set.  Unless you're testing what
> -  life will be like in The Future.
> -
> If unsure, say Y.
>  
>  config VIRTIO_PMEM
> -- 
> 2.25.0.265.gbab2e86ba0-goog

___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization


[PATCH 1/3] virtio-net: Introduce extended RSC feature

2020-02-29 Thread Yuri Benditovich
VIRTIO_NET_F_RSC_EXT feature bit indicates that the device
is able to provide extended RSC information. When the feature
is negotiatede and 'gso_type' field in received packet is not
GSO_NONE, the device reports number of coalesced packets in
'csum_start' field and number of duplicated acks in 'csum_offset'
field and sets VIRTIO_NET_HDR_F_RSC_INFO in 'flags' field.

Signed-off-by: Yuri Benditovich 
---
 include/uapi/linux/virtio_net.h | 12 ++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/include/uapi/linux/virtio_net.h b/include/uapi/linux/virtio_net.h
index a3715a3224c1..6e26a2cc6ad0 100644
--- a/include/uapi/linux/virtio_net.h
+++ b/include/uapi/linux/virtio_net.h
@@ -57,6 +57,7 @@
 * Steering */
 #define VIRTIO_NET_F_CTRL_MAC_ADDR 23  /* Set MAC address */
 
+#define VIRTIO_NET_F_RSC_EXT 61/* extended coalescing info */
 #define VIRTIO_NET_F_STANDBY 62/* Act as standby for another device
 * with the same MAC.
 */
@@ -104,6 +105,7 @@ struct virtio_net_config {
 struct virtio_net_hdr_v1 {
 #define VIRTIO_NET_HDR_F_NEEDS_CSUM1   /* Use csum_start, csum_offset 
*/
 #define VIRTIO_NET_HDR_F_DATA_VALID2   /* Csum is valid */
+#define VIRTIO_NET_HDR_F_RSC_INFO  4   /* rsc info in csum_ fields */
__u8 flags;
 #define VIRTIO_NET_HDR_GSO_NONE0   /* Not a GSO frame */
 #define VIRTIO_NET_HDR_GSO_TCPV4   1   /* GSO frame, IPv4 TCP (TSO) */
@@ -113,8 +115,14 @@ struct virtio_net_hdr_v1 {
__u8 gso_type;
__virtio16 hdr_len; /* Ethernet + IP + tcp/udp hdrs */
__virtio16 gso_size;/* Bytes to append to hdr_len per frame */
-   __virtio16 csum_start;  /* Position to start checksumming from */
-   __virtio16 csum_offset; /* Offset after that to place checksum */
+   union {
+   __virtio16 csum_start;  /* Position to start checksumming from 
*/
+   __virtio16 rsc_ext_num_packets; /* num of coalesced packets */
+   };
+   union {
+   __virtio16 csum_offset; /* Offset after that to place checksum 
*/
+   __virtio16 rsc_ext_num_dupacks; /* num of duplicated acks */
+   };
__virtio16 num_buffers; /* Number of merged rx buffers */
 };
 
-- 
2.17.1

___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization


[PATCH 3/3] virtio-net: Introduce hash report feature

2020-02-29 Thread Yuri Benditovich
The feature VIRTIO_NET_F_HASH_REPORT extends the
layout of the packet and requests the device to
calculate hash on incoming packets and report it
in the packet header.

Signed-off-by: Yuri Benditovich 
---
 include/uapi/linux/virtio_net.h | 36 +
 1 file changed, 36 insertions(+)

diff --git a/include/uapi/linux/virtio_net.h b/include/uapi/linux/virtio_net.h
index 7a342657fb6c..6d7230469c57 100644
--- a/include/uapi/linux/virtio_net.h
+++ b/include/uapi/linux/virtio_net.h
@@ -57,6 +57,7 @@
 * Steering */
 #define VIRTIO_NET_F_CTRL_MAC_ADDR 23  /* Set MAC address */
 
+#define VIRTIO_NET_F_HASH_REPORT  57   /* Supports hash report */
 #define VIRTIO_NET_F_RSS 60/* Supports RSS RX steering */
 #define VIRTIO_NET_F_RSC_EXT 61/* extended coalescing info */
 #define VIRTIO_NET_F_STANDBY 62/* Act as standby for another device
@@ -144,6 +145,23 @@ struct virtio_net_hdr_v1 {
__virtio16 num_buffers; /* Number of merged rx buffers */
 };
 
+struct virtio_net_hdr_v1_hash {
+   struct virtio_net_hdr_v1 hdr;
+   __virtio32 hash_value;
+#define VIRTIO_NET_HASH_REPORT_NONE0
+#define VIRTIO_NET_HASH_REPORT_IPv41
+#define VIRTIO_NET_HASH_REPORT_TCPv4   2
+#define VIRTIO_NET_HASH_REPORT_UDPv4   3
+#define VIRTIO_NET_HASH_REPORT_IPv64
+#define VIRTIO_NET_HASH_REPORT_TCPv6   5
+#define VIRTIO_NET_HASH_REPORT_UDPv6   6
+#define VIRTIO_NET_HASH_REPORT_IPv6_EX 7
+#define VIRTIO_NET_HASH_REPORT_TCPv6_EX8
+#define VIRTIO_NET_HASH_REPORT_UDPv6_EX9
+   __virtio16 hash_report;
+   __virtio16 padding;
+};
+
 #ifndef VIRTIO_NET_NO_LEGACY
 /* This header comes first in the scatter-gather list.
  * For legacy virtio, if VIRTIO_F_ANY_LAYOUT is not negotiated, it must
@@ -292,6 +310,24 @@ struct virtio_net_rss_config {
 
  #define VIRTIO_NET_CTRL_MQ_RSS_CONFIG  1
 
+/*
+ * The command VIRTIO_NET_CTRL_MQ_HASH_CONFIG requests the device
+ * to include in the virtio header of the packet the value of the
+ * calculated hash and the report type of hash. It also provides
+ * parameters for hash calculation. The command requires feature
+ * VIRTIO_NET_F_HASH_REPORT to be negotiated to extend the
+ * layout of virtio header as defined in virtio_net_hdr_v1_hash.
+ */
+struct virtio_net_hash_config {
+   __virtio32 hash_types;
+   /* for compatibility with virtio_net_rss_config */
+   __virtio16 reserved[4];
+   __u8 hash_key_length;
+   __u8 hash_key_data[/*hash_key_length*/];
+};
+
+ #define VIRTIO_NET_CTRL_MQ_HASH_CONFIG 2
+
 /*
  * Control network offloads
  *
-- 
2.17.1

___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization


[PATCH 2/3] virtio-net: Introduce RSS receive steering feature

2020-02-29 Thread Yuri Benditovich
RSS (Receive-side scaling) defines hash calculation
rules and decision on receive virtqueue according to
the calculated hash, provided mask to apply and
provided indirection table containing indices of
receive virqueues. The driver sends the control
command to enable multiqueue and provide parameters
for receive steering.

Signed-off-by: Yuri Benditovich 
---
 include/uapi/linux/virtio_net.h | 42 +++--
 1 file changed, 40 insertions(+), 2 deletions(-)

diff --git a/include/uapi/linux/virtio_net.h b/include/uapi/linux/virtio_net.h
index 6e26a2cc6ad0..7a342657fb6c 100644
--- a/include/uapi/linux/virtio_net.h
+++ b/include/uapi/linux/virtio_net.h
@@ -57,6 +57,7 @@
 * Steering */
 #define VIRTIO_NET_F_CTRL_MAC_ADDR 23  /* Set MAC address */
 
+#define VIRTIO_NET_F_RSS 60/* Supports RSS RX steering */
 #define VIRTIO_NET_F_RSC_EXT 61/* extended coalescing info */
 #define VIRTIO_NET_F_STANDBY 62/* Act as standby for another device
 * with the same MAC.
@@ -70,6 +71,17 @@
 #define VIRTIO_NET_S_LINK_UP   1   /* Link is up */
 #define VIRTIO_NET_S_ANNOUNCE  2   /* Announcement is needed */
 
+/* supported/enabled hash types */
+#define VIRTIO_NET_RSS_HASH_TYPE_IPv4  (1 << 0)
+#define VIRTIO_NET_RSS_HASH_TYPE_TCPv4 (1 << 1)
+#define VIRTIO_NET_RSS_HASH_TYPE_UDPv4 (1 << 2)
+#define VIRTIO_NET_RSS_HASH_TYPE_IPv6  (1 << 3)
+#define VIRTIO_NET_RSS_HASH_TYPE_TCPv6 (1 << 4)
+#define VIRTIO_NET_RSS_HASH_TYPE_UDPv6 (1 << 5)
+#define VIRTIO_NET_RSS_HASH_TYPE_IP_EX (1 << 6)
+#define VIRTIO_NET_RSS_HASH_TYPE_TCP_EX(1 << 7)
+#define VIRTIO_NET_RSS_HASH_TYPE_UDP_EX(1 << 8)
+
 struct virtio_net_config {
/* The config defining mac address (if VIRTIO_NET_F_MAC) */
__u8 mac[ETH_ALEN];
@@ -93,6 +105,12 @@ struct virtio_net_config {
 * Any other value stands for unknown.
 */
__u8 duplex;
+   /* maximal size of RSS key */
+   __u8 rss_max_key_size;
+   /* maximal number of indirection table entries */
+   __u16 rss_max_indirection_table_length;
+   /* bitmask of supported VIRTIO_NET_RSS_HASH_ types */
+   __u32 supported_hash_types;
 } __attribute__((packed));
 
 /*
@@ -236,7 +254,9 @@ struct virtio_net_ctrl_mac {
 
 /*
  * Control Receive Flow Steering
- *
+ */
+#define VIRTIO_NET_CTRL_MQ   4
+/*
  * The command VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET
  * enables Receive Flow Steering, specifying the number of the transmit and
  * receive queues that will be used. After the command is consumed and acked by
@@ -249,11 +269,29 @@ struct virtio_net_ctrl_mq {
__virtio16 virtqueue_pairs;
 };
 
-#define VIRTIO_NET_CTRL_MQ   4
  #define VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET0
  #define VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MIN1
  #define VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MAX0x8000
 
+/*
+ * The command VIRTIO_NET_CTRL_MQ_RSS_CONFIG has the same effect as
+ * VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET does and additionally configures
+ * the receive steering to use a hash calculated for incoming packet
+ * to decide on receive virtqueue to place the packet. The command
+ * also provides parameters to calculate a hash and receive virtqueue.
+ */
+struct virtio_net_rss_config {
+   __virtio32 hash_types;
+   __virtio16 indirection_table_mask;
+   __virtio16 unclassified_queue;
+   __virtio16 indirection_table[1/* + indirection_table_mask*/];
+   __virtio16 max_tx_vq;
+   __u8 hash_key_length;
+   __u8 hash_key_data[/*hash_key_length*/];
+};
+
+ #define VIRTIO_NET_CTRL_MQ_RSS_CONFIG  1
+
 /*
  * Control network offloads
  *
-- 
2.17.1

___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization


[PATCH 0/3] virtio-net: introduce features defined in the spec

2020-02-29 Thread Yuri Benditovich
This series introduce virtio-net features VIRTIO_NET_F_RSC_EXT,
VIRTIO_NET_F_RSS and VIRTIO_NET_F_HASH_REPORT.

Yuri Benditovich (3):
  virtio-net: Introduce extended RSC feature
  virtio-net: Introduce RSS receive steering feature
  virtio-net: Introduce hash report feature

 include/uapi/linux/virtio_net.h | 90 +++--
 1 file changed, 86 insertions(+), 4 deletions(-)

-- 
2.17.1

___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization


Re: [PATCH v2 3/3] iommu/virtio: Enable x86 support

2020-02-29 Thread kbuild test robot
Hi Jean-Philippe,

I love your patch! Perhaps something to improve:

[auto build test WARNING on iommu/next]
[cannot apply to pci/next linus/master v5.6-rc3 next-20200228]
[if your patch is applied to the wrong git tree, please drop us a note to help
improve the system. BTW, we also suggest to use '--base' option to specify the
base tree in git format-patch, please see https://stackoverflow.com/a/37406982]

url:
https://github.com/0day-ci/linux/commits/Jean-Philippe-Brucker/virtio-iommu-on-x86-and-non-devicetree-platforms/20200229-085019
base:   https://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git next
reproduce:
# apt-get install sparse
# sparse version: v0.6.1-173-ge0787745-dirty
make ARCH=x86_64 allmodconfig
make C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__'

If you fix the issue, kindly add following tag
Reported-by: kbuild test robot 


sparse warnings: (new ones prefixed by >>)

>> drivers/iommu/virtio-iommu.c:1024:9: sparse: sparse: incompatible types in 
>> comparison expression (different base types):
>> drivers/iommu/virtio-iommu.c:1024:9: sparse:restricted __le64 *
>> drivers/iommu/virtio-iommu.c:1024:9: sparse:unsigned long long *
   drivers/iommu/virtio-iommu.c:1036:9: sparse: sparse: incompatible types in 
comparison expression (different base types):
   drivers/iommu/virtio-iommu.c:1036:9: sparse:restricted __le64 *
   drivers/iommu/virtio-iommu.c:1036:9: sparse:unsigned long long *
   drivers/iommu/virtio-iommu.c:1040:9: sparse: sparse: incompatible types in 
comparison expression (different base types):
   drivers/iommu/virtio-iommu.c:1040:9: sparse:restricted __le64 *
   drivers/iommu/virtio-iommu.c:1040:9: sparse:unsigned long long *
   drivers/iommu/virtio-iommu.c:1044:9: sparse: sparse: incompatible types in 
comparison expression (different base types):
>> drivers/iommu/virtio-iommu.c:1044:9: sparse:restricted __le32 *
>> drivers/iommu/virtio-iommu.c:1044:9: sparse:unsigned int *
   drivers/iommu/virtio-iommu.c:1048:9: sparse: sparse: incompatible types in 
comparison expression (different base types):
   drivers/iommu/virtio-iommu.c:1048:9: sparse:restricted __le32 *
   drivers/iommu/virtio-iommu.c:1048:9: sparse:unsigned int *
   drivers/iommu/virtio-iommu.c:1052:9: sparse: sparse: incompatible types in 
comparison expression (different base types):
   drivers/iommu/virtio-iommu.c:1052:9: sparse:restricted __le32 *
   drivers/iommu/virtio-iommu.c:1052:9: sparse:unsigned int *

vim +1024 drivers/iommu/virtio-iommu.c

edcd69ab9a323b Jean-Philippe Brucker 2019-01-15   996  
edcd69ab9a323b Jean-Philippe Brucker 2019-01-15   997  static int 
viommu_probe(struct virtio_device *vdev)
edcd69ab9a323b Jean-Philippe Brucker 2019-01-15   998  {
edcd69ab9a323b Jean-Philippe Brucker 2019-01-15   999   struct device 
*parent_dev = vdev->dev.parent;
edcd69ab9a323b Jean-Philippe Brucker 2019-01-15  1000   struct viommu_dev 
*viommu = NULL;
edcd69ab9a323b Jean-Philippe Brucker 2019-01-15  1001   struct device *dev = 
>dev;
edcd69ab9a323b Jean-Philippe Brucker 2019-01-15  1002   u64 input_start = 0;
edcd69ab9a323b Jean-Philippe Brucker 2019-01-15  1003   u64 input_end = -1UL;
edcd69ab9a323b Jean-Philippe Brucker 2019-01-15  1004   int ret;
edcd69ab9a323b Jean-Philippe Brucker 2019-01-15  1005  
edcd69ab9a323b Jean-Philippe Brucker 2019-01-15  1006   if 
(!virtio_has_feature(vdev, VIRTIO_F_VERSION_1) ||
edcd69ab9a323b Jean-Philippe Brucker 2019-01-15  1007   
!virtio_has_feature(vdev, VIRTIO_IOMMU_F_MAP_UNMAP))
edcd69ab9a323b Jean-Philippe Brucker 2019-01-15  1008   return -ENODEV;
edcd69ab9a323b Jean-Philippe Brucker 2019-01-15  1009  
edcd69ab9a323b Jean-Philippe Brucker 2019-01-15  1010   viommu = 
devm_kzalloc(dev, sizeof(*viommu), GFP_KERNEL);
edcd69ab9a323b Jean-Philippe Brucker 2019-01-15  1011   if (!viommu)
edcd69ab9a323b Jean-Philippe Brucker 2019-01-15  1012   return -ENOMEM;
edcd69ab9a323b Jean-Philippe Brucker 2019-01-15  1013  
edcd69ab9a323b Jean-Philippe Brucker 2019-01-15  1014   
spin_lock_init(>request_lock);
edcd69ab9a323b Jean-Philippe Brucker 2019-01-15  1015   
ida_init(>domain_ids);
edcd69ab9a323b Jean-Philippe Brucker 2019-01-15  1016   viommu->dev = dev;
edcd69ab9a323b Jean-Philippe Brucker 2019-01-15  1017   viommu->vdev = vdev;
edcd69ab9a323b Jean-Philippe Brucker 2019-01-15  1018   
INIT_LIST_HEAD(>requests);
edcd69ab9a323b Jean-Philippe Brucker 2019-01-15  1019  
edcd69ab9a323b Jean-Philippe Brucker 2019-01-15  1020   ret = 
viommu_init_vqs(viommu);
edcd69ab9a323b Jean-Philippe Brucker 2019-01-15  1021   if (ret)
edcd69ab9a323b Jean-Philippe Brucker 2019-01-15  1022   return ret;
edcd69ab9a323b Jean-Philippe Brucker 2019-01-15  1023  
edcd69ab9a323b Jean-Philippe Brucker 2019-01-15 @1024   virtio_cread(vdev, 
struct virtio_iommu_config, page_size_mask,
edcd69ab9a323b Jean-P