diff mbox series

[26/32] opa_vnic: Convert vport_idr to XArray

Message ID 20190221002107.22625-27-willy@infradead.org (mailing list archive)
State Accepted
Delegated to: Jason Gunthorpe
Headers show
Series Convert the Infiniband subsystem to XArray | expand

Commit Message

Matthew Wilcox Feb. 21, 2019, 12:21 a.m. UTC
Signed-off-by: Matthew Wilcox <willy@infradead.org>
---
 .../infiniband/ulp/opa_vnic/opa_vnic_vema.c   | 60 +++++++------------
 1 file changed, 23 insertions(+), 37 deletions(-)

Comments

Dennis Dalessandro April 1, 2019, 1:50 p.m. UTC | #1
On 2/20/2019 7:21 PM, Matthew Wilcox wrote:
> Signed-off-by: Matthew Wilcox <willy@infradead.org>
> ---
>   .../infiniband/ulp/opa_vnic/opa_vnic_vema.c   | 60 +++++++------------
>   1 file changed, 23 insertions(+), 37 deletions(-)
.
.
.
> @@ -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_ERR)
> +			netif_carrier_off(adapter->netdev);
> +		else
> +			netif_carrier_on(adapter->netdev);
>

This might be better written as:
	if (record->event == IB_EVENT_PORT_ACTIVE)
		netif_carrier_on(...)
	else
		netif_carrier_off(...)

-Denny
Jason Gunthorpe April 1, 2019, 4:38 p.m. UTC | #2
On Mon, Apr 01, 2019 at 09:50:59AM -0400, Dennis Dalessandro wrote:
> On 2/20/2019 7:21 PM, Matthew Wilcox wrote:
> > Signed-off-by: Matthew Wilcox <willy@infradead.org>
> >   .../infiniband/ulp/opa_vnic/opa_vnic_vema.c   | 60 +++++++------------
> >   1 file changed, 23 insertions(+), 37 deletions(-)
> .
> .
> .
> > @@ -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_ERR)
> > +			netif_carrier_off(adapter->netdev);
> > +		else
> > +			netif_carrier_on(adapter->netdev);
> > 
> 
> This might be better written as:
> 	if (record->event == IB_EVENT_PORT_ACTIVE)
> 		netif_carrier_on(...)
> 	else
> 		netif_carrier_off(...)

I made this change and applied to for-next Thanks

Jason
diff mbox series

Patch

diff --git a/drivers/infiniband/ulp/opa_vnic/opa_vnic_vema.c b/drivers/infiniband/ulp/opa_vnic/opa_vnic_vema.c
index 560e4f2d466e..88e8168ac955 100644
--- a/drivers/infiniband/ulp/opa_vnic/opa_vnic_vema.c
+++ b/drivers/infiniband/ulp/opa_vnic/opa_vnic_vema.c
@@ -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_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_ERR)
+			netif_carrier_off(adapter->netdev);
+		else
+			netif_carrier_on(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;
 		}