1. 20 Feb, 2019 9 commits
    • Steve Wise's avatar
      RDMA/core: Add RDMA_NLDEV_CMD_NEWLINK/DELLINK support · 3856ec4b
      Steve Wise authored
      Add support for new LINK messages to allow adding and deleting rdma
      interfaces.  This will be used initially for soft rdma drivers which
      instantiate device instances dynamically by the admin specifying a netdev
      device to use.  The rdma_rxe module will be the first user of these
      messages.
      
      The design is modeled after RTNL_NEWLINK/DELLINK: rdma drivers register
      with the rdma core if they provide link add/delete functions.  Each driver
      registers with a unique "type" string, that is used to dispatch messages
      coming from user space.  A new RDMA_NLDEV_ATTR is defined for the "type"
      string.  User mode will pass 3 attributes in a NEWLINK message:
      RDMA_NLDEV_ATTR_DEV_NAME for the desired rdma device name to be created,
      RDMA_NLDEV_ATTR_LINK_TYPE for the "type" of link being added, and
      RDMA_NLDEV_ATTR_NDEV_NAME for the net_device interface to use for this
      link.  The DELLINK message will contain the RDMA_NLDEV_ATTR_DEV_INDEX of
      the device to delete.
      Signed-off-by: default avatarSteve Wise <swise@opengridcomputing.com>
      Reviewed-by: default avatarLeon Romanovsky <leonro@mellanox.com>
      Reviewed-by: default avatarMichael J. Ruhl <michael.j.ruhl@intel.com>
      Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
      3856ec4b
    • Parvi Kaustubhi's avatar
      IB/usnic: Fix deadlock · 5bb3c1e9
      Parvi Kaustubhi authored
      There is a dead lock in usnic ib_register and netdev_notify path.
      
      	usnic_ib_discover_pf()
      	| mutex_lock(&usnic_ib_ibdev_list_lock);
      	 | usnic_ib_device_add();
      	  | ib_register_device()
      	   | usnic_ib_query_port()
      	    | mutex_lock(&us_ibdev->usdev_lock);
      	     | ib_get_eth_speed()
      	      | rtnl_lock()
      
      order of lock: &usnic_ib_ibdev_list_lock -> usdev_lock -> rtnl_lock
      
      	rtnl_lock()
      	 | usnic_ib_netdevice_event()
      	  | mutex_lock(&usnic_ib_ibdev_list_lock);
      
      order of lock: rtnl_lock -> &usnic_ib_ibdev_list_lock
      
      Solution is to use the core's lock-free ib_device_get_by_netdev() scheme
      to lookup ib_dev while handling netdev & inet events.
      Signed-off-by: default avatarParvi Kaustubhi <pkaustub@cisco.com>
      Reviewed-by: default avatarGovindarajulu Varadarajan <gvaradar@cisco.com>
      Reviewed-by: default avatarTanmay Inamdar <tinamdar@cisco.com>
      Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
      5bb3c1e9
    • Jason Gunthorpe's avatar
      RDMA/rxe: Close a race after ib_register_device · ca22354b
      Jason Gunthorpe authored
      Since rxe allows unregistration from other threads the rxe pointer can
      become invalid any moment after ib_register_driver returns. This could
      cause a user triggered use after free.
      
      Add another driver callback to be called right after the device becomes
      registered to complete any device setup required post-registration.  This
      callback has enough core locking to prevent the device from becoming
      unregistered.
      Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
      ca22354b
    • Jason Gunthorpe's avatar
      RDMA/rxe: Add ib_device_get_by_name() and use it in rxe · 6cc2c8e5
      Jason Gunthorpe authored
      rxe has an open coded version of this that is not as safe as the core
      version. This lets us eliminate the internal device list entirely from
      rxe.
      Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
      6cc2c8e5
    • Jason Gunthorpe's avatar
      RDMA/rxe: Use driver_unregister and new unregistration API · c367074b
      Jason Gunthorpe authored
      rxe does not have correct locking for its registration/unregistration
      paths, use the core code to handle it instead. In this mode
      ib_unregister_device will also do the dealloc, so rxe is required to do
      clean up from a callback.
      
      The core code ensures that unregistration is done only once, and generally
      takes care of locking and concurrency problems for rxe.
      Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
      c367074b
    • Jason Gunthorpe's avatar
      RDMA/device: Provide APIs from the core code to help unregistration · d0899892
      Jason Gunthorpe authored
      These APIs are intended to support drivers that exist outside the usual
      driver core probe()/remove() callbacks. Normally the driver core will
      prevent remove() from running concurrently with probe(), once this safety
      is lost drivers need more support to get the locking and lifetimes right.
      
      ib_unregister_driver() is intended to be used during module_exit of a
      driver using these APIs. It unregisters all the associated ib_devices.
      
      ib_unregister_device_and_put() is to be used by a driver-specific removal
      function (ie removal by name, removal from a netdev notifier, removal from
      netlink)
      
      ib_unregister_queued() is to be used from netdev notifier chains where
      RTNL is held.
      
      The locking is tricky here since once things become async it is possible
      to race unregister with registration. This is largely solved by relying on
      the registration refcount, unregistration will only ever work on something
      that has a positive registration refcount - and then an unregistration
      mutex serializes all competing unregistrations of the same device.
      Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
      d0899892
    • Jason Gunthorpe's avatar
      RDMA/rxe: Use ib_device_get_by_netdev() instead of open coding · 4c173f59
      Jason Gunthorpe authored
      The core API handles the locking correctly and is faster if there are
      multiple devices.
      Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
      4c173f59
    • Jason Gunthorpe's avatar
      RDMA/device: Add ib_device_get_by_netdev() · 324e227e
      Jason Gunthorpe authored
      Several drivers need to find the ib_device from a given netdev. rxe needs
      this at speed in an unsleepable context, so choose to implement the
      translation using a RCU safe hash table.
      
      The hash table can have a many to one mapping. This is intended to support
      some future case where multiple IB drivers (ie iWarp and RoCE) connect to
      the same netdevs. driver_ids will need to be different to support this.
      
      In the process this makes the struct ib_device and ib_port_data RCU safe
      by deferring their kfrees.
      Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
      324e227e
    • Jason Gunthorpe's avatar
      RDMA/device: Add ib_device_set_netdev() as an alternative to get_netdev · c2261dd7
      Jason Gunthorpe authored
      The associated netdev should not actually be very dynamic, so for most
      drivers there is no reason for a callback like this. Provide an API to
      inform the core code about the net dev affiliation and use a core
      maintained data structure instead.
      
      This allows the core code to be more aware of the ndev relationship which
      will allow some new APIs based around this.
      
      This also uses locking that makes some kind of sense, many drivers had a
      confusing RCU lock, or missing locking which isn't right.
      Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
      c2261dd7
  2. 19 Feb, 2019 13 commits
  3. 16 Feb, 2019 5 commits
  4. 15 Feb, 2019 5 commits
  5. 14 Feb, 2019 7 commits
  6. 13 Feb, 2019 1 commit