aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/hw/qib/qib_init.c
diff options
context:
space:
mode:
authorMike Marciniszyn <mike.marciniszyn@intel.com>2013-06-15 17:07:03 -0400
committerRoland Dreier <roland@purestorage.com>2013-06-21 20:19:50 -0400
commitddb8876589702a9396d15d9d4075e6388d0600cf (patch)
treebd6f63590a238c2eec2706033b9cf15c14e12c7b /drivers/infiniband/hw/qib/qib_init.c
parent85caafe307a06e4f9993c8f3c994a07374c07831 (diff)
IB/qib: Convert opcode counters to per-context
This fix changes the opcode relative counters for receive to per context. Profiling has shown that when mulitple contexts are being used there is a lot of cache activity associated with these counters. The code formerly kept these counters per port, but only provided the interface to read per HCA. This patch converts the read of counters to per HCA and adds the debugfs hooks to be able to read the file as a sequence of opcodes. Reviewed-by: Dean Luick <dean.luick@intel.com> Signed-off-by: Mike Marciniszyn <mike.marciniszyn@intel.com> Signed-off-by: Roland Dreier <roland@purestorage.com>
Diffstat (limited to 'drivers/infiniband/hw/qib/qib_init.c')
-rw-r--r--drivers/infiniband/hw/qib/qib_init.c41
1 files changed, 39 insertions, 2 deletions
diff --git a/drivers/infiniband/hw/qib/qib_init.c b/drivers/infiniband/hw/qib/qib_init.c
index ff36903474ea..fdae42973056 100644
--- a/drivers/infiniband/hw/qib/qib_init.c
+++ b/drivers/infiniband/hw/qib/qib_init.c
@@ -46,6 +46,10 @@
46#include "qib.h" 46#include "qib.h"
47#include "qib_common.h" 47#include "qib_common.h"
48#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
49 53
50#undef pr_fmt 54#undef pr_fmt
51#define pr_fmt(fmt) QIB_DRV_NAME ": " fmt 55#define pr_fmt(fmt) QIB_DRV_NAME ": " fmt
@@ -188,7 +192,18 @@ struct qib_ctxtdata *qib_create_ctxtdata(struct qib_pportdata *ppd, u32 ctxt,
188 rcd->cnt = 1; 192 rcd->cnt = 1;
189 rcd->ctxt = ctxt; 193 rcd->ctxt = ctxt;
190 dd->rcd[ctxt] = rcd; 194 dd->rcd[ctxt] = rcd;
191 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
192 dd->f_init_ctxt(rcd); 207 dd->f_init_ctxt(rcd);
193 208
194 /* 209 /*
@@ -959,6 +974,10 @@ void qib_free_ctxtdata(struct qib_devdata *dd, struct qib_ctxtdata *rcd)
959 vfree(rcd->subctxt_uregbase); 974 vfree(rcd->subctxt_uregbase);
960 vfree(rcd->subctxt_rcvegrbuf); 975 vfree(rcd->subctxt_rcvegrbuf);
961 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
962 kfree(rcd); 981 kfree(rcd);
963} 982}
964 983
@@ -1048,7 +1067,6 @@ done:
1048 dd->f_set_armlaunch(dd, 1); 1067 dd->f_set_armlaunch(dd, 1);
1049} 1068}
1050 1069
1051
1052void qib_free_devdata(struct qib_devdata *dd) 1070void qib_free_devdata(struct qib_devdata *dd)
1053{ 1071{
1054 unsigned long flags; 1072 unsigned long flags;
@@ -1058,6 +1076,9 @@ void qib_free_devdata(struct qib_devdata *dd)
1058 list_del(&dd->list); 1076 list_del(&dd->list);
1059 spin_unlock_irqrestore(&qib_devs_lock, flags); 1077 spin_unlock_irqrestore(&qib_devs_lock, flags);
1060 1078
1079#ifdef CONFIG_DEBUG_FS
1080 qib_dbg_ibdev_exit(&dd->verbs_dev);
1081#endif
1061 ib_dealloc_device(&dd->verbs_dev.ibdev); 1082 ib_dealloc_device(&dd->verbs_dev.ibdev);
1062} 1083}
1063 1084
@@ -1081,6 +1102,10 @@ struct qib_devdata *qib_alloc_devdata(struct pci_dev *pdev, size_t extra)
1081 goto bail; 1102 goto bail;
1082 } 1103 }
1083 1104
1105#ifdef CONFIG_DEBUG_FS
1106 qib_dbg_ibdev_init(&dd->verbs_dev);
1107#endif
1108
1084 idr_preload(GFP_KERNEL); 1109 idr_preload(GFP_KERNEL);
1085 spin_lock_irqsave(&qib_devs_lock, flags); 1110 spin_lock_irqsave(&qib_devs_lock, flags);
1086 1111
@@ -1096,6 +1121,9 @@ struct qib_devdata *qib_alloc_devdata(struct pci_dev *pdev, size_t extra)
1096 if (ret < 0) { 1121 if (ret < 0) {
1097 qib_early_err(&pdev->dev, 1122 qib_early_err(&pdev->dev,
1098 "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
1099 ib_dealloc_device(&dd->verbs_dev.ibdev); 1127 ib_dealloc_device(&dd->verbs_dev.ibdev);
1100 dd = ERR_PTR(ret); 1128 dd = ERR_PTR(ret);
1101 goto bail; 1129 goto bail;
@@ -1223,6 +1251,9 @@ static int __init qlogic_ib_init(void)
1223#ifdef CONFIG_INFINIBAND_QIB_DCA 1251#ifdef CONFIG_INFINIBAND_QIB_DCA
1224 dca_register_notify(&dca_notifier); 1252 dca_register_notify(&dca_notifier);
1225#endif 1253#endif
1254#ifdef CONFIG_DEBUG_FS
1255 qib_dbg_init();
1256#endif
1226 ret = pci_register_driver(&qib_driver); 1257 ret = pci_register_driver(&qib_driver);
1227 if (ret < 0) { 1258 if (ret < 0) {
1228 pr_err("Unable to register driver: error %d\n", -ret); 1259 pr_err("Unable to register driver: error %d\n", -ret);
@@ -1238,6 +1269,9 @@ bail_dev:
1238#ifdef CONFIG_INFINIBAND_QIB_DCA 1269#ifdef CONFIG_INFINIBAND_QIB_DCA
1239 dca_unregister_notify(&dca_notifier); 1270 dca_unregister_notify(&dca_notifier);
1240#endif 1271#endif
1272#ifdef CONFIG_DEBUG_FS
1273 qib_dbg_exit();
1274#endif
1241 idr_destroy(&qib_unit_table); 1275 idr_destroy(&qib_unit_table);
1242 qib_dev_cleanup(); 1276 qib_dev_cleanup();
1243bail: 1277bail:
@@ -1263,6 +1297,9 @@ static void __exit qlogic_ib_cleanup(void)
1263 dca_unregister_notify(&dca_notifier); 1297 dca_unregister_notify(&dca_notifier);
1264#endif 1298#endif
1265 pci_unregister_driver(&qib_driver); 1299 pci_unregister_driver(&qib_driver);
1300#ifdef CONFIG_DEBUG_FS
1301 qib_dbg_exit();
1302#endif
1266 1303
1267 qib_cpulist_count = 0; 1304 qib_cpulist_count = 0;
1268 kfree(qib_cpulist); 1305 kfree(qib_cpulist);