[PATCH 3.14 43/43] IB/mlx4: Saturate RoCE port PMA counters in case of overflow

2015-04-17 Thread Greg Kroah-Hartman
3.14-stable review patch.  If anyone has any objections, please let me know.

--

From: Majd Dibbiny 

commit 61a3855bb726cbb062ef02a31a832dea455456e0 upstream.

For RoCE ports, we set the u32 PMA values based on u64 HCA counters. In case of
overflow, according to the IB spec, we have to saturate a counter to its
max value, do that.

Fixes: c37791349cc7 ('IB/mlx4: Support PMA counters for IBoE')
Signed-off-by: Majd Dibbiny 
Signed-off-by: Eran Ben Elisha 
Signed-off-by: Hadar Hen Zion 
Signed-off-by: Or Gerlitz 
Signed-off-by: David S. Miller 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/infiniband/hw/mlx4/mad.c |   20 
 1 file changed, 16 insertions(+), 4 deletions(-)

--- a/drivers/infiniband/hw/mlx4/mad.c
+++ b/drivers/infiniband/hw/mlx4/mad.c
@@ -64,6 +64,14 @@ enum {
 #define GUID_TBL_BLK_NUM_ENTRIES 8
 #define GUID_TBL_BLK_SIZE (GUID_TBL_ENTRY_SIZE * GUID_TBL_BLK_NUM_ENTRIES)
 
+/* Counters should be saturate once they reach their maximum value */
+#define ASSIGN_32BIT_COUNTER(counter, value) do {\
+   if ((value) > U32_MAX)   \
+   counter = cpu_to_be32(U32_MAX); \
+   else \
+   counter = cpu_to_be32(value);\
+} while (0)
+
 struct mlx4_mad_rcv_buf {
struct ib_grh grh;
u8 payload[256];
@@ -730,10 +738,14 @@ static int ib_process_mad(struct ib_devi
 static void edit_counter(struct mlx4_counter *cnt,
struct ib_pma_portcounters *pma_cnt)
 {
-   pma_cnt->port_xmit_data = cpu_to_be32((be64_to_cpu(cnt->tx_bytes)>>2));
-   pma_cnt->port_rcv_data  = cpu_to_be32((be64_to_cpu(cnt->rx_bytes)>>2));
-   pma_cnt->port_xmit_packets = cpu_to_be32(be64_to_cpu(cnt->tx_frames));
-   pma_cnt->port_rcv_packets  = cpu_to_be32(be64_to_cpu(cnt->rx_frames));
+   ASSIGN_32BIT_COUNTER(pma_cnt->port_xmit_data,
+(be64_to_cpu(cnt->tx_bytes) >> 2));
+   ASSIGN_32BIT_COUNTER(pma_cnt->port_rcv_data,
+(be64_to_cpu(cnt->rx_bytes) >> 2));
+   ASSIGN_32BIT_COUNTER(pma_cnt->port_xmit_packets,
+be64_to_cpu(cnt->tx_frames));
+   ASSIGN_32BIT_COUNTER(pma_cnt->port_rcv_packets,
+be64_to_cpu(cnt->rx_frames));
 }
 
 static int iboe_process_mad(struct ib_device *ibdev, int mad_flags, u8 
port_num,


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 3.14 43/43] IB/mlx4: Saturate RoCE port PMA counters in case of overflow

2015-04-17 Thread Greg Kroah-Hartman
3.14-stable review patch.  If anyone has any objections, please let me know.

--

From: Majd Dibbiny m...@mellanox.com

commit 61a3855bb726cbb062ef02a31a832dea455456e0 upstream.

For RoCE ports, we set the u32 PMA values based on u64 HCA counters. In case of
overflow, according to the IB spec, we have to saturate a counter to its
max value, do that.

Fixes: c37791349cc7 ('IB/mlx4: Support PMA counters for IBoE')
Signed-off-by: Majd Dibbiny m...@mellanox.com
Signed-off-by: Eran Ben Elisha era...@mellanox.com
Signed-off-by: Hadar Hen Zion had...@mellanox.com
Signed-off-by: Or Gerlitz ogerl...@mellanox.com
Signed-off-by: David S. Miller da...@davemloft.net
Signed-off-by: Greg Kroah-Hartman gre...@linuxfoundation.org

---
 drivers/infiniband/hw/mlx4/mad.c |   20 
 1 file changed, 16 insertions(+), 4 deletions(-)

--- a/drivers/infiniband/hw/mlx4/mad.c
+++ b/drivers/infiniband/hw/mlx4/mad.c
@@ -64,6 +64,14 @@ enum {
 #define GUID_TBL_BLK_NUM_ENTRIES 8
 #define GUID_TBL_BLK_SIZE (GUID_TBL_ENTRY_SIZE * GUID_TBL_BLK_NUM_ENTRIES)
 
+/* Counters should be saturate once they reach their maximum value */
+#define ASSIGN_32BIT_COUNTER(counter, value) do {\
+   if ((value)  U32_MAX)   \
+   counter = cpu_to_be32(U32_MAX); \
+   else \
+   counter = cpu_to_be32(value);\
+} while (0)
+
 struct mlx4_mad_rcv_buf {
struct ib_grh grh;
u8 payload[256];
@@ -730,10 +738,14 @@ static int ib_process_mad(struct ib_devi
 static void edit_counter(struct mlx4_counter *cnt,
struct ib_pma_portcounters *pma_cnt)
 {
-   pma_cnt-port_xmit_data = cpu_to_be32((be64_to_cpu(cnt-tx_bytes)2));
-   pma_cnt-port_rcv_data  = cpu_to_be32((be64_to_cpu(cnt-rx_bytes)2));
-   pma_cnt-port_xmit_packets = cpu_to_be32(be64_to_cpu(cnt-tx_frames));
-   pma_cnt-port_rcv_packets  = cpu_to_be32(be64_to_cpu(cnt-rx_frames));
+   ASSIGN_32BIT_COUNTER(pma_cnt-port_xmit_data,
+(be64_to_cpu(cnt-tx_bytes)  2));
+   ASSIGN_32BIT_COUNTER(pma_cnt-port_rcv_data,
+(be64_to_cpu(cnt-rx_bytes)  2));
+   ASSIGN_32BIT_COUNTER(pma_cnt-port_xmit_packets,
+be64_to_cpu(cnt-tx_frames));
+   ASSIGN_32BIT_COUNTER(pma_cnt-port_rcv_packets,
+be64_to_cpu(cnt-rx_frames));
 }
 
 static int iboe_process_mad(struct ib_device *ibdev, int mad_flags, u8 
port_num,


--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/