aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/hw/qib/qib_init.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/infiniband/hw/qib/qib_init.c')
-rw-r--r--drivers/infiniband/hw/qib/qib_init.c139
1 files changed, 116 insertions, 23 deletions
diff --git a/drivers/infiniband/hw/qib/qib_init.c b/drivers/infiniband/hw/qib/qib_init.c
index 173f805790da..fdae42973056 100644
--- a/drivers/infiniband/hw/qib/qib_init.c
+++ b/drivers/infiniband/hw/qib/qib_init.c
@@ -39,10 +39,17 @@
39#include <linux/idr.h> 39#include <linux/idr.h>
40#include <linux/module.h> 40#include <linux/module.h>
41#include <linux/printk.h> 41#include <linux/printk.h>
42#ifdef CONFIG_INFINIBAND_QIB_DCA
43#include <linux/dca.h>
44#endif
42 45
43#include "qib.h" 46#include "qib.h"
44#include "qib_common.h" 47#include "qib_common.h"
45#include "qib_mad.h" 48#include "qib_mad.h"
49#ifdef CONFIG_DEBUG_FS
50#include "qib_debugfs.h"
51#include "qib_verbs.h"
52#endif
46 53
47#undef pr_fmt 54#undef pr_fmt
48#define pr_fmt(fmt) QIB_DRV_NAME ": " fmt 55#define pr_fmt(fmt) QIB_DRV_NAME ": " fmt
@@ -64,6 +71,11 @@ ushort qib_cfgctxts;
64module_param_named(cfgctxts, qib_cfgctxts, ushort, S_IRUGO); 71module_param_named(cfgctxts, qib_cfgctxts, ushort, S_IRUGO);
65MODULE_PARM_DESC(cfgctxts, "Set max number of contexts to use"); 72MODULE_PARM_DESC(cfgctxts, "Set max number of contexts to use");
66 73
74unsigned qib_numa_aware;
75module_param_named(numa_aware, qib_numa_aware, uint, S_IRUGO);
76MODULE_PARM_DESC(numa_aware,
77 "0 -> PSM allocation close to HCA, 1 -> PSM allocation local to process");
78
67/* 79/*
68 * If set, do not write to any regs if avoidable, hack to allow 80 * If set, do not write to any regs if avoidable, hack to allow
69 * check for deranged default register values. 81 * check for deranged default register values.
@@ -89,8 +101,6 @@ unsigned qib_wc_pat = 1; /* default (1) is to use PAT, not MTRR */
89module_param_named(wc_pat, qib_wc_pat, uint, S_IRUGO); 101module_param_named(wc_pat, qib_wc_pat, uint, S_IRUGO);
90MODULE_PARM_DESC(wc_pat, "enable write-combining via PAT mechanism"); 102MODULE_PARM_DESC(wc_pat, "enable write-combining via PAT mechanism");
91 103
92struct workqueue_struct *qib_cq_wq;
93
94static void verify_interrupt(unsigned long); 104static void verify_interrupt(unsigned long);
95 105
96static struct idr qib_unit_table; 106static struct idr qib_unit_table;
@@ -121,6 +131,11 @@ int qib_create_ctxts(struct qib_devdata *dd)
121{ 131{
122 unsigned i; 132 unsigned i;
123 int ret; 133 int ret;
134 int local_node_id = pcibus_to_node(dd->pcidev->bus);
135
136 if (local_node_id < 0)
137 local_node_id = numa_node_id();
138 dd->assigned_node_id = local_node_id;
124 139
125 /* 140 /*
126 * Allocate full ctxtcnt array, rather than just cfgctxts, because 141 * Allocate full ctxtcnt array, rather than just cfgctxts, because
@@ -143,7 +158,8 @@ int qib_create_ctxts(struct qib_devdata *dd)
143 continue; 158 continue;
144 159
145 ppd = dd->pport + (i % dd->num_pports); 160 ppd = dd->pport + (i % dd->num_pports);
146 rcd = qib_create_ctxtdata(ppd, i); 161
162 rcd = qib_create_ctxtdata(ppd, i, dd->assigned_node_id);
147 if (!rcd) { 163 if (!rcd) {
148 qib_dev_err(dd, 164 qib_dev_err(dd,
149 "Unable to allocate ctxtdata for Kernel ctxt, failing\n"); 165 "Unable to allocate ctxtdata for Kernel ctxt, failing\n");
@@ -161,20 +177,33 @@ done:
161/* 177/*
162 * Common code for user and kernel context setup. 178 * Common code for user and kernel context setup.
163 */ 179 */
164struct qib_ctxtdata *qib_create_ctxtdata(struct qib_pportdata *ppd, u32 ctxt) 180struct qib_ctxtdata *qib_create_ctxtdata(struct qib_pportdata *ppd, u32 ctxt,
181 int node_id)
165{ 182{
166 struct qib_devdata *dd = ppd->dd; 183 struct qib_devdata *dd = ppd->dd;
167 struct qib_ctxtdata *rcd; 184 struct qib_ctxtdata *rcd;
168 185
169 rcd = kzalloc(sizeof(*rcd), GFP_KERNEL); 186 rcd = kzalloc_node(sizeof(*rcd), GFP_KERNEL, node_id);
170 if (rcd) { 187 if (rcd) {
171 INIT_LIST_HEAD(&rcd->qp_wait_list); 188 INIT_LIST_HEAD(&rcd->qp_wait_list);
189 rcd->node_id = node_id;
172 rcd->ppd = ppd; 190 rcd->ppd = ppd;
173 rcd->dd = dd; 191 rcd->dd = dd;
174 rcd->cnt = 1; 192 rcd->cnt = 1;
175 rcd->ctxt = ctxt; 193 rcd->ctxt = ctxt;
176 dd->rcd[ctxt] = rcd; 194 dd->rcd[ctxt] = rcd;
177 195#ifdef CONFIG_DEBUG_FS
196 if (ctxt < dd->first_user_ctxt) { /* N/A for PSM contexts */
197 rcd->opstats = kzalloc_node(sizeof(*rcd->opstats),
198 GFP_KERNEL, node_id);
199 if (!rcd->opstats) {
200 kfree(rcd);
201 qib_dev_err(dd,
202 "Unable to allocate per ctxt stats buffer\n");
203 return NULL;
204 }
205 }
206#endif
178 dd->f_init_ctxt(rcd); 207 dd->f_init_ctxt(rcd);
179 208
180 /* 209 /*
@@ -429,6 +458,7 @@ static int loadtime_init(struct qib_devdata *dd)
429 dd->intrchk_timer.function = verify_interrupt; 458 dd->intrchk_timer.function = verify_interrupt;
430 dd->intrchk_timer.data = (unsigned long) dd; 459 dd->intrchk_timer.data = (unsigned long) dd;
431 460
461 ret = qib_cq_init(dd);
432done: 462done:
433 return ret; 463 return ret;
434} 464}
@@ -944,6 +974,10 @@ void qib_free_ctxtdata(struct qib_devdata *dd, struct qib_ctxtdata *rcd)
944 vfree(rcd->subctxt_uregbase); 974 vfree(rcd->subctxt_uregbase);
945 vfree(rcd->subctxt_rcvegrbuf); 975 vfree(rcd->subctxt_rcvegrbuf);
946 vfree(rcd->subctxt_rcvhdr_base); 976 vfree(rcd->subctxt_rcvhdr_base);
977#ifdef CONFIG_DEBUG_FS
978 kfree(rcd->opstats);
979 rcd->opstats = NULL;
980#endif
947 kfree(rcd); 981 kfree(rcd);
948} 982}
949 983
@@ -1033,7 +1067,6 @@ done:
1033 dd->f_set_armlaunch(dd, 1); 1067 dd->f_set_armlaunch(dd, 1);
1034} 1068}
1035 1069
1036
1037void qib_free_devdata(struct qib_devdata *dd) 1070void qib_free_devdata(struct qib_devdata *dd)
1038{ 1071{
1039 unsigned long flags; 1072 unsigned long flags;
@@ -1043,6 +1076,9 @@ void qib_free_devdata(struct qib_devdata *dd)
1043 list_del(&dd->list); 1076 list_del(&dd->list);
1044 spin_unlock_irqrestore(&qib_devs_lock, flags); 1077 spin_unlock_irqrestore(&qib_devs_lock, flags);
1045 1078
1079#ifdef CONFIG_DEBUG_FS
1080 qib_dbg_ibdev_exit(&dd->verbs_dev);
1081#endif
1046 ib_dealloc_device(&dd->verbs_dev.ibdev); 1082 ib_dealloc_device(&dd->verbs_dev.ibdev);
1047} 1083}
1048 1084
@@ -1066,6 +1102,10 @@ struct qib_devdata *qib_alloc_devdata(struct pci_dev *pdev, size_t extra)
1066 goto bail; 1102 goto bail;
1067 } 1103 }
1068 1104
1105#ifdef CONFIG_DEBUG_FS
1106 qib_dbg_ibdev_init(&dd->verbs_dev);
1107#endif
1108
1069 idr_preload(GFP_KERNEL); 1109 idr_preload(GFP_KERNEL);
1070 spin_lock_irqsave(&qib_devs_lock, flags); 1110 spin_lock_irqsave(&qib_devs_lock, flags);
1071 1111
@@ -1081,6 +1121,9 @@ struct qib_devdata *qib_alloc_devdata(struct pci_dev *pdev, size_t extra)
1081 if (ret < 0) { 1121 if (ret < 0) {
1082 qib_early_err(&pdev->dev, 1122 qib_early_err(&pdev->dev,
1083 "Could not allocate unit ID: error %d\n", -ret); 1123 "Could not allocate unit ID: error %d\n", -ret);
1124#ifdef CONFIG_DEBUG_FS
1125 qib_dbg_ibdev_exit(&dd->verbs_dev);
1126#endif
1084 ib_dealloc_device(&dd->verbs_dev.ibdev); 1127 ib_dealloc_device(&dd->verbs_dev.ibdev);
1085 dd = ERR_PTR(ret); 1128 dd = ERR_PTR(ret);
1086 goto bail; 1129 goto bail;
@@ -1158,6 +1201,35 @@ struct pci_driver qib_driver = {
1158 .err_handler = &qib_pci_err_handler, 1201 .err_handler = &qib_pci_err_handler,
1159}; 1202};
1160 1203
1204#ifdef CONFIG_INFINIBAND_QIB_DCA
1205
1206static int qib_notify_dca(struct notifier_block *, unsigned long, void *);
1207static struct notifier_block dca_notifier = {
1208 .notifier_call = qib_notify_dca,
1209 .next = NULL,
1210 .priority = 0
1211};
1212
1213static int qib_notify_dca_device(struct device *device, void *data)
1214{
1215 struct qib_devdata *dd = dev_get_drvdata(device);
1216 unsigned long event = *(unsigned long *)data;
1217
1218 return dd->f_notify_dca(dd, event);
1219}
1220
1221static int qib_notify_dca(struct notifier_block *nb, unsigned long event,
1222 void *p)
1223{
1224 int rval;
1225
1226 rval = driver_for_each_device(&qib_driver.driver, NULL,
1227 &event, qib_notify_dca_device);
1228 return rval ? NOTIFY_BAD : NOTIFY_DONE;
1229}
1230
1231#endif
1232
1161/* 1233/*
1162 * Do all the generic driver unit- and chip-independent memory 1234 * Do all the generic driver unit- and chip-independent memory
1163 * allocation and initialization. 1235 * allocation and initialization.
@@ -1170,22 +1242,22 @@ static int __init qlogic_ib_init(void)
1170 if (ret) 1242 if (ret)
1171 goto bail; 1243 goto bail;
1172 1244
1173 qib_cq_wq = create_singlethread_workqueue("qib_cq");
1174 if (!qib_cq_wq) {
1175 ret = -ENOMEM;
1176 goto bail_dev;
1177 }
1178
1179 /* 1245 /*
1180 * These must be called before the driver is registered with 1246 * These must be called before the driver is registered with
1181 * the PCI subsystem. 1247 * the PCI subsystem.
1182 */ 1248 */
1183 idr_init(&qib_unit_table); 1249 idr_init(&qib_unit_table);
1184 1250
1251#ifdef CONFIG_INFINIBAND_QIB_DCA
1252 dca_register_notify(&dca_notifier);
1253#endif
1254#ifdef CONFIG_DEBUG_FS
1255 qib_dbg_init();
1256#endif
1185 ret = pci_register_driver(&qib_driver); 1257 ret = pci_register_driver(&qib_driver);
1186 if (ret < 0) { 1258 if (ret < 0) {
1187 pr_err("Unable to register driver: error %d\n", -ret); 1259 pr_err("Unable to register driver: error %d\n", -ret);
1188 goto bail_unit; 1260 goto bail_dev;
1189 } 1261 }
1190 1262
1191 /* not fatal if it doesn't work */ 1263 /* not fatal if it doesn't work */
@@ -1193,10 +1265,14 @@ static int __init qlogic_ib_init(void)
1193 pr_err("Unable to register ipathfs\n"); 1265 pr_err("Unable to register ipathfs\n");
1194 goto bail; /* all OK */ 1266 goto bail; /* all OK */
1195 1267
1196bail_unit:
1197 idr_destroy(&qib_unit_table);
1198 destroy_workqueue(qib_cq_wq);
1199bail_dev: 1268bail_dev:
1269#ifdef CONFIG_INFINIBAND_QIB_DCA
1270 dca_unregister_notify(&dca_notifier);
1271#endif
1272#ifdef CONFIG_DEBUG_FS
1273 qib_dbg_exit();
1274#endif
1275 idr_destroy(&qib_unit_table);
1200 qib_dev_cleanup(); 1276 qib_dev_cleanup();
1201bail: 1277bail:
1202 return ret; 1278 return ret;
@@ -1217,9 +1293,13 @@ static void __exit qlogic_ib_cleanup(void)
1217 "Unable to cleanup counter filesystem: error %d\n", 1293 "Unable to cleanup counter filesystem: error %d\n",
1218 -ret); 1294 -ret);
1219 1295
1296#ifdef CONFIG_INFINIBAND_QIB_DCA
1297 dca_unregister_notify(&dca_notifier);
1298#endif
1220 pci_unregister_driver(&qib_driver); 1299 pci_unregister_driver(&qib_driver);
1221 1300#ifdef CONFIG_DEBUG_FS
1222 destroy_workqueue(qib_cq_wq); 1301 qib_dbg_exit();
1302#endif
1223 1303
1224 qib_cpulist_count = 0; 1304 qib_cpulist_count = 0;
1225 kfree(qib_cpulist); 1305 kfree(qib_cpulist);
@@ -1311,6 +1391,7 @@ static void cleanup_device_data(struct qib_devdata *dd)
1311 } 1391 }
1312 kfree(tmp); 1392 kfree(tmp);
1313 kfree(dd->boardname); 1393 kfree(dd->boardname);
1394 qib_cq_exit(dd);
1314} 1395}
1315 1396
1316/* 1397/*
@@ -1483,6 +1564,7 @@ static void qib_remove_one(struct pci_dev *pdev)
1483int qib_create_rcvhdrq(struct qib_devdata *dd, struct qib_ctxtdata *rcd) 1564int qib_create_rcvhdrq(struct qib_devdata *dd, struct qib_ctxtdata *rcd)
1484{ 1565{
1485 unsigned amt; 1566 unsigned amt;
1567 int old_node_id;
1486 1568
1487 if (!rcd->rcvhdrq) { 1569 if (!rcd->rcvhdrq) {
1488 dma_addr_t phys_hdrqtail; 1570 dma_addr_t phys_hdrqtail;
@@ -1492,9 +1574,13 @@ int qib_create_rcvhdrq(struct qib_devdata *dd, struct qib_ctxtdata *rcd)
1492 sizeof(u32), PAGE_SIZE); 1574 sizeof(u32), PAGE_SIZE);
1493 gfp_flags = (rcd->ctxt >= dd->first_user_ctxt) ? 1575 gfp_flags = (rcd->ctxt >= dd->first_user_ctxt) ?
1494 GFP_USER : GFP_KERNEL; 1576 GFP_USER : GFP_KERNEL;
1577
1578 old_node_id = dev_to_node(&dd->pcidev->dev);
1579 set_dev_node(&dd->pcidev->dev, rcd->node_id);
1495 rcd->rcvhdrq = dma_alloc_coherent( 1580 rcd->rcvhdrq = dma_alloc_coherent(
1496 &dd->pcidev->dev, amt, &rcd->rcvhdrq_phys, 1581 &dd->pcidev->dev, amt, &rcd->rcvhdrq_phys,
1497 gfp_flags | __GFP_COMP); 1582 gfp_flags | __GFP_COMP);
1583 set_dev_node(&dd->pcidev->dev, old_node_id);
1498 1584
1499 if (!rcd->rcvhdrq) { 1585 if (!rcd->rcvhdrq) {
1500 qib_dev_err(dd, 1586 qib_dev_err(dd,
@@ -1510,9 +1596,11 @@ int qib_create_rcvhdrq(struct qib_devdata *dd, struct qib_ctxtdata *rcd)
1510 } 1596 }
1511 1597
1512 if (!(dd->flags & QIB_NODMA_RTAIL)) { 1598 if (!(dd->flags & QIB_NODMA_RTAIL)) {
1599 set_dev_node(&dd->pcidev->dev, rcd->node_id);
1513 rcd->rcvhdrtail_kvaddr = dma_alloc_coherent( 1600 rcd->rcvhdrtail_kvaddr = dma_alloc_coherent(
1514 &dd->pcidev->dev, PAGE_SIZE, &phys_hdrqtail, 1601 &dd->pcidev->dev, PAGE_SIZE, &phys_hdrqtail,
1515 gfp_flags); 1602 gfp_flags);
1603 set_dev_node(&dd->pcidev->dev, old_node_id);
1516 if (!rcd->rcvhdrtail_kvaddr) 1604 if (!rcd->rcvhdrtail_kvaddr)
1517 goto bail_free; 1605 goto bail_free;
1518 rcd->rcvhdrqtailaddr_phys = phys_hdrqtail; 1606 rcd->rcvhdrqtailaddr_phys = phys_hdrqtail;
@@ -1556,6 +1644,7 @@ int qib_setup_eagerbufs(struct qib_ctxtdata *rcd)
1556 unsigned e, egrcnt, egrperchunk, chunk, egrsize, egroff; 1644 unsigned e, egrcnt, egrperchunk, chunk, egrsize, egroff;
1557 size_t size; 1645 size_t size;
1558 gfp_t gfp_flags; 1646 gfp_t gfp_flags;
1647 int old_node_id;
1559 1648
1560 /* 1649 /*
1561 * GFP_USER, but without GFP_FS, so buffer cache can be 1650 * GFP_USER, but without GFP_FS, so buffer cache can be
@@ -1574,25 +1663,29 @@ int qib_setup_eagerbufs(struct qib_ctxtdata *rcd)
1574 size = rcd->rcvegrbuf_size; 1663 size = rcd->rcvegrbuf_size;
1575 if (!rcd->rcvegrbuf) { 1664 if (!rcd->rcvegrbuf) {
1576 rcd->rcvegrbuf = 1665 rcd->rcvegrbuf =
1577 kzalloc(chunk * sizeof(rcd->rcvegrbuf[0]), 1666 kzalloc_node(chunk * sizeof(rcd->rcvegrbuf[0]),
1578 GFP_KERNEL); 1667 GFP_KERNEL, rcd->node_id);
1579 if (!rcd->rcvegrbuf) 1668 if (!rcd->rcvegrbuf)
1580 goto bail; 1669 goto bail;
1581 } 1670 }
1582 if (!rcd->rcvegrbuf_phys) { 1671 if (!rcd->rcvegrbuf_phys) {
1583 rcd->rcvegrbuf_phys = 1672 rcd->rcvegrbuf_phys =
1584 kmalloc(chunk * sizeof(rcd->rcvegrbuf_phys[0]), 1673 kmalloc_node(chunk * sizeof(rcd->rcvegrbuf_phys[0]),
1585 GFP_KERNEL); 1674 GFP_KERNEL, rcd->node_id);
1586 if (!rcd->rcvegrbuf_phys) 1675 if (!rcd->rcvegrbuf_phys)
1587 goto bail_rcvegrbuf; 1676 goto bail_rcvegrbuf;
1588 } 1677 }
1589 for (e = 0; e < rcd->rcvegrbuf_chunks; e++) { 1678 for (e = 0; e < rcd->rcvegrbuf_chunks; e++) {
1590 if (rcd->rcvegrbuf[e]) 1679 if (rcd->rcvegrbuf[e])
1591 continue; 1680 continue;
1681
1682 old_node_id = dev_to_node(&dd->pcidev->dev);
1683 set_dev_node(&dd->pcidev->dev, rcd->node_id);
1592 rcd->rcvegrbuf[e] = 1684 rcd->rcvegrbuf[e] =
1593 dma_alloc_coherent(&dd->pcidev->dev, size, 1685 dma_alloc_coherent(&dd->pcidev->dev, size,
1594 &rcd->rcvegrbuf_phys[e], 1686 &rcd->rcvegrbuf_phys[e],
1595 gfp_flags); 1687 gfp_flags);
1688 set_dev_node(&dd->pcidev->dev, old_node_id);
1596 if (!rcd->rcvegrbuf[e]) 1689 if (!rcd->rcvegrbuf[e])
1597 goto bail_rcvegrbuf_phys; 1690 goto bail_rcvegrbuf_phys;
1598 } 1691 }