Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

opa_vnic: Convert vport_idr to XArray

Signed-off-by: Matthew Wilcox <willy@infradead.org>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>

authored by

Matthew Wilcox and committed by
Jason Gunthorpe
fae7a699 059d48fb

+23 -37
+23 -37
drivers/infiniband/ulp/opa_vnic/opa_vnic_vema.c
··· 51 51 */ 52 52 53 53 #include <linux/module.h> 54 + #include <linux/xarray.h> 54 55 #include <rdma/ib_addr.h> 55 56 #include <rdma/ib_verbs.h> 56 57 #include <rdma/opa_smi.h> ··· 98 97 * @class_port_info: Class port info information. 99 98 * @tid: Transaction id 100 99 * @port_num: OPA port number 101 - * @vport_idr: vnic ports idr 100 + * @vports: vnic ports 102 101 * @event_handler: ib event handler 103 102 * @lock: adapter interface lock 104 103 */ ··· 108 107 struct opa_class_port_info class_port_info; 109 108 u64 tid; 110 109 u8 port_num; 111 - struct idr vport_idr; 110 + struct xarray vports; 112 111 struct ib_event_handler event_handler; 113 112 114 113 /* Lock to query/update network adapter */ ··· 149 148 { 150 149 u8 vport_num = vema_get_vport_num(recvd_mad); 151 150 152 - return idr_find(&port->vport_idr, vport_num); 151 + return xa_load(&port->vports, vport_num); 153 152 } 154 153 155 154 /** ··· 208 207 int rc; 209 208 210 209 adapter->cport = cport; 211 - rc = idr_alloc(&port->vport_idr, adapter, vport_num, 212 - vport_num + 1, GFP_NOWAIT); 210 + rc = xa_insert(&port->vports, vport_num, adapter, GFP_KERNEL); 213 211 if (rc < 0) { 214 212 opa_vnic_rem_netdev(adapter); 215 213 adapter = ERR_PTR(rc); ··· 853 853 v_err("Aborting trap\n"); 854 854 } 855 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; 878 - } 879 - 880 856 static void opa_vnic_event(struct ib_event_handler *handler, 881 857 struct ib_event *record) 882 858 { 883 859 struct opa_vnic_vema_port *port = 884 860 container_of(handler, struct opa_vnic_vema_port, event_handler); 885 861 struct opa_vnic_ctrl_port *cport = port->cport; 862 + struct opa_vnic_adapter *adapter; 863 + unsigned long index; 886 864 887 865 if (record->element.port_num != port->port_num) 888 866 return; ··· 869 891 record->event, dev_name(&record->device->dev), 870 892 record->element.port_num); 871 893 872 - if (record->event == IB_EVENT_PORT_ERR) 873 - idr_for_each(&port->vport_idr, vema_disable_vport, NULL); 874 - if (record->event == IB_EVENT_PORT_ACTIVE) 875 - idr_for_each(&port->vport_idr, vema_enable_vport, NULL); 894 + if (record->event != IB_EVENT_PORT_ERR || 895 + record->event != IB_EVENT_PORT_ACTIVE) 896 + return; 897 + 898 + xa_for_each(&port->vports, index, adapter) { 899 + if (record->event == IB_EVENT_PORT_ACTIVE) 900 + netif_carrier_on(adapter->netdev); 901 + else 902 + netif_carrier_off(adapter->netdev); 903 + } 876 904 } 877 905 878 906 /** ··· 889 905 */ 890 906 static void vema_unregister(struct opa_vnic_ctrl_port *cport) 891 907 { 908 + struct opa_vnic_adapter *adapter; 909 + unsigned long index; 892 910 int i; 893 911 894 912 for (i = 1; i <= cport->num_ports; i++) { ··· 901 915 902 916 /* Lock ensures no MAD is being processed */ 903 917 mutex_lock(&port->lock); 904 - idr_for_each(&port->vport_idr, vema_rem_vport, NULL); 918 + xa_for_each(&port->vports, index, adapter) 919 + opa_vnic_rem_netdev(adapter); 905 920 mutex_unlock(&port->lock); 906 921 907 922 ib_unregister_mad_agent(port->mad_agent); 908 923 port->mad_agent = NULL; 909 924 mutex_destroy(&port->lock); 910 - idr_destroy(&port->vport_idr); 925 + xa_destroy(&port->vports); 911 926 ib_unregister_event_handler(&port->event_handler); 912 927 } 913 928 } ··· 945 958 cport->ibdev, opa_vnic_event); 946 959 ib_register_event_handler(&port->event_handler); 947 960 948 - idr_init(&port->vport_idr); 961 + xa_init(&port->vports); 949 962 mutex_init(&port->lock); 950 963 port->mad_agent = ib_register_mad_agent(cport->ibdev, i, 951 964 IB_QPT_GSI, &reg_req, ··· 956 969 ret = PTR_ERR(port->mad_agent); 957 970 port->mad_agent = NULL; 958 971 mutex_destroy(&port->lock); 959 - idr_destroy(&port->vport_idr); 960 972 vema_unregister(cport); 961 973 return ret; 962 974 }