Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fae7a699 authored by Matthew Wilcox's avatar Matthew Wilcox Committed by Jason Gunthorpe
Browse files

opa_vnic: Convert vport_idr to XArray

parent 059d48fb
Loading
Loading
Loading
Loading
+23 −37
Original line number Diff line number Diff line
@@ -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 @@ void opa_vnic_vema_send_trap(struct opa_vnic_adapter *adapter,
	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_ERR ||
	    record->event != IB_EVENT_PORT_ACTIVE)
		return;

	xa_for_each(&port->vports, index, adapter) {
		if (record->event == IB_EVENT_PORT_ACTIVE)
		idr_for_each(&port->vport_idr, vema_enable_vport, NULL);
			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, &reg_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;
		}