diff options
author | Mike Marciniszyn <mike.marciniszyn@intel.com> | 2013-06-15 17:07:03 -0400 |
---|---|---|
committer | Roland Dreier <roland@purestorage.com> | 2013-06-21 20:19:50 -0400 |
commit | ddb8876589702a9396d15d9d4075e6388d0600cf (patch) | |
tree | bd6f63590a238c2eec2706033b9cf15c14e12c7b /drivers/infiniband/hw/qib/qib_init.c | |
parent | 85caafe307a06e4f9993c8f3c994a07374c07831 (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.c | 41 |
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 | |||
1052 | void qib_free_devdata(struct qib_devdata *dd) | 1070 | void 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(); |
1243 | bail: | 1277 | bail: |
@@ -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); |