Thomas Bogendoerfer 965830
From: Andrew Boyer <andrew.boyer@dell.com>
Thomas Bogendoerfer 965830
Date: Mon, 28 Aug 2017 16:11:53 -0400
Thomas Bogendoerfer 965830
Subject: IB/rxe: Fix destination cache for IPv6
Thomas Bogendoerfer 965830
Patch-mainline: v4.14-rc1
Thomas Bogendoerfer 965830
Git-commit: b9109b7ddb13a52b379c3e57d9b1d74d7445e94d
Thomas Bogendoerfer 965830
References: bsc#1050662 FATE#323951
Thomas Bogendoerfer 965830
Thomas Bogendoerfer 965830
To successfully match an IPv6 path, the path cookie must match. Store it
Thomas Bogendoerfer 965830
in the QP so that the IPv6 path can be reused.
Thomas Bogendoerfer 965830
Thomas Bogendoerfer 965830
Replace open-coded version of dst_check() with the actual call, fixing the
Thomas Bogendoerfer 965830
logic. The open-coded version skips the check call if dst->obsolete is 0
Thomas Bogendoerfer 965830
(DST_OBSOLETE_NONE), proceeding to replace the route. DST_OBSOLETE_NONE
Thomas Bogendoerfer 965830
means that the route may continue to be used, though.
Thomas Bogendoerfer 965830
Thomas Bogendoerfer 965830
Fixes: 4ed6ad1eb30e ("IB/rxe: Cache dst in QP instead of getting it...")
Thomas Bogendoerfer 965830
Signed-off-by: Andrew Boyer <andrew.boyer@dell.com>
Thomas Bogendoerfer 965830
Signed-off-by: Doug Ledford <dledford@redhat.com>
Thomas Bogendoerfer 965830
Acked-by: Thomas Bogendoerfer <tbogendoerfer@suse.de>
Thomas Bogendoerfer 965830
---
Thomas Bogendoerfer 965830
 drivers/infiniband/sw/rxe/rxe_net.c   |    7 ++++++-
Thomas Bogendoerfer 965830
 drivers/infiniband/sw/rxe/rxe_verbs.h |    1 +
Thomas Bogendoerfer 965830
 2 files changed, 7 insertions(+), 1 deletion(-)
Thomas Bogendoerfer 965830
Thomas Bogendoerfer 965830
--- a/drivers/infiniband/sw/rxe/rxe_net.c
Thomas Bogendoerfer 965830
+++ b/drivers/infiniband/sw/rxe/rxe_net.c
Thomas Bogendoerfer 965830
@@ -191,7 +191,7 @@ static struct dst_entry *rxe_find_route(
Thomas Bogendoerfer 965830
 	if (qp_type(qp) == IB_QPT_RC)
Thomas Bogendoerfer 965830
 		dst = sk_dst_get(qp->sk->sk);
Thomas Bogendoerfer 965830
 
Thomas Bogendoerfer 965830
-	if (!dst || !(dst->obsolete && dst->ops->check(dst, 0))) {
Thomas Bogendoerfer 965830
+	if (!dst || !dst_check(dst, qp->dst_cookie)) {
Thomas Bogendoerfer 965830
 		if (dst)
Thomas Bogendoerfer 965830
 			dst_release(dst);
Thomas Bogendoerfer 965830
 
Thomas Bogendoerfer 965830
@@ -209,6 +209,11 @@ static struct dst_entry *rxe_find_route(
Thomas Bogendoerfer 965830
 			saddr6 = &av->sgid_addr._sockaddr_in6.sin6_addr;
Thomas Bogendoerfer 965830
 			daddr6 = &av->dgid_addr._sockaddr_in6.sin6_addr;
Thomas Bogendoerfer 965830
 			dst = rxe_find_route6(rxe->ndev, saddr6, daddr6);
Thomas Bogendoerfer 965830
+#if IS_ENABLED(CONFIG_IPV6)
Thomas Bogendoerfer 965830
+			if (dst)
Thomas Bogendoerfer 965830
+				qp->dst_cookie =
Thomas Bogendoerfer 965830
+					rt6_get_cookie((struct rt6_info *)dst);
Thomas Bogendoerfer 965830
+#endif
Thomas Bogendoerfer 965830
 		}
Thomas Bogendoerfer 965830
 	}
Thomas Bogendoerfer 965830
 
Thomas Bogendoerfer 965830
--- a/drivers/infiniband/sw/rxe/rxe_verbs.h
Thomas Bogendoerfer 965830
+++ b/drivers/infiniband/sw/rxe/rxe_verbs.h
Thomas Bogendoerfer 965830
@@ -248,6 +248,7 @@ struct rxe_qp {
Thomas Bogendoerfer 965830
 	struct rxe_rq		rq;
Thomas Bogendoerfer 965830
 
Thomas Bogendoerfer 965830
 	struct socket		*sk;
Thomas Bogendoerfer 965830
+	u32			dst_cookie;
Thomas Bogendoerfer 965830
 
Thomas Bogendoerfer 965830
 	struct rxe_av		pri_av;
Thomas Bogendoerfer 965830
 	struct rxe_av		alt_av;