summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDean Luick <dean.luick@intel.com>2016-02-18 19:12:08 (GMT)
committerDoug Ledford <dledford@redhat.com>2016-03-11 01:45:43 (GMT)
commit4c9e7aacb6a6334168a81b83819fb5cb088d2fb3 (patch)
treec91e46bc9ccc4ddc2db104c16e5bc48f5aeaa217
parent6b5c5213e57453c228f7695d5d889aa4c84272c3 (diff)
downloadlinux-4c9e7aacb6a6334168a81b83819fb5cb088d2fb3.tar.xz
staging/rdma/hfi1: Fix xmit discard error weight
Count only the errors that apply to xmit discards. Update the comment to better explain the limitations of the count. Reviewed-by: Dennis Dalessandro <dennis.dalessandro@intel.com> Signed-off-by: Dean Luick <dean.luick@intel.com> Signed-off-by: Jubin John <jubin.john@intel.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
-rw-r--r--drivers/staging/rdma/hfi1/chip.c26
1 files changed, 21 insertions, 5 deletions
diff --git a/drivers/staging/rdma/hfi1/chip.c b/drivers/staging/rdma/hfi1/chip.c
index 93bf465..6e44d52 100644
--- a/drivers/staging/rdma/hfi1/chip.c
+++ b/drivers/staging/rdma/hfi1/chip.c
@@ -5566,12 +5566,28 @@ static void handle_send_egress_err_info(struct hfi1_devdata *dd,
int weight, i;
/*
- * Count all, in case multiple bits are set. Reminder:
- * since there is only one info register for many sources,
- * these may be attributed to the wrong VL if they occur
- * too close together.
+ * Count all applicable bits as individual errors and
+ * attribute them to the packet that triggered this handler.
+ * This may not be completely accurate due to limitations
+ * on the available hardware error information. There is
+ * a single information register and any number of error
+ * packets may have occurred and contributed to it before
+ * this routine is called. This means that:
+ * a) If multiple packets with the same error occur before
+ * this routine is called, earlier packets are missed.
+ * There is only a single bit for each error type.
+ * b) Errors may not be attributed to the correct VL.
+ * The driver is attributing all bits in the info register
+ * to the packet that triggered this call, but bits
+ * could be an accumulation of different packets with
+ * different VLs.
+ * c) A single error packet may have multiple counts attached
+ * to it. There is no way for the driver to know if
+ * multiple bits set in the info register are due to a
+ * single packet or multiple packets. The driver assumes
+ * multiple packets.
*/
- weight = hweight64(info);
+ weight = hweight64(info & PORT_DISCARD_EGRESS_ERRS);
for (i = 0; i < weight; i++) {
__count_port_discards(ppd);
if (vl >= 0 && vl < TXE_NUM_DATA_VL)