hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/infiniband/hw/qib/qib_init.c
....@@ -36,7 +36,6 @@
3636 #include <linux/netdevice.h>
3737 #include <linux/vmalloc.h>
3838 #include <linux/delay.h>
39
-#include <linux/idr.h>
4039 #include <linux/module.h>
4140 #include <linux/printk.h>
4241 #ifdef CONFIG_INFINIBAND_QIB_DCA
....@@ -95,7 +94,7 @@
9594
9695 static void verify_interrupt(struct timer_list *);
9796
98
-static struct idr qib_unit_table;
97
+DEFINE_XARRAY_FLAGS(qib_dev_table, XA_FLAGS_ALLOC | XA_FLAGS_LOCK_IRQ);
9998 u32 qib_cpulist_count;
10099 unsigned long *qib_cpulist;
101100
....@@ -209,7 +208,6 @@
209208 rcd->rcvegrbuf_chunks = (rcd->rcvegrcnt +
210209 rcd->rcvegrbufs_perchunk - 1) /
211210 rcd->rcvegrbufs_perchunk;
212
- BUG_ON(!is_power_of_2(rcd->rcvegrbufs_perchunk));
213211 rcd->rcvegrbufs_perchunk_shift =
214212 ilog2(rcd->rcvegrbufs_perchunk);
215213 }
....@@ -786,21 +784,9 @@
786784 {
787785 }
788786
789
-static inline struct qib_devdata *__qib_lookup(int unit)
790
-{
791
- return idr_find(&qib_unit_table, unit);
792
-}
793
-
794787 struct qib_devdata *qib_lookup(int unit)
795788 {
796
- struct qib_devdata *dd;
797
- unsigned long flags;
798
-
799
- spin_lock_irqsave(&qib_devs_lock, flags);
800
- dd = __qib_lookup(unit);
801
- spin_unlock_irqrestore(&qib_devs_lock, flags);
802
-
803
- return dd;
789
+ return xa_load(&qib_dev_table, unit);
804790 }
805791
806792 /*
....@@ -1047,10 +1033,9 @@
10471033 {
10481034 unsigned long flags;
10491035
1050
- spin_lock_irqsave(&qib_devs_lock, flags);
1051
- idr_remove(&qib_unit_table, dd->unit);
1052
- list_del(&dd->list);
1053
- spin_unlock_irqrestore(&qib_devs_lock, flags);
1036
+ xa_lock_irqsave(&qib_dev_table, flags);
1037
+ __xa_erase(&qib_dev_table, dd->unit);
1038
+ xa_unlock_irqrestore(&qib_dev_table, flags);
10541039
10551040 #ifdef CONFIG_DEBUG_FS
10561041 qib_dbg_ibdev_exit(&dd->verbs_dev);
....@@ -1071,15 +1056,15 @@
10711056
10721057 u64 qib_sps_ints(void)
10731058 {
1074
- unsigned long flags;
1059
+ unsigned long index, flags;
10751060 struct qib_devdata *dd;
10761061 u64 sps_ints = 0;
10771062
1078
- spin_lock_irqsave(&qib_devs_lock, flags);
1079
- list_for_each_entry(dd, &qib_dev_list, list) {
1063
+ xa_lock_irqsave(&qib_dev_table, flags);
1064
+ xa_for_each(&qib_dev_table, index, dd) {
10801065 sps_ints += qib_int_counter(dd);
10811066 }
1082
- spin_unlock_irqrestore(&qib_devs_lock, flags);
1067
+ xa_unlock_irqrestore(&qib_dev_table, flags);
10831068 return sps_ints;
10841069 }
10851070
....@@ -1088,12 +1073,9 @@
10881073 * allocator, because the verbs cleanup process both does cleanup and
10891074 * free of the data structure.
10901075 * "extra" is for chip-specific data.
1091
- *
1092
- * Use the idr mechanism to get a unit number for this unit.
10931076 */
10941077 struct qib_devdata *qib_alloc_devdata(struct pci_dev *pdev, size_t extra)
10951078 {
1096
- unsigned long flags;
10971079 struct qib_devdata *dd;
10981080 int ret, nports;
10991081
....@@ -1104,20 +1086,8 @@
11041086 if (!dd)
11051087 return ERR_PTR(-ENOMEM);
11061088
1107
- INIT_LIST_HEAD(&dd->list);
1108
-
1109
- idr_preload(GFP_KERNEL);
1110
- spin_lock_irqsave(&qib_devs_lock, flags);
1111
-
1112
- ret = idr_alloc(&qib_unit_table, dd, 0, 0, GFP_NOWAIT);
1113
- if (ret >= 0) {
1114
- dd->unit = ret;
1115
- list_add(&dd->list, &qib_dev_list);
1116
- }
1117
-
1118
- spin_unlock_irqrestore(&qib_devs_lock, flags);
1119
- idr_preload_end();
1120
-
1089
+ ret = xa_alloc_irq(&qib_dev_table, &dd->unit, dd, xa_limit_32b,
1090
+ GFP_KERNEL);
11211091 if (ret < 0) {
11221092 qib_early_err(&pdev->dev,
11231093 "Could not allocate unit ID: error %d\n", -ret);
....@@ -1256,8 +1226,6 @@
12561226 * These must be called before the driver is registered with
12571227 * the PCI subsystem.
12581228 */
1259
- idr_init(&qib_unit_table);
1260
-
12611229 #ifdef CONFIG_INFINIBAND_QIB_DCA
12621230 dca_register_notify(&dca_notifier);
12631231 #endif
....@@ -1282,7 +1250,6 @@
12821250 #ifdef CONFIG_DEBUG_FS
12831251 qib_dbg_exit();
12841252 #endif
1285
- idr_destroy(&qib_unit_table);
12861253 qib_dev_cleanup();
12871254 bail:
12881255 return ret;
....@@ -1314,7 +1281,7 @@
13141281 qib_cpulist_count = 0;
13151282 kfree(qib_cpulist);
13161283
1317
- idr_destroy(&qib_unit_table);
1284
+ WARN_ON(!xa_empty(&qib_dev_table));
13181285 qib_dev_cleanup();
13191286 }
13201287
....@@ -1792,7 +1759,7 @@
17921759 qib_userlen = dd->ureg_align * dd->cfgctxts;
17931760
17941761 /* Sanity checks passed, now create the new mappings */
1795
- qib_kregbase = ioremap_nocache(qib_physaddr, qib_kreglen);
1762
+ qib_kregbase = ioremap(qib_physaddr, qib_kreglen);
17961763 if (!qib_kregbase)
17971764 goto bail;
17981765
....@@ -1801,7 +1768,7 @@
18011768 goto bail_kregbase;
18021769
18031770 if (qib_userlen) {
1804
- qib_userbase = ioremap_nocache(qib_physaddr + dd->uregbase,
1771
+ qib_userbase = ioremap(qib_physaddr + dd->uregbase,
18051772 qib_userlen);
18061773 if (!qib_userbase)
18071774 goto bail_piobase;