hc
2024-05-14 bedbef8ad3e75a304af6361af235302bcc61d06b
kernel/drivers/infiniband/ulp/opa_vnic/opa_vnic_vema.c
....@@ -51,6 +51,7 @@
5151 */
5252
5353 #include <linux/module.h>
54
+#include <linux/xarray.h>
5455 #include <rdma/ib_addr.h>
5556 #include <rdma/ib_verbs.h>
5657 #include <rdma/opa_smi.h>
....@@ -58,9 +59,7 @@
5859
5960 #include "opa_vnic_internal.h"
6061
61
-#define DRV_VERSION "1.0"
6262 char opa_vnic_driver_name[] = "opa_vnic";
63
-const char opa_vnic_driver_version[] = DRV_VERSION;
6463
6564 /*
6665 * The trap service level is kept in bits 3 to 7 in the trap_sl_rsvd
....@@ -97,7 +96,7 @@
9796 * @class_port_info: Class port info information.
9897 * @tid: Transaction id
9998 * @port_num: OPA port number
100
- * @vport_idr: vnic ports idr
99
+ * @vports: vnic ports
101100 * @event_handler: ib event handler
102101 * @lock: adapter interface lock
103102 */
....@@ -107,14 +106,14 @@
107106 struct opa_class_port_info class_port_info;
108107 u64 tid;
109108 u8 port_num;
110
- struct idr vport_idr;
109
+ struct xarray vports;
111110 struct ib_event_handler event_handler;
112111
113112 /* Lock to query/update network adapter */
114113 struct mutex lock;
115114 };
116115
117
-static void opa_vnic_vema_add_one(struct ib_device *device);
116
+static int opa_vnic_vema_add_one(struct ib_device *device);
118117 static void opa_vnic_vema_rem_one(struct ib_device *device,
119118 void *client_data);
120119
....@@ -148,7 +147,7 @@
148147 {
149148 u8 vport_num = vema_get_vport_num(recvd_mad);
150149
151
- return idr_find(&port->vport_idr, vport_num);
150
+ return xa_load(&port->vports, vport_num);
152151 }
153152
154153 /**
....@@ -207,8 +206,7 @@
207206 int rc;
208207
209208 adapter->cport = cport;
210
- rc = idr_alloc(&port->vport_idr, adapter, vport_num,
211
- vport_num + 1, GFP_NOWAIT);
209
+ rc = xa_insert(&port->vports, vport_num, adapter, GFP_KERNEL);
212210 if (rc < 0) {
213211 opa_vnic_rem_netdev(adapter);
214212 adapter = ERR_PTR(rc);
....@@ -549,7 +547,6 @@
549547 vema_get_mac_entries(port, recvd_mad, rsp_mad);
550548 break;
551549 case OPA_EM_ATTR_IFACE_UCAST_MACS:
552
- /* fall through */
553550 case OPA_EM_ATTR_IFACE_MCAST_MACS:
554551 vema_get_mac_list(port, recvd_mad, rsp_mad, attr_id);
555552 break;
....@@ -606,7 +603,7 @@
606603 static void vema_send(struct ib_mad_agent *mad_agent,
607604 struct ib_mad_send_wc *mad_wc)
608605 {
609
- rdma_destroy_ah(mad_wc->send_buf->ah);
606
+ rdma_destroy_ah(mad_wc->send_buf->ah, RDMA_DESTROY_AH_SLEEPABLE);
610607 ib_free_send_mad(mad_wc->send_buf);
611608 }
612609
....@@ -680,7 +677,7 @@
680677 ib_free_send_mad(rsp);
681678
682679 err_rsp:
683
- rdma_destroy_ah(ah);
680
+ rdma_destroy_ah(ah, RDMA_DESTROY_AH_SLEEPABLE);
684681 free_recv_mad:
685682 ib_free_recv_mad(mad_wc);
686683 }
....@@ -777,7 +774,7 @@
777774 }
778775
779776 rdma_ah_set_dlid(&ah_attr, trap_lid);
780
- ah = rdma_create_ah(port->mad_agent->qp->pd, &ah_attr);
777
+ ah = rdma_create_ah(port->mad_agent->qp->pd, &ah_attr, 0);
781778 if (IS_ERR(ah)) {
782779 c_err("%s:Couldn't create new AH = %p\n", __func__, ah);
783780 c_err("%s:dlid = %d, sl = %d, port = %d\n", __func__,
....@@ -848,33 +845,9 @@
848845 }
849846
850847 err_sndbuf:
851
- rdma_destroy_ah(ah);
848
+ rdma_destroy_ah(ah, 0);
852849 err_exit:
853850 v_err("Aborting trap\n");
854
-}
855
-
856
-static int vema_rem_vport(int id, void *p, void *data)
857
-{
858
- struct opa_vnic_adapter *adapter = p;
859
-
860
- opa_vnic_rem_netdev(adapter);
861
- return 0;
862
-}
863
-
864
-static int vema_enable_vport(int id, void *p, void *data)
865
-{
866
- struct opa_vnic_adapter *adapter = p;
867
-
868
- netif_carrier_on(adapter->netdev);
869
- return 0;
870
-}
871
-
872
-static int vema_disable_vport(int id, void *p, void *data)
873
-{
874
- struct opa_vnic_adapter *adapter = p;
875
-
876
- netif_carrier_off(adapter->netdev);
877
- return 0;
878851 }
879852
880853 static void opa_vnic_event(struct ib_event_handler *handler,
....@@ -883,17 +856,26 @@
883856 struct opa_vnic_vema_port *port =
884857 container_of(handler, struct opa_vnic_vema_port, event_handler);
885858 struct opa_vnic_ctrl_port *cport = port->cport;
859
+ struct opa_vnic_adapter *adapter;
860
+ unsigned long index;
886861
887862 if (record->element.port_num != port->port_num)
888863 return;
889864
890865 c_dbg("OPA_VNIC received event %d on device %s port %d\n",
891
- record->event, record->device->name, record->element.port_num);
866
+ record->event, dev_name(&record->device->dev),
867
+ record->element.port_num);
892868
893
- if (record->event == IB_EVENT_PORT_ERR)
894
- idr_for_each(&port->vport_idr, vema_disable_vport, NULL);
895
- if (record->event == IB_EVENT_PORT_ACTIVE)
896
- idr_for_each(&port->vport_idr, vema_enable_vport, NULL);
869
+ if (record->event != IB_EVENT_PORT_ERR &&
870
+ record->event != IB_EVENT_PORT_ACTIVE)
871
+ return;
872
+
873
+ xa_for_each(&port->vports, index, adapter) {
874
+ if (record->event == IB_EVENT_PORT_ACTIVE)
875
+ netif_carrier_on(adapter->netdev);
876
+ else
877
+ netif_carrier_off(adapter->netdev);
878
+ }
897879 }
898880
899881 /**
....@@ -904,6 +886,8 @@
904886 */
905887 static void vema_unregister(struct opa_vnic_ctrl_port *cport)
906888 {
889
+ struct opa_vnic_adapter *adapter;
890
+ unsigned long index;
907891 int i;
908892
909893 for (i = 1; i <= cport->num_ports; i++) {
....@@ -914,13 +898,14 @@
914898
915899 /* Lock ensures no MAD is being processed */
916900 mutex_lock(&port->lock);
917
- idr_for_each(&port->vport_idr, vema_rem_vport, NULL);
901
+ xa_for_each(&port->vports, index, adapter)
902
+ opa_vnic_rem_netdev(adapter);
918903 mutex_unlock(&port->lock);
919904
920905 ib_unregister_mad_agent(port->mad_agent);
921906 port->mad_agent = NULL;
922907 mutex_destroy(&port->lock);
923
- idr_destroy(&port->vport_idr);
908
+ xa_destroy(&port->vports);
924909 ib_unregister_event_handler(&port->event_handler);
925910 }
926911 }
....@@ -957,7 +942,7 @@
957942 cport->ibdev, opa_vnic_event);
958943 ib_register_event_handler(&port->event_handler);
959944
960
- idr_init(&port->vport_idr);
945
+ xa_init(&port->vports);
961946 mutex_init(&port->lock);
962947 port->mad_agent = ib_register_mad_agent(cport->ibdev, i,
963948 IB_QPT_GSI, &reg_req,
....@@ -968,7 +953,6 @@
968953 ret = PTR_ERR(port->mad_agent);
969954 port->mad_agent = NULL;
970955 mutex_destroy(&port->lock);
971
- idr_destroy(&port->vport_idr);
972956 vema_unregister(cport);
973957 return ret;
974958 }
....@@ -1004,18 +988,18 @@
1004988 *
1005989 * Allocate the vnic control port and initialize it.
1006990 */
1007
-static void opa_vnic_vema_add_one(struct ib_device *device)
991
+static int opa_vnic_vema_add_one(struct ib_device *device)
1008992 {
1009993 struct opa_vnic_ctrl_port *cport;
1010994 int rc, size = sizeof(*cport);
1011995
1012996 if (!rdma_cap_opa_vnic(device))
1013
- return;
997
+ return -EOPNOTSUPP;
1014998
1015999 size += device->phys_port_cnt * sizeof(struct opa_vnic_vema_port);
10161000 cport = kzalloc(size, GFP_KERNEL);
10171001 if (!cport)
1018
- return;
1002
+ return -ENOMEM;
10191003
10201004 cport->num_ports = device->phys_port_cnt;
10211005 cport->ibdev = device;
....@@ -1027,6 +1011,7 @@
10271011
10281012 ib_set_client_data(device, &opa_vnic_client, cport);
10291013 opa_vnic_ctrl_config_dev(cport, true);
1014
+ return 0;
10301015 }
10311016
10321017 /**
....@@ -1041,9 +1026,6 @@
10411026 {
10421027 struct opa_vnic_ctrl_port *cport = client_data;
10431028
1044
- if (!cport)
1045
- return;
1046
-
10471029 c_info("removing VNIC client\n");
10481030 opa_vnic_ctrl_config_dev(cport, false);
10491031 vema_unregister(cport);
....@@ -1053,9 +1035,6 @@
10531035 static int __init opa_vnic_init(void)
10541036 {
10551037 int rc;
1056
-
1057
- pr_info("OPA Virtual Network Driver - v%s\n",
1058
- opa_vnic_driver_version);
10591038
10601039 rc = ib_register_client(&opa_vnic_client);
10611040 if (rc)