1. 01 11月, 2016 1 次提交
    • A
      ldmvsw: tx queue stuck in stopped state after LDC reset · 8778b276
      Aaron Young 提交于
      The following patch fixes an issue with the ldmvsw driver where
      the network connection of a guest domain becomes non-functional after
      the guest domain has panic'd and rebooted.
      
      The root cause was determined to be from the following series of
      events:
      
      1. Guest domain panics - resulting in the guest no longer processing
         network packets (from ldmvsw driver)
      2. The ldmvsw driver (in the control domain) eventually exerts flow
         control due to no more available tx drings and stops the tx queue
         for the guest domain
      3. The LDC of the network connection for the guest is reset when
         the guest domain reboots after the panic.
      4. The LDC reset event is received by the ldmvsw driver and the ldmvsw
         responds by clearing the tx queue for the guest.
      5. ldmvsw waits indefinitely for a DATA ACK from the guest - which is
         the normal method to re-enable the tx queue. But the ACK never comes
         because the tx queue was cleared due to the LDC reset.
      
      To fix this issue, in addition to clearing the tx queue, re-enable the
      tx queue on a LDC reset. This prevents the ldmvsw from getting caught in
      this deadlocked state of waiting for a DATA ACK which will never come.
      Signed-off-by: NAaron Young <Aaron.Young@oracle.com>
      Acked-by: NSowmini Varadhan <sowmini.varadhan@oracle.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      8778b276
  2. 18 10月, 2016 1 次提交
  3. 19 3月, 2016 3 次提交
    • A
      ldmvsw: Checkpatch sunvnet.c and sunvnet_common.c · dc153f85
      Aaron Young 提交于
        Checkpatch updates for sunvnet.c and sunvnet_common.c.
      Signed-off-by: NAaron Young <aaron.young@oracle.com>
      Signed-off-by: NRashmi Narasimhan <rashmi.narasimhan@oracle.com>
      Reviewed-by: NSowmini Varadhan <sowmini.varadhan@oracle.com>
      Reviewed-by: NAlexandre Chartre <Alexandre.Chartre@oracle.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      dc153f85
    • A
      ldmvsw: Make sunvnet_common compatible with ldmvsw · 67d0719f
      Aaron Young 提交于
        Modify sunvnet common code and data structures to be compatible
        with both sunvnet and ldmvsw drivers.
      
        Details:
      
        Sunvnet operates on "vnet-port" nodes which appear in the Machine
        Description (MD) in a guest domain. Ldmvsw operates on "vsw-port"
        nodes which appear in the MD of a service domain.
      
        A difference between the sunvnet driver and the ldmvsw driver is
        the sunvnet driver creates a network interface (i.e. a struct net_device)
        for every vnet-port *parent* "network" node. Several vnet-ports may appear
        under this common parent network node - each corresponding to a common parent
        network interface.  Conversely, since bridge/vswitch software will need
        to interface with every vsw-port in a system, the ldmvsw driver creates
        a network interface (i.e. a struct net_device) for every vsw-port - not
        every parent node as with sunvnet.  This difference required some special
        handling in the common code as explained below.
      
        There are 2 key data structures used by the sunvnet and ldmvsw drivers
        (which are now found in sunvnet_common.h):
      
        1. struct vnet_port
           This structure represents a vnet-port node in sunvnet and a vsw-port
           in the ldmvsw driver.
      
        2. struct vnet
           This structure represents a parent "network" node in sunvnet and a parent
           "virtual-network-switch" node in ldmvsw.
      
        Since the sunvnet driver allocates a net_device for every parent "network"
        node, a net_device member appears in the struct vnet. Since the ldmvsw
        driver allocates a net_device for every port, a net_device member was
        added to the vnet_port. The common code distinguishes which structure
        net_device member to use by checking a 'vsw' bit that was added to the
        vnet_port structure. See the VNET_PORT_TO_NET_DEVICE() marco in
        sunvnet_common.h.
      
        The netdev_priv() in sunvnet is allocated as a vnet. The netdev_priv()
        in ldmvsw is a vnet_port. Therefore, any place in the common code
        where a netdev_priv() call was made, a wrapper function was implemented
        in each driver to first get the vnet and/or vnet_port (in a driver
        specific way) and pass them as newly added parameters to the common
        functions (see wrapper funcs: vnet_set_rx_mode() and vnet_poll_controller()).
        Since these wrapper functions call __tx_port_find(), __tx_port_find() was
        moved from the common code back into sunvnet.c. Note - ldmvsw.c does not
        require this function.
      
        These changes also required that port_is_up() be made
        into a common function and thus it was given a _common suffix and
        exported like the other common functions.
      
        A wrapper function was also added for vnet_start_xmit_common() to pass a
        driver-specific function arg to return the port associated with a given
        struct sk_buff and struct net_device. This was required because
        vnet_start_xmit_common() grabs a lock prior to getting the associated
        port. Using a function pointer arg allowed the code to work unchanged
        without risking changes to the non-trivial locking logic in
        vnet_start_xmit_common().
      Signed-off-by: NAaron Young <aaron.young@oracle.com>
      Signed-off-by: NRashmi Narasimhan <rashmi.narasimhan@oracle.com>
      Reviewed-by: NSowmini Varadhan <sowmini.varadhan@oracle.com>
      Reviewed-by: NAlexandre Chartre <Alexandre.Chartre@oracle.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      67d0719f
    • A
      ldmvsw: Split sunvnet driver into common code · 31762eaa
      Aaron Young 提交于
        Split sunvnet.c into sunvnet.c and sunvnet_common.c.
      
        Details:
      
        Since the sunvnet and ldmvsw drivers will both use common sunvnet code,
        move the functions (and support functions) anticipated to be common code
        from sunvnet.c to sunvnet_common.c. Similarly, sunvnet.h was renamed to
        sunvnet_common.h. The sunvnet_common.c code will be compiled into the
        kernel and act as a library of functions that are linked by either
        (or both) drivers when loaded.
      
        Function names for external functions in sunvnet_common.c (to be
        called by both the sunvnet and ldmvsw drivers) were tagged with a "_common"
        suffix to clearly designate them as common functions.
      
        No functional changes as of yet... just moved code verbatim to the new
        sunvnet_common.c/h files.
      
        Makefile/Kconfig support added to build sunvnet_common.c file. The code
        is included in the kernel if SUN_LDOMS is defined/selected.
      
        NOTE - per the SubmittingPatches documentation, since the code was just
        moved from one file another, the code was NOT checkpatch'd in this commit
        to aid in review.
      Signed-off-by: NAaron Young <aaron.young@oracle.com>
      Signed-off-by: NRashmi Narasimhan <rashmi.narasimhan@oracle.com>
      Reviewed-by: NSowmini Varadhan <sowmini.varadhan@oracle.com>
      Reviewed-by: NAlexandre Chartre <Alexandre.Chartre@oracle.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      31762eaa
  4. 08 2月, 2016 1 次提交
  5. 20 1月, 2016 1 次提交
  6. 22 9月, 2015 1 次提交
  7. 09 4月, 2015 1 次提交
  8. 21 2月, 2015 1 次提交
  9. 12 2月, 2015 1 次提交
  10. 03 2月, 2015 1 次提交
  11. 27 1月, 2015 2 次提交
  12. 14 1月, 2015 1 次提交
  13. 20 12月, 2014 1 次提交
  14. 12 12月, 2014 1 次提交
  15. 09 12月, 2014 7 次提交
  16. 13 11月, 2014 1 次提交
  17. 11 11月, 2014 3 次提交
  18. 07 11月, 2014 2 次提交
  19. 31 10月, 2014 2 次提交
  20. 26 10月, 2014 3 次提交
  21. 02 10月, 2014 1 次提交
  22. 01 10月, 2014 4 次提交
    • D
      vio: fix reuse of vio_dring slot · d0aedcd4
      Dwight Engen 提交于
      vio_dring_avail() will allow use of every dring entry, but when the last
      entry is allocated then dr->prod == dr->cons which is indistinguishable from
      the ring empty condition. This causes the next allocation to reuse an entry.
      When this happens in sunvdc, the server side vds driver begins nack'ing the
      messages and ends up resetting the ldc channel. This problem does not effect
      sunvnet since it checks for < 2.
      
      The fix here is to just never allocate the very last dring slot so that full
      and empty are not the same condition. The request start path was changed to
      check for the ring being full a bit earlier, and to stop the blk_queue if
      there is no space left. The blk_queue will be restarted once the ring is
      only half full again. The number of ring entries was increased to 512 which
      matches the sunvnet and Solaris vdc drivers, and greatly reduces the
      frequency of hitting the ring full condition and the associated blk_queue
      stop/starting. The checks in sunvent were adjusted to account for
      vio_dring_avail() returning 1 less.
      
      Orabug: 19441666
      OraBZ: 14983
      Signed-off-by: NDwight Engen <dwight.engen@oracle.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      d0aedcd4
    • D
      sunvnet: generate ICMP PTMUD messages for smaller port MTUs · a2b78e9b
      David L Stevens 提交于
      This patch sends ICMP and ICMPv6 messages for Path MTU Discovery when a remote
      port MTU is smaller than the device MTU. This allows mixing newer VIO protocol
      devices that support MTU negotiation with older devices that do not on the
      same vswitch. It also allows Linux-Linux LDOMs to use 64K-1 data packets even
      though Solaris vswitch is limited to <16K MTU.
      Signed-off-by: NDavid L Stevens <david.stevens@oracle.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      a2b78e9b
    • D
      sunvnet: allow admin to set sunvnet MTU · 42db672d
      David L Stevens 提交于
      This patch allows an admin to set the MTU on a sunvnet device to arbitrary
      values between the minimum (68) and maximum (65535) IPv4 packet sizes.
      Signed-off-by: NDavid L Stevens <david.stevens@oracle.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      42db672d
    • D
      sunvnet: make transmit path zero-copy in the kernel · 8e845f4c
      David L Stevens 提交于
      This patch removes pre-allocated transmit buffers and instead directly maps
      pending packets on demand. This saves O(n^2) maximum-sized transmit buffers,
      for n hosts on a vswitch, as well as a copy to those buffers.
      
      Single-stream TCP throughput linux-solaris dropped ~5% for 1500-byte MTU,
      but linux-linux at 1500-bytes increased ~20%.
      Signed-off-by: NDavid L Stevens <david.stevens@oracle.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      8e845f4c