mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-29 07:34:06 +08:00
opa_vnic: Convert vport_idr to XArray
Signed-off-by: Matthew Wilcox <willy@infradead.org> Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
This commit is contained in:
parent
059d48fbf6
commit
fae7a699a9
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user