Re: [PATCH 7/8] VMCI: dma dg: add support for DMA datagrams sends

2022-02-02 Thread kernel test robot
Hi Jorgen,

I love your patch! Perhaps something to improve:

[auto build test WARNING on char-misc/char-misc-testing]
[also build test WARNING on linux/master linus/master v5.17-rc2 next-20220202]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:
https://github.com/0day-ci/linux/commits/Jorgen-Hansen/VMCI-dma-dg-Add-support-for-DMA-datagrams/20220202-230034
base:   https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git 
7ab004dbcbee38b8a70798835d3ffcd97a985a5e
config: i386-randconfig-s002 
(https://download.01.org/0day-ci/archive/20220203/202202031004.smrs3z6m-...@intel.com/config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
reproduce:
# apt-get install sparse
# sparse version: v0.6.4-dirty
# 
https://github.com/0day-ci/linux/commit/303777a2a8daa11d529827395318bb698ddee57e
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review 
Jorgen-Hansen/VMCI-dma-dg-Add-support-for-DMA-datagrams/20220202-230034
git checkout 303777a2a8daa11d529827395318bb698ddee57e
# save the config file to linux build tree
mkdir build_dir
make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir 
ARCH=i386 SHELL=/bin/bash drivers/misc/vmw_vmci/

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


sparse warnings: (new ones prefixed by >>)
   drivers/misc/vmw_vmci/vmci_guest.c:106:45: sparse: sparse: incorrect type in 
argument 1 (different address spaces) @@ expected void const volatile 
[noderef] __iomem *addr @@ got char * @@
   drivers/misc/vmw_vmci/vmci_guest.c:106:45: sparse: expected void const 
volatile [noderef] __iomem *addr
   drivers/misc/vmw_vmci/vmci_guest.c:106:45: sparse: got char *
   drivers/misc/vmw_vmci/vmci_guest.c:103:14: sparse: sparse: symbol 
'vmci_read_reg' was not declared. Should it be static?
   drivers/misc/vmw_vmci/vmci_guest.c:113:44: sparse: sparse: incorrect type in 
argument 2 (different address spaces) @@ expected void volatile [noderef] 
__iomem *addr @@ got char * @@
   drivers/misc/vmw_vmci/vmci_guest.c:113:44: sparse: expected void 
volatile [noderef] __iomem *addr
   drivers/misc/vmw_vmci/vmci_guest.c:113:44: sparse: got char *
   drivers/misc/vmw_vmci/vmci_guest.c:110:6: sparse: sparse: symbol 
'vmci_write_reg' was not declared. Should it be static?
>> drivers/misc/vmw_vmci/vmci_guest.c:118:5: sparse: sparse: symbol 
>> 'vmci_write_data' was not declared. Should it be static?
   drivers/misc/vmw_vmci/vmci_guest.c:554:27: sparse: sparse: incorrect type in 
assignment (different address spaces) @@ expected char *mmio_base @@ 
got void [noderef] __iomem * @@
   drivers/misc/vmw_vmci/vmci_guest.c:554:27: sparse: expected char 
*mmio_base
   drivers/misc/vmw_vmci/vmci_guest.c:554:27: sparse: got void [noderef] 
__iomem *
   drivers/misc/vmw_vmci/vmci_guest.c:909:43: sparse: sparse: incorrect type in 
argument 2 (different address spaces) @@ expected void [noderef] __iomem * 
@@ got char *mmio_base @@
   drivers/misc/vmw_vmci/vmci_guest.c:909:43: sparse: expected void 
[noderef] __iomem *
   drivers/misc/vmw_vmci/vmci_guest.c:909:43: sparse: got char *mmio_base

Please review and possibly fold the followup patch.

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-...@lists.01.org
___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization


Re: [PATCH 7/8] VMCI: dma dg: add support for DMA datagrams sends

2022-02-02 Thread kernel test robot
Hi Jorgen,

I love your patch! Perhaps something to improve:

[auto build test WARNING on char-misc/char-misc-testing]
[also build test WARNING on linux/master linus/master v5.17-rc2 next-20220202]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:
https://github.com/0day-ci/linux/commits/Jorgen-Hansen/VMCI-dma-dg-Add-support-for-DMA-datagrams/20220202-230034
base:   https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git 
7ab004dbcbee38b8a70798835d3ffcd97a985a5e
config: i386-randconfig-a013-20220131 
(https://download.01.org/0day-ci/archive/20220203/202202030803.bfgzqtfl-...@intel.com/config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project 
6b1e844b69f15bb7dffaf9365cd2b355d2eb7579)
reproduce (this is a W=1 build):
wget 
https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O 
~/bin/make.cross
chmod +x ~/bin/make.cross
# 
https://github.com/0day-ci/linux/commit/303777a2a8daa11d529827395318bb698ddee57e
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review 
Jorgen-Hansen/VMCI-dma-dg-Add-support-for-DMA-datagrams/20220202-230034
git checkout 303777a2a8daa11d529827395318bb698ddee57e
# save the config file to linux build tree
mkdir build_dir
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 
O=build_dir ARCH=i386 SHELL=/bin/bash drivers/misc/vmw_vmci/

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

All warnings (new ones prefixed by >>):

   drivers/misc/vmw_vmci/vmci_guest.c:103:14: warning: no previous prototype 
for function 'vmci_read_reg' [-Wmissing-prototypes]
   unsigned int vmci_read_reg(struct vmci_guest_device *dev, u32 reg)
^
   drivers/misc/vmw_vmci/vmci_guest.c:103:1: note: declare 'static' if the 
function is not intended to be used outside of this translation unit
   unsigned int vmci_read_reg(struct vmci_guest_device *dev, u32 reg)
   ^
   static 
   drivers/misc/vmw_vmci/vmci_guest.c:110:6: warning: no previous prototype for 
function 'vmci_write_reg' [-Wmissing-prototypes]
   void vmci_write_reg(struct vmci_guest_device *dev, u32 val, u32 reg)
^
   drivers/misc/vmw_vmci/vmci_guest.c:110:1: note: declare 'static' if the 
function is not intended to be used outside of this translation unit
   void vmci_write_reg(struct vmci_guest_device *dev, u32 val, u32 reg)
   ^
   static 
>> drivers/misc/vmw_vmci/vmci_guest.c:118:5: warning: no previous prototype for 
>> function 'vmci_write_data' [-Wmissing-prototypes]
   int vmci_write_data(struct vmci_guest_device *dev, struct vmci_datagram *dg)
   ^
   drivers/misc/vmw_vmci/vmci_guest.c:118:1: note: declare 'static' if the 
function is not intended to be used outside of this translation unit
   int vmci_write_data(struct vmci_guest_device *dev, struct vmci_datagram *dg)
   ^
   static 
   3 warnings generated.


vim +/vmci_write_data +118 drivers/misc/vmw_vmci/vmci_guest.c

   109  
 > 110  void vmci_write_reg(struct vmci_guest_device *dev, u32 val, u32 reg)
   111  {
   112  if (dev->mmio_base != NULL)
   113  writel(val, dev->mmio_base + reg);
   114  else
   115  iowrite32(val, dev->iobase + reg);
   116  }
   117  
 > 118  int vmci_write_data(struct vmci_guest_device *dev, struct vmci_datagram 
 > *dg)
   119  {
   120  int result;
   121  
   122  if (dev->mmio_base != NULL) {
   123  struct vmci_data_in_out_header *buffer_header = 
dev->tx_buffer;
   124  u8 *dg_out_buffer = (u8 *)(buffer_header + 1);
   125  
   126  if (VMCI_DG_SIZE(dg) > VMCI_MAX_DG_SIZE)
   127  return VMCI_ERROR_INVALID_ARGS;
   128  
   129  /*
   130   * Initialize send buffer with outgoing datagram
   131   * and set up header for inline data. Device will
   132   * not access buffer asynchronously - only after
   133   * the write to VMCI_DATA_OUT_LOW_ADDR.
   134   */
   135  memcpy(dg_out_buffer, dg, VMCI_DG_SIZE(dg));
   136  buffer_header->opcode = 0;
   137  buffer_header->size = VMCI_DG_SIZE(dg);
   138  buffer_header->busy = 1;
   139  
   140  vmci_write_reg(dev, lower_32_bits(dev->tx_buffer_base),
   141 VMCI_DATA_OUT_LOW_ADDR);
   142  
   143  /* Caller holds a spinlock, so cannot block. */
   144  spin_until_cond(buffer_header->busy == 0);
   145  
   146  result = vmci_read_reg(vmci_dev_g, 
VMCI_RESULT_LOW_ADDR);
   147  if (result == VMCI_SUCCESS)
   148 

Re: [PATCH 7/8] VMCI: dma dg: add support for DMA datagrams sends

2022-02-02 Thread kernel test robot
Hi Jorgen,

I love your patch! Perhaps something to improve:

[auto build test WARNING on char-misc/char-misc-testing]
[also build test WARNING on linux/master linus/master v5.17-rc2 next-20220202]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:
https://github.com/0day-ci/linux/commits/Jorgen-Hansen/VMCI-dma-dg-Add-support-for-DMA-datagrams/20220202-230034
base:   https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git 
7ab004dbcbee38b8a70798835d3ffcd97a985a5e
config: x86_64-allyesconfig 
(https://download.01.org/0day-ci/archive/20220203/202202030100.5mr551y1-...@intel.com/config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
reproduce (this is a W=1 build):
# 
https://github.com/0day-ci/linux/commit/303777a2a8daa11d529827395318bb698ddee57e
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review 
Jorgen-Hansen/VMCI-dma-dg-Add-support-for-DMA-datagrams/20220202-230034
git checkout 303777a2a8daa11d529827395318bb698ddee57e
# save the config file to linux build tree
mkdir build_dir
make W=1 O=build_dir ARCH=x86_64 SHELL=/bin/bash drivers/misc/vmw_vmci/

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

All warnings (new ones prefixed by >>):

   drivers/misc/vmw_vmci/vmci_guest.c:103:14: warning: no previous prototype 
for 'vmci_read_reg' [-Wmissing-prototypes]
 103 | unsigned int vmci_read_reg(struct vmci_guest_device *dev, u32 reg)
 |  ^
   drivers/misc/vmw_vmci/vmci_guest.c:110:6: warning: no previous prototype for 
'vmci_write_reg' [-Wmissing-prototypes]
 110 | void vmci_write_reg(struct vmci_guest_device *dev, u32 val, u32 reg)
 |  ^~
>> drivers/misc/vmw_vmci/vmci_guest.c:118:5: warning: no previous prototype for 
>> 'vmci_write_data' [-Wmissing-prototypes]
 118 | int vmci_write_data(struct vmci_guest_device *dev, struct 
vmci_datagram *dg)
 | ^~~


vim +/vmci_write_data +118 drivers/misc/vmw_vmci/vmci_guest.c

   117  
 > 118  int vmci_write_data(struct vmci_guest_device *dev, struct vmci_datagram 
 > *dg)
   119  {
   120  int result;
   121  
   122  if (dev->mmio_base != NULL) {
   123  struct vmci_data_in_out_header *buffer_header = 
dev->tx_buffer;
   124  u8 *dg_out_buffer = (u8 *)(buffer_header + 1);
   125  
   126  if (VMCI_DG_SIZE(dg) > VMCI_MAX_DG_SIZE)
   127  return VMCI_ERROR_INVALID_ARGS;
   128  
   129  /*
   130   * Initialize send buffer with outgoing datagram
   131   * and set up header for inline data. Device will
   132   * not access buffer asynchronously - only after
   133   * the write to VMCI_DATA_OUT_LOW_ADDR.
   134   */
   135  memcpy(dg_out_buffer, dg, VMCI_DG_SIZE(dg));
   136  buffer_header->opcode = 0;
   137  buffer_header->size = VMCI_DG_SIZE(dg);
   138  buffer_header->busy = 1;
   139  
   140  vmci_write_reg(dev, lower_32_bits(dev->tx_buffer_base),
   141 VMCI_DATA_OUT_LOW_ADDR);
   142  
   143  /* Caller holds a spinlock, so cannot block. */
   144  spin_until_cond(buffer_header->busy == 0);
   145  
   146  result = vmci_read_reg(vmci_dev_g, 
VMCI_RESULT_LOW_ADDR);
   147  if (result == VMCI_SUCCESS)
   148  result = (int)buffer_header->result;
   149  } else {
   150  iowrite8_rep(dev->iobase + VMCI_DATA_OUT_ADDR,
   151   dg, VMCI_DG_SIZE(dg));
   152  result = vmci_read_reg(vmci_dev_g, 
VMCI_RESULT_LOW_ADDR);
   153  }
   154  
   155  return result;
   156  }
   157  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-...@lists.01.org
___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization


[PATCH 7/8] VMCI: dma dg: add support for DMA datagrams sends

2022-02-02 Thread Jorgen Hansen
Use DMA based send operation from the transmit buffer instead of the
iowrite8_rep based datagram send when DMA datagrams are supported.

The outgoing datagram is sent as inline data in the VMCI transmit
buffer. Once the header has been configured, the send is initiated
by writing the lower 32 bit of the buffer base address to the
VMCI_DATA_OUT_LOW_ADDR register. Only then will the device process
the header and the datagram itself. Following that, the driver busy
waits (it isn't possible to sleep on the send path) for the header
busy flag to change - indicating that the send is complete.

Reviewed-by: Vishnu Dasa 
Signed-off-by: Jorgen Hansen 
---
 drivers/misc/vmw_vmci/vmci_guest.c | 44 --
 include/linux/vmw_vmci_defs.h  | 34 +++
 2 files changed, 76 insertions(+), 2 deletions(-)

diff --git a/drivers/misc/vmw_vmci/vmci_guest.c 
b/drivers/misc/vmw_vmci/vmci_guest.c
index d0acb686b464..ca73a1913404 100644
--- a/drivers/misc/vmw_vmci/vmci_guest.c
+++ b/drivers/misc/vmw_vmci/vmci_guest.c
@@ -13,6 +13,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -114,6 +115,46 @@ void vmci_write_reg(struct vmci_guest_device *dev, u32 
val, u32 reg)
iowrite32(val, dev->iobase + reg);
 }
 
+int vmci_write_data(struct vmci_guest_device *dev, struct vmci_datagram *dg)
+{
+   int result;
+
+   if (dev->mmio_base != NULL) {
+   struct vmci_data_in_out_header *buffer_header = dev->tx_buffer;
+   u8 *dg_out_buffer = (u8 *)(buffer_header + 1);
+
+   if (VMCI_DG_SIZE(dg) > VMCI_MAX_DG_SIZE)
+   return VMCI_ERROR_INVALID_ARGS;
+
+   /*
+* Initialize send buffer with outgoing datagram
+* and set up header for inline data. Device will
+* not access buffer asynchronously - only after
+* the write to VMCI_DATA_OUT_LOW_ADDR.
+*/
+   memcpy(dg_out_buffer, dg, VMCI_DG_SIZE(dg));
+   buffer_header->opcode = 0;
+   buffer_header->size = VMCI_DG_SIZE(dg);
+   buffer_header->busy = 1;
+
+   vmci_write_reg(dev, lower_32_bits(dev->tx_buffer_base),
+  VMCI_DATA_OUT_LOW_ADDR);
+
+   /* Caller holds a spinlock, so cannot block. */
+   spin_until_cond(buffer_header->busy == 0);
+
+   result = vmci_read_reg(vmci_dev_g, VMCI_RESULT_LOW_ADDR);
+   if (result == VMCI_SUCCESS)
+   result = (int)buffer_header->result;
+   } else {
+   iowrite8_rep(dev->iobase + VMCI_DATA_OUT_ADDR,
+dg, VMCI_DG_SIZE(dg));
+   result = vmci_read_reg(vmci_dev_g, VMCI_RESULT_LOW_ADDR);
+   }
+
+   return result;
+}
+
 /*
  * VM to hypervisor call mechanism. We use the standard VMware naming
  * convention since shared code is calling this function as well.
@@ -139,8 +180,7 @@ int vmci_send_datagram(struct vmci_datagram *dg)
spin_lock_irqsave(&vmci_dev_spinlock, flags);
 
if (vmci_dev_g) {
-   iowrite8_rep(vmci_dev_g->iobase + VMCI_DATA_OUT_ADDR,
-dg, VMCI_DG_SIZE(dg));
+   vmci_write_data(vmci_dev_g, dg);
result = vmci_read_reg(vmci_dev_g, VMCI_RESULT_LOW_ADDR);
} else {
result = VMCI_ERROR_UNAVAILABLE;
diff --git a/include/linux/vmw_vmci_defs.h b/include/linux/vmw_vmci_defs.h
index 8bc37d8244a8..6fb663b36f72 100644
--- a/include/linux/vmw_vmci_defs.h
+++ b/include/linux/vmw_vmci_defs.h
@@ -110,6 +110,40 @@ enum {
 #define VMCI_MMIO_ACCESS_OFFSET((size_t)(128 * 1024))
 #define VMCI_MMIO_ACCESS_SIZE  ((size_t)(64 * 1024))
 
+/*
+ * For VMCI devices supporting the VMCI_CAPS_DMA_DATAGRAM capability, the
+ * sending and receiving of datagrams can be performed using DMA to/from
+ * a driver allocated buffer.
+ * Sending and receiving will be handled as follows:
+ * - when sending datagrams, the driver initializes the buffer where the
+ *   data part will refer to the outgoing VMCI datagram, sets the busy flag
+ *   to 1 and writes the address of the buffer to VMCI_DATA_OUT_HIGH_ADDR
+ *   and VMCI_DATA_OUT_LOW_ADDR. Writing to VMCI_DATA_OUT_LOW_ADDR triggers
+ *   the device processing of the buffer. When the device has processed the
+ *   buffer, it will write the result value to the buffer and then clear the
+ *   busy flag.
+ * - when receiving datagrams, the driver initializes the buffer where the
+ *   data part will describe the receive buffer, clears the busy flag and
+ *   writes the address of the buffer to VMCI_DATA_IN_HIGH_ADDR and
+ *   VMCI_DATA_IN_LOW_ADDR. Writing to VMCI_DATA_IN_LOW_ADDR triggers the
+ *   device processing of the buffer. The device will copy as many available
+ *   datagrams into the buffer as possible, and then sets the busy flag.
+ *   When the busy flag