IB/rxe: Fix destination cache for IPv6

To successfully match an IPv6 path, the path cookie must match. Store it
in the QP so that the IPv6 path can be reused.

Replace open-coded version of dst_check() with the actual call, fixing the
logic. The open-coded version skips the check call if dst->obsolete is 0
(DST_OBSOLETE_NONE), proceeding to replace the route. DST_OBSOLETE_NONE
means that the route may continue to be used, though.

Fixes: 4ed6ad1eb3 ("IB/rxe: Cache dst in QP instead of getting it...")
Signed-off-by: Andrew Boyer <andrew.boyer@dell.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:
Andrew Boyer 2017-08-28 16:11:53 -04:00 коммит произвёл Doug Ledford
Родитель d45d29567f
Коммит b9109b7ddb
2 изменённых файлов: 7 добавлений и 1 удалений

Просмотреть файл

@ -191,7 +191,7 @@ static struct dst_entry *rxe_find_route(struct rxe_dev *rxe,
if (qp_type(qp) == IB_QPT_RC)
dst = sk_dst_get(qp->sk->sk);
if (!dst || !(dst->obsolete && dst->ops->check(dst, 0))) {
if (!dst || !dst_check(dst, qp->dst_cookie)) {
if (dst)
dst_release(dst);
@ -209,6 +209,11 @@ static struct dst_entry *rxe_find_route(struct rxe_dev *rxe,
saddr6 = &av->sgid_addr._sockaddr_in6.sin6_addr;
daddr6 = &av->dgid_addr._sockaddr_in6.sin6_addr;
dst = rxe_find_route6(rxe->ndev, saddr6, daddr6);
#if IS_ENABLED(CONFIG_IPV6)
if (dst)
qp->dst_cookie =
rt6_get_cookie((struct rt6_info *)dst);
#endif
}
}

Просмотреть файл

@ -248,6 +248,7 @@ struct rxe_qp {
struct rxe_rq rq;
struct socket *sk;
u32 dst_cookie;
struct rxe_av pri_av;
struct rxe_av alt_av;