Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma
Pull rdma updates from Jason Gunthorpe: "This has been a smaller cycle than normal. One new driver was accepted, which is unusual, and at least one more driver remains in review on the list. Summary: - Driver fixes for hns, hfi1, nes, rxe, i40iw, mlx5, cxgb4, vmw_pvrdma - Many patches from MatthewW converting radix tree and IDR users to use xarray - Introduction of tracepoints to the MAD layer - Build large SGLs at the start for DMA mapping and get the driver to split them - Generally clean SGL handling code throughout the subsystem - Support for restricting RDMA devices to net namespaces for containers - Progress to remove object allocation boilerplate code from drivers - Change in how the mlx5 driver shows representor ports linked to VFs - mlx5 uapi feature to access the on chip SW ICM memory - Add a new driver for 'EFA'. This is HW that supports user space packet processing through QPs in Amazon's cloud" * tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma: (186 commits) RDMA/ipoib: Allow user space differentiate between valid dev_port IB/core, ipoib: Do not overreact to SM LID change event RDMA/device: Don't fire uevent before device is fully initialized lib/scatterlist: Remove leftover from sg_page_iter comment RDMA/efa: Add driver to Kconfig/Makefile RDMA/efa: Add the efa module RDMA/efa: Add EFA verbs implementation RDMA/efa: Add common command handlers RDMA/efa: Implement functions that submit and complete admin commands RDMA/efa: Add the ABI definitions RDMA/efa: Add the com service API definitions RDMA/efa: Add the efa_com.h file RDMA/efa: Add the efa.h header file RDMA/efa: Add EFA device definitions RDMA: Add EFA related definitions RDMA/umem: Remove hugetlb flag RDMA/bnxt_re: Use core helpers to get aligned DMA address RDMA/i40iw: Use core helpers to get aligned DMA address within a supported page size RDMA/verbs: Add a DMA iterator to return aligned contiguous memory blocks RDMA/umem: Add API to find best driver supported page size in an MR ...
This commit is contained in:
@@ -2402,7 +2402,18 @@ static ssize_t dev_id_show(struct device *dev,
|
||||
{
|
||||
struct net_device *ndev = to_net_dev(dev);
|
||||
|
||||
if (ndev->dev_id == ndev->dev_port)
|
||||
/*
|
||||
* ndev->dev_port will be equal to 0 in old kernel prior to commit
|
||||
* 9b8b2a323008 ("IB/ipoib: Use dev_port to expose network interface
|
||||
* port numbers") Zero was chosen as special case for user space
|
||||
* applications to fallback and query dev_id to check if it has
|
||||
* different value or not.
|
||||
*
|
||||
* Don't print warning in such scenario.
|
||||
*
|
||||
* https://github.com/systemd/systemd/blob/master/src/udev/udev-builtin-net_id.c#L358
|
||||
*/
|
||||
if (ndev->dev_port && ndev->dev_id == ndev->dev_port)
|
||||
netdev_info_once(ndev,
|
||||
"\"%s\" wants to know my dev_id. Should it look at dev_port instead? See Documentation/ABI/testing/sysfs-class-net for more info.\n",
|
||||
current->comm);
|
||||
|
@@ -279,8 +279,7 @@ void ipoib_event(struct ib_event_handler *handler,
|
||||
ipoib_dbg(priv, "Event %d on device %s port %d\n", record->event,
|
||||
dev_name(&record->device->dev), record->element.port_num);
|
||||
|
||||
if (record->event == IB_EVENT_SM_CHANGE ||
|
||||
record->event == IB_EVENT_CLIENT_REREGISTER) {
|
||||
if (record->event == IB_EVENT_CLIENT_REREGISTER) {
|
||||
queue_work(ipoib_workqueue, &priv->flush_light);
|
||||
} else if (record->event == IB_EVENT_PORT_ERR ||
|
||||
record->event == IB_EVENT_PORT_ACTIVE ||
|
||||
|
@@ -4,8 +4,8 @@ config INFINIBAND_ISER
|
||||
select SCSI_ISCSI_ATTRS
|
||||
---help---
|
||||
Support for the iSCSI Extensions for RDMA (iSER) Protocol
|
||||
over InfiniBand. This allows you to access storage devices
|
||||
that speak iSCSI over iSER over InfiniBand.
|
||||
over InfiniBand. This allows you to access storage devices
|
||||
that speak iSCSI over iSER over InfiniBand.
|
||||
|
||||
The iSER protocol is defined by IETF.
|
||||
See <http://www.ietf.org/rfc/rfc5046.txt>
|
||||
|
@@ -763,7 +763,6 @@ static int iscsi_iser_get_ep_param(struct iscsi_endpoint *ep,
|
||||
enum iscsi_param param, char *buf)
|
||||
{
|
||||
struct iser_conn *iser_conn = ep->dd_data;
|
||||
int len;
|
||||
|
||||
switch (param) {
|
||||
case ISCSI_PARAM_CONN_PORT:
|
||||
@@ -774,12 +773,10 @@ static int iscsi_iser_get_ep_param(struct iscsi_endpoint *ep,
|
||||
return iscsi_conn_get_addr_param((struct sockaddr_storage *)
|
||||
&iser_conn->ib_conn.cma_id->route.addr.dst_addr,
|
||||
param, buf);
|
||||
break;
|
||||
default:
|
||||
return -ENOSYS;
|
||||
break;
|
||||
}
|
||||
|
||||
return len;
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -311,7 +311,7 @@ struct iser_login_desc {
|
||||
u64 rsp_dma;
|
||||
struct ib_sge sge;
|
||||
struct ib_cqe cqe;
|
||||
} __attribute__((packed));
|
||||
} __packed;
|
||||
|
||||
struct iser_conn;
|
||||
struct ib_conn;
|
||||
|
@@ -51,6 +51,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/xarray.h>
|
||||
#include <rdma/ib_addr.h>
|
||||
#include <rdma/ib_verbs.h>
|
||||
#include <rdma/opa_smi.h>
|
||||
@@ -97,7 +98,7 @@ const char opa_vnic_driver_version[] = DRV_VERSION;
|
||||
* @class_port_info: Class port info information.
|
||||
* @tid: Transaction id
|
||||
* @port_num: OPA port number
|
||||
* @vport_idr: vnic ports idr
|
||||
* @vports: vnic ports
|
||||
* @event_handler: ib event handler
|
||||
* @lock: adapter interface lock
|
||||
*/
|
||||
@@ -107,7 +108,7 @@ struct opa_vnic_vema_port {
|
||||
struct opa_class_port_info class_port_info;
|
||||
u64 tid;
|
||||
u8 port_num;
|
||||
struct idr vport_idr;
|
||||
struct xarray vports;
|
||||
struct ib_event_handler event_handler;
|
||||
|
||||
/* Lock to query/update network adapter */
|
||||
@@ -148,7 +149,7 @@ vema_get_vport_adapter(struct opa_vnic_vema_mad *recvd_mad,
|
||||
{
|
||||
u8 vport_num = vema_get_vport_num(recvd_mad);
|
||||
|
||||
return idr_find(&port->vport_idr, vport_num);
|
||||
return xa_load(&port->vports, vport_num);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -207,8 +208,7 @@ static struct opa_vnic_adapter *vema_add_vport(struct opa_vnic_vema_port *port,
|
||||
int rc;
|
||||
|
||||
adapter->cport = cport;
|
||||
rc = idr_alloc(&port->vport_idr, adapter, vport_num,
|
||||
vport_num + 1, GFP_NOWAIT);
|
||||
rc = xa_insert(&port->vports, vport_num, adapter, GFP_KERNEL);
|
||||
if (rc < 0) {
|
||||
opa_vnic_rem_netdev(adapter);
|
||||
adapter = ERR_PTR(rc);
|
||||
@@ -853,36 +853,14 @@ err_exit:
|
||||
v_err("Aborting trap\n");
|
||||
}
|
||||
|
||||
static int vema_rem_vport(int id, void *p, void *data)
|
||||
{
|
||||
struct opa_vnic_adapter *adapter = p;
|
||||
|
||||
opa_vnic_rem_netdev(adapter);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vema_enable_vport(int id, void *p, void *data)
|
||||
{
|
||||
struct opa_vnic_adapter *adapter = p;
|
||||
|
||||
netif_carrier_on(adapter->netdev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vema_disable_vport(int id, void *p, void *data)
|
||||
{
|
||||
struct opa_vnic_adapter *adapter = p;
|
||||
|
||||
netif_carrier_off(adapter->netdev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void opa_vnic_event(struct ib_event_handler *handler,
|
||||
struct ib_event *record)
|
||||
{
|
||||
struct opa_vnic_vema_port *port =
|
||||
container_of(handler, struct opa_vnic_vema_port, event_handler);
|
||||
struct opa_vnic_ctrl_port *cport = port->cport;
|
||||
struct opa_vnic_adapter *adapter;
|
||||
unsigned long index;
|
||||
|
||||
if (record->element.port_num != port->port_num)
|
||||
return;
|
||||
@@ -891,10 +869,16 @@ static void opa_vnic_event(struct ib_event_handler *handler,
|
||||
record->event, dev_name(&record->device->dev),
|
||||
record->element.port_num);
|
||||
|
||||
if (record->event == IB_EVENT_PORT_ERR)
|
||||
idr_for_each(&port->vport_idr, vema_disable_vport, NULL);
|
||||
if (record->event == IB_EVENT_PORT_ACTIVE)
|
||||
idr_for_each(&port->vport_idr, vema_enable_vport, NULL);
|
||||
if (record->event != IB_EVENT_PORT_ERR &&
|
||||
record->event != IB_EVENT_PORT_ACTIVE)
|
||||
return;
|
||||
|
||||
xa_for_each(&port->vports, index, adapter) {
|
||||
if (record->event == IB_EVENT_PORT_ACTIVE)
|
||||
netif_carrier_on(adapter->netdev);
|
||||
else
|
||||
netif_carrier_off(adapter->netdev);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -905,6 +889,8 @@ static void opa_vnic_event(struct ib_event_handler *handler,
|
||||
*/
|
||||
static void vema_unregister(struct opa_vnic_ctrl_port *cport)
|
||||
{
|
||||
struct opa_vnic_adapter *adapter;
|
||||
unsigned long index;
|
||||
int i;
|
||||
|
||||
for (i = 1; i <= cport->num_ports; i++) {
|
||||
@@ -915,13 +901,14 @@ static void vema_unregister(struct opa_vnic_ctrl_port *cport)
|
||||
|
||||
/* Lock ensures no MAD is being processed */
|
||||
mutex_lock(&port->lock);
|
||||
idr_for_each(&port->vport_idr, vema_rem_vport, NULL);
|
||||
xa_for_each(&port->vports, index, adapter)
|
||||
opa_vnic_rem_netdev(adapter);
|
||||
mutex_unlock(&port->lock);
|
||||
|
||||
ib_unregister_mad_agent(port->mad_agent);
|
||||
port->mad_agent = NULL;
|
||||
mutex_destroy(&port->lock);
|
||||
idr_destroy(&port->vport_idr);
|
||||
xa_destroy(&port->vports);
|
||||
ib_unregister_event_handler(&port->event_handler);
|
||||
}
|
||||
}
|
||||
@@ -958,7 +945,7 @@ static int vema_register(struct opa_vnic_ctrl_port *cport)
|
||||
cport->ibdev, opa_vnic_event);
|
||||
ib_register_event_handler(&port->event_handler);
|
||||
|
||||
idr_init(&port->vport_idr);
|
||||
xa_init(&port->vports);
|
||||
mutex_init(&port->lock);
|
||||
port->mad_agent = ib_register_mad_agent(cport->ibdev, i,
|
||||
IB_QPT_GSI, ®_req,
|
||||
@@ -969,7 +956,6 @@ static int vema_register(struct opa_vnic_ctrl_port *cport)
|
||||
ret = PTR_ERR(port->mad_agent);
|
||||
port->mad_agent = NULL;
|
||||
mutex_destroy(&port->lock);
|
||||
idr_destroy(&port->vport_idr);
|
||||
vema_unregister(cport);
|
||||
return ret;
|
||||
}
|
||||
|
Referens i nytt ärende
Block a user