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:
Родитель
d45d29567f
Коммит
b9109b7ddb
|
@ -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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче