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

qib: Convert qib_unit_table to XArray

Also remove qib_devs_list.

Signed-off-by: Matthew Wilcox <willy@infradead.org>
Reviewed-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>

authored by

Matthew Wilcox and committed by
Jason Gunthorpe
059d48fb 03b92789

+27 -69
+2 -2
drivers/infiniband/hw/qib/qib.h
··· 52 52 #include <linux/kref.h> 53 53 #include <linux/sched.h> 54 54 #include <linux/kthread.h> 55 + #include <linux/xarray.h> 55 56 #include <rdma/ib_hdrs.h> 56 57 #include <rdma/rdma_vt.h> 57 58 ··· 1106 1105 int rec_cpu_num; /* for cpu affinity; -1 if none */ 1107 1106 }; 1108 1107 1109 - extern struct list_head qib_dev_list; 1110 - extern spinlock_t qib_devs_lock; 1108 + extern struct xarray qib_dev_table; 1111 1109 extern struct qib_devdata *qib_lookup(int unit); 1112 1110 extern u32 qib_cpulist_count; 1113 1111 extern unsigned long *qib_cpulist;
+8 -12
drivers/infiniband/hw/qib/qib_driver.c
··· 49 49 */ 50 50 const char ib_qib_version[] = QIB_DRIVER_VERSION "\n"; 51 51 52 - DEFINE_SPINLOCK(qib_devs_lock); 53 - LIST_HEAD(qib_dev_list); 54 52 DEFINE_MUTEX(qib_mutex); /* general driver use */ 55 53 56 54 unsigned qib_ibmtu; ··· 94 96 { 95 97 struct qib_devdata *dd; 96 98 struct qib_pportdata *ppd; 97 - unsigned long flags; 99 + unsigned long index, flags; 98 100 int pidx, nunits_active = 0; 99 101 100 - spin_lock_irqsave(&qib_devs_lock, flags); 101 - list_for_each_entry(dd, &qib_dev_list, list) { 102 + xa_lock_irqsave(&qib_dev_table, flags); 103 + xa_for_each(&qib_dev_table, index, dd) { 102 104 if (!(dd->flags & QIB_PRESENT) || !dd->kregbase) 103 105 continue; 104 106 for (pidx = 0; pidx < dd->num_pports; ++pidx) { ··· 110 112 } 111 113 } 112 114 } 113 - spin_unlock_irqrestore(&qib_devs_lock, flags); 115 + xa_unlock_irqrestore(&qib_dev_table, flags); 114 116 return nunits_active; 115 117 } 116 118 ··· 123 125 { 124 126 int nunits = 0, npresent = 0, nup = 0; 125 127 struct qib_devdata *dd; 126 - unsigned long flags; 128 + unsigned long index, flags; 127 129 int pidx; 128 130 struct qib_pportdata *ppd; 129 131 130 - spin_lock_irqsave(&qib_devs_lock, flags); 131 - 132 - list_for_each_entry(dd, &qib_dev_list, list) { 132 + xa_lock_irqsave(&qib_dev_table, flags); 133 + xa_for_each(&qib_dev_table, index, dd) { 133 134 nunits++; 134 135 if ((dd->flags & QIB_PRESENT) && dd->kregbase) 135 136 npresent++; ··· 139 142 nup++; 140 143 } 141 144 } 142 - 143 - spin_unlock_irqrestore(&qib_devs_lock, flags); 145 + xa_unlock_irqrestore(&qib_dev_table, flags); 144 146 145 147 if (npresentp) 146 148 *npresentp = npresent;
+3 -9
drivers/infiniband/hw/qib/qib_fs.c
··· 508 508 */ 509 509 static int qibfs_fill_super(struct super_block *sb, void *data, int silent) 510 510 { 511 - struct qib_devdata *dd, *tmp; 512 - unsigned long flags; 511 + struct qib_devdata *dd; 512 + unsigned long index; 513 513 int ret; 514 514 515 515 static const struct tree_descr files[] = { ··· 524 524 goto bail; 525 525 } 526 526 527 - spin_lock_irqsave(&qib_devs_lock, flags); 528 - 529 - list_for_each_entry_safe(dd, tmp, &qib_dev_list, list) { 530 - spin_unlock_irqrestore(&qib_devs_lock, flags); 527 + xa_for_each(&qib_dev_table, index, dd) { 531 528 ret = add_cntr_files(sb, dd); 532 529 if (ret) 533 530 goto bail; 534 - spin_lock_irqsave(&qib_devs_lock, flags); 535 531 } 536 - 537 - spin_unlock_irqrestore(&qib_devs_lock, flags); 538 532 539 533 bail: 540 534 return ret;
+2 -2
drivers/infiniband/hw/qib/qib_iba7322.c
··· 6140 6140 static int setup_txselect(const char *str, const struct kernel_param *kp) 6141 6141 { 6142 6142 struct qib_devdata *dd; 6143 - unsigned long val; 6143 + unsigned long index, val; 6144 6144 char *n; 6145 6145 6146 6146 if (strlen(str) >= ARRAY_SIZE(txselect_list)) { ··· 6156 6156 } 6157 6157 strncpy(txselect_list, str, ARRAY_SIZE(txselect_list) - 1); 6158 6158 6159 - list_for_each_entry(dd, &qib_dev_list, list) 6159 + xa_for_each(&qib_dev_table, index, dd) 6160 6160 if (dd->deviceid == PCI_DEVICE_ID_QLOGIC_IB_7322) 6161 6161 set_no_qsfp_atten(dd, 1); 6162 6162 return 0;
+12 -44
drivers/infiniband/hw/qib/qib_init.c
··· 36 36 #include <linux/netdevice.h> 37 37 #include <linux/vmalloc.h> 38 38 #include <linux/delay.h> 39 - #include <linux/idr.h> 40 39 #include <linux/module.h> 41 40 #include <linux/printk.h> 42 41 #ifdef CONFIG_INFINIBAND_QIB_DCA ··· 94 95 95 96 static void verify_interrupt(struct timer_list *); 96 97 97 - static struct idr qib_unit_table; 98 + DEFINE_XARRAY_FLAGS(qib_dev_table, XA_FLAGS_ALLOC | XA_FLAGS_LOCK_IRQ); 98 99 u32 qib_cpulist_count; 99 100 unsigned long *qib_cpulist; 100 101 ··· 784 785 { 785 786 } 786 787 787 - static inline struct qib_devdata *__qib_lookup(int unit) 788 - { 789 - return idr_find(&qib_unit_table, unit); 790 - } 791 - 792 788 struct qib_devdata *qib_lookup(int unit) 793 789 { 794 - struct qib_devdata *dd; 795 - unsigned long flags; 796 - 797 - spin_lock_irqsave(&qib_devs_lock, flags); 798 - dd = __qib_lookup(unit); 799 - spin_unlock_irqrestore(&qib_devs_lock, flags); 800 - 801 - return dd; 790 + return xa_load(&qib_dev_table, unit); 802 791 } 803 792 804 793 /* ··· 1033 1046 { 1034 1047 unsigned long flags; 1035 1048 1036 - spin_lock_irqsave(&qib_devs_lock, flags); 1037 - idr_remove(&qib_unit_table, dd->unit); 1038 - list_del(&dd->list); 1039 - spin_unlock_irqrestore(&qib_devs_lock, flags); 1049 + xa_lock_irqsave(&qib_dev_table, flags); 1050 + __xa_erase(&qib_dev_table, dd->unit); 1051 + xa_unlock_irqrestore(&qib_dev_table, flags); 1040 1052 1041 1053 #ifdef CONFIG_DEBUG_FS 1042 1054 qib_dbg_ibdev_exit(&dd->verbs_dev); ··· 1056 1070 1057 1071 u64 qib_sps_ints(void) 1058 1072 { 1059 - unsigned long flags; 1073 + unsigned long index, flags; 1060 1074 struct qib_devdata *dd; 1061 1075 u64 sps_ints = 0; 1062 1076 1063 - spin_lock_irqsave(&qib_devs_lock, flags); 1064 - list_for_each_entry(dd, &qib_dev_list, list) { 1077 + xa_lock_irqsave(&qib_dev_table, flags); 1078 + xa_for_each(&qib_dev_table, index, dd) { 1065 1079 sps_ints += qib_int_counter(dd); 1066 1080 } 1067 - spin_unlock_irqrestore(&qib_devs_lock, flags); 1081 + xa_unlock_irqrestore(&qib_dev_table, flags); 1068 1082 return sps_ints; 1069 1083 } 1070 1084 ··· 1073 1087 * allocator, because the verbs cleanup process both does cleanup and 1074 1088 * free of the data structure. 1075 1089 * "extra" is for chip-specific data. 1076 - * 1077 - * Use the idr mechanism to get a unit number for this unit. 1078 1090 */ 1079 1091 struct qib_devdata *qib_alloc_devdata(struct pci_dev *pdev, size_t extra) 1080 1092 { 1081 - unsigned long flags; 1082 1093 struct qib_devdata *dd; 1083 1094 int ret, nports; 1084 1095 ··· 1086 1103 if (!dd) 1087 1104 return ERR_PTR(-ENOMEM); 1088 1105 1089 - INIT_LIST_HEAD(&dd->list); 1090 - 1091 - idr_preload(GFP_KERNEL); 1092 - spin_lock_irqsave(&qib_devs_lock, flags); 1093 - 1094 - ret = idr_alloc(&qib_unit_table, dd, 0, 0, GFP_NOWAIT); 1095 - if (ret >= 0) { 1096 - dd->unit = ret; 1097 - list_add(&dd->list, &qib_dev_list); 1098 - } 1099 - 1100 - spin_unlock_irqrestore(&qib_devs_lock, flags); 1101 - idr_preload_end(); 1102 - 1106 + ret = xa_alloc_irq(&qib_dev_table, &dd->unit, dd, xa_limit_32b, 1107 + GFP_KERNEL); 1103 1108 if (ret < 0) { 1104 1109 qib_early_err(&pdev->dev, 1105 1110 "Could not allocate unit ID: error %d\n", -ret); ··· 1226 1255 * These must be called before the driver is registered with 1227 1256 * the PCI subsystem. 1228 1257 */ 1229 - idr_init(&qib_unit_table); 1230 - 1231 1258 #ifdef CONFIG_INFINIBAND_QIB_DCA 1232 1259 dca_register_notify(&dca_notifier); 1233 1260 #endif ··· 1250 1281 #ifdef CONFIG_DEBUG_FS 1251 1282 qib_dbg_exit(); 1252 1283 #endif 1253 - idr_destroy(&qib_unit_table); 1254 1284 qib_dev_cleanup(); 1255 1285 bail: 1256 1286 return ret; ··· 1281 1313 qib_cpulist_count = 0; 1282 1314 kfree(qib_cpulist); 1283 1315 1284 - idr_destroy(&qib_unit_table); 1316 + WARN_ON(!xa_empty(&qib_dev_table)); 1285 1317 qib_dev_cleanup(); 1286 1318 } 1287 1319