|
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;
|