* [PATCH net-next v2 0/2] seg6: skip route refcounts in seg6local lookups
@ 2026-10-10 10:10 Yuya Kusakabe
2026-10-10 10:10 ` [PATCH net-next v2 1/2] seg6: skip the route refcount in seg6local IPv6 lookups Yuya Kusakabe
2026-10-10 10:10 ` [PATCH net-next v2 2/2] seg6: skip the route refcount in seg6local IPv4 lookups Yuya Kusakabe
0 siblings, 2 replies; 7+ messages in thread
From: Yuya Kusakabe @ 2026-10-10 10:10 UTC (permalink / raw)
To: Andrea Mayer, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Simon Horman
Cc: netdev, linux-kernel, Yuya Kusakabe
seg6local looks up the nexthop of its IPv6 and IPv4 behaviors from the
RCU read-side section of the receive path, yet takes and drops a route
reference for every packet. Skip the reference, as ip6_route_input()
and ip_rcv_finish() do.
---
Changes in v2:
- Split the lookup into a noref primitive for the seg6local input
actions and a refcounted seg6_lookup_nexthop() wrapper, which the BPF
LWT helpers also call (Andrea Mayer, Sashiko).
- Rebase onto net-next and re-measure.
- Link to v1: https://patch.msgid.link/20261005-seg6-lookup-noref-v1-0-092e84774e80@gmail.com
---
Yuya Kusakabe (2):
seg6: skip the route refcount in seg6local IPv6 lookups
seg6: skip the route refcount in seg6local IPv4 lookups
net/ipv6/seg6_local.c | 58 +++++++++++++++++++++++++++++++++++++--------------
1 file changed, 42 insertions(+), 16 deletions(-)
---
base-commit: 758fe10f83a655bed0f7b98fcfacdfc3556fb9a1
change-id: 20261004-seg6-lookup-noref-e016495b60ed
Best regards,
--
Yuya Kusakabe <yuya.kusakabe@gmail.com>
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH net-next v2 1/2] seg6: skip the route refcount in seg6local IPv6 lookups
2026-10-10 10:10 [PATCH net-next v2 0/2] seg6: skip route refcounts in seg6local lookups Yuya Kusakabe
@ 2026-10-10 10:10 ` Yuya Kusakabe
2026-10-13 23:58 ` Andrea Mayer
2026-10-15 14:30 ` Gabriel Goller
2026-10-10 10:10 ` [PATCH net-next v2 2/2] seg6: skip the route refcount in seg6local IPv4 lookups Yuya Kusakabe
1 sibling, 2 replies; 7+ messages in thread
From: Yuya Kusakabe @ 2026-10-10 10:10 UTC (permalink / raw)
To: Andrea Mayer, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Simon Horman
Cc: netdev, linux-kernel, Yuya Kusakabe
ip6_route_input() attaches the input route to the skb without taking a
reference, relying on the RCU read-side section of the receive path.
The seg6local input actions run in that same section, either directly
from the seg6local input handler or from a netfilter okfn, yet
seg6_lookup_any_nexthop() takes and drops a route reference for every
packet.
Look the route up with RT6_LOOKUP_F_DST_NOREF, as ip6_route_input()
does, for the input and table lookups of those actions. Keep
seg6_lookup_nexthop(), which the BPF LWT helpers also call, refcounted:
BPF_PROG_TEST_RUN runs them repeatedly on the same skb and may leave
the RCU read-side section between runs. Like ip6_route_output_flags(),
it now takes the reference on top of the noref lookup.
Throughput at 0.5% packet loss of 94-byte End packets (two-segment
SRH, no payload), spread by RSS on an ixgbe 82599ES across two 2.30 GHz
Xeon E5-2650 v3 with 10 cores each, offered by TRex and binary-searched
over 10 runs of 10 s, in Mpps:
queues cores before after
1 1 0.740 0.756 (+2.2%)
10 10 on the NIC's socket 6.404 6.950 (+8.5%)
16 10 + 6 on two sockets 6.550 10.124 (+54.6%)
With the default rules, fib6_rule_lookup() tries the local table
first, and the miss takes and drops a reference on ip6_null_entry,
one route shared by every CPU. At 16 queues that cache line bounces
between the sockets, and ip6_hold_safe() and dst_release() together
take about a third of the cycles.
Assisted-by: LLM
Signed-off-by: Yuya Kusakabe <yuya.kusakabe@gmail.com>
---
net/ipv6/seg6_local.c | 54 ++++++++++++++++++++++++++++++++++++++-------------
1 file changed, 40 insertions(+), 14 deletions(-)
diff --git a/net/ipv6/seg6_local.c b/net/ipv6/seg6_local.c
index 0c3d1be7f129..f23330278922 100644
--- a/net/ipv6/seg6_local.c
+++ b/net/ipv6/seg6_local.c
@@ -318,8 +318,8 @@ static struct ipv6_sr_hdr *advance_nextseg(struct sk_buff *skb,
}
static int
-seg6_lookup_any_nexthop(struct sk_buff *skb, struct in6_addr *nhaddr,
- u32 tbl_id, bool local_delivery, int oif)
+seg6_lookup_any_nexthop_noref(struct sk_buff *skb, struct in6_addr *nhaddr,
+ u32 tbl_id, bool local_delivery, int oif)
{
struct net *net = dev_net(skb->dev);
struct ipv6hdr *hdr = ipv6_hdr(skb);
@@ -342,6 +342,7 @@ seg6_lookup_any_nexthop(struct sk_buff *skb, struct in6_addr *nhaddr,
fl6.flowi6_flags = FLOWI_FLAG_KNOWN_NH;
if (!tbl_id && !oif) {
+ flags |= RT6_LOOKUP_F_DST_NOREF;
dst = ip6_route_input_lookup(net, skb->dev, &fl6, skb, flags);
} else if (tbl_id) {
struct fib6_table *table;
@@ -350,6 +351,7 @@ seg6_lookup_any_nexthop(struct sk_buff *skb, struct in6_addr *nhaddr,
if (!table)
goto out;
+ flags |= RT6_LOOKUP_F_DST_NOREF;
rt = ip6_pol_route(net, table, oif, &fl6, skb, flags);
dst = &rt->dst;
} else {
@@ -363,7 +365,7 @@ seg6_lookup_any_nexthop(struct sk_buff *skb, struct in6_addr *nhaddr,
dev_flags |= IFF_LOOPBACK;
if (dst && (dst_dev(dst)->flags & dev_flags) && !dst->error) {
- dst_release(dst);
+ ip6_rt_put_flags(dst_rt6_info(dst), flags);
dst = NULL;
}
@@ -372,17 +374,41 @@ seg6_lookup_any_nexthop(struct sk_buff *skb, struct in6_addr *nhaddr,
rt = net->ipv6.ip6_blk_hole_entry;
dst = &rt->dst;
dst_hold(dst);
+ flags &= ~RT6_LOOKUP_F_DST_NOREF;
}
skb_dst_drop(skb);
- skb_dst_set(skb, dst);
+ if ((flags & RT6_LOOKUP_F_DST_NOREF) && !dst->rt_uncached_list)
+ skb_dst_set_noref(skb, dst);
+ else
+ skb_dst_set(skb, dst);
return dst->error;
}
+static int seg6_lookup_nexthop_noref(struct sk_buff *skb,
+ struct in6_addr *nhaddr, u32 tbl_id)
+{
+ return seg6_lookup_any_nexthop_noref(skb, nhaddr, tbl_id, false, 0);
+}
+
int seg6_lookup_nexthop(struct sk_buff *skb,
struct in6_addr *nhaddr, u32 tbl_id)
{
- return seg6_lookup_any_nexthop(skb, nhaddr, tbl_id, false, 0);
+ int err;
+
+ rcu_read_lock();
+ err = seg6_lookup_nexthop_noref(skb, nhaddr, tbl_id);
+ if (!skb_dst_force(skb)) {
+ struct dst_entry *dst;
+
+ dst = &dev_net(skb->dev)->ipv6.ip6_blk_hole_entry->dst;
+ dst_hold(dst);
+ skb_dst_set(skb, dst);
+ err = dst->error;
+ }
+ rcu_read_unlock();
+
+ return err;
}
static __u8 seg6_flv_lcblock_octects(const struct seg6_flavors_info *finfo)
@@ -446,7 +472,7 @@ seg6_next_csid_advance_arg(struct sk_buff *skb,
static int input_action_end_finish(struct sk_buff *skb,
struct seg6_local_lwt *slwt)
{
- seg6_lookup_nexthop(skb, NULL, 0);
+ seg6_lookup_nexthop_noref(skb, NULL, 0);
return dst_input(skb);
}
@@ -497,7 +523,7 @@ static int end_next_csid_core(struct sk_buff *skb, struct seg6_local_lwt *slwt)
static int input_action_end_x_finish(struct sk_buff *skb,
struct seg6_local_lwt *slwt)
{
- seg6_lookup_any_nexthop(skb, &slwt->nh6, 0, false, slwt->oif);
+ seg6_lookup_any_nexthop_noref(skb, &slwt->nh6, 0, false, slwt->oif);
return dst_input(skb);
}
@@ -939,7 +965,7 @@ static int input_action_end_t(struct sk_buff *skb, struct seg6_local_lwt *slwt)
goto drop;
}
- seg6_lookup_nexthop(skb, NULL, slwt->table);
+ seg6_lookup_nexthop_noref(skb, NULL, slwt->table);
return dst_input(skb);
@@ -1023,7 +1049,7 @@ static int input_action_end_dx6_finish(struct net *net, struct sock *sk,
if (!ipv6_addr_any(&slwt->nh6))
nhaddr = &slwt->nh6;
- seg6_lookup_nexthop(skb, nhaddr, 0);
+ seg6_lookup_nexthop_noref(skb, nhaddr, 0);
return dst_input(skb);
}
@@ -1383,7 +1409,7 @@ static int input_action_end_dt6(struct sk_buff *skb,
/* note: this time we do not need to specify the table because the VRF
* takes care of selecting the correct table.
*/
- seg6_lookup_any_nexthop(skb, NULL, 0, true, 0);
+ seg6_lookup_any_nexthop_noref(skb, NULL, 0, true, 0);
return dst_input(skb);
@@ -1391,7 +1417,7 @@ static int input_action_end_dt6(struct sk_buff *skb,
#endif
skb_set_transport_header(skb, sizeof(struct ipv6hdr));
- seg6_lookup_any_nexthop(skb, NULL, slwt->table, true, 0);
+ seg6_lookup_any_nexthop_noref(skb, NULL, slwt->table, true, 0);
return dst_input(skb);
@@ -1446,7 +1472,7 @@ static int input_action_end_b6(struct sk_buff *skb, struct seg6_local_lwt *slwt)
skb_set_transport_header(skb, sizeof(struct ipv6hdr));
- seg6_lookup_nexthop(skb, NULL, 0);
+ seg6_lookup_nexthop_noref(skb, NULL, 0);
return dst_input(skb);
@@ -1482,7 +1508,7 @@ static int input_action_end_b6_encap(struct sk_buff *skb,
skb_set_transport_header(skb, sizeof(struct ipv6hdr));
- seg6_lookup_nexthop(skb, NULL, 0);
+ seg6_lookup_nexthop_noref(skb, NULL, 0);
return dst_input(skb);
@@ -1571,7 +1597,7 @@ static int input_action_end_bpf(struct sk_buff *skb,
local_unlock_nested_bh(&seg6_bpf_srh_states.bh_lock);
if (ret != BPF_REDIRECT)
- seg6_lookup_nexthop(skb, NULL, 0);
+ seg6_lookup_nexthop_noref(skb, NULL, 0);
return dst_input(skb);
--
2.50.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH net-next v2 2/2] seg6: skip the route refcount in seg6local IPv4 lookups
2026-10-10 10:10 [PATCH net-next v2 0/2] seg6: skip route refcounts in seg6local lookups Yuya Kusakabe
2026-10-10 10:10 ` [PATCH net-next v2 1/2] seg6: skip the route refcount in seg6local IPv6 lookups Yuya Kusakabe
@ 2026-10-10 10:10 ` Yuya Kusakabe
1 sibling, 0 replies; 7+ messages in thread
From: Yuya Kusakabe @ 2026-10-10 10:10 UTC (permalink / raw)
To: Andrea Mayer, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Simon Horman
Cc: netdev, linux-kernel, Yuya Kusakabe
ip_route_input() looks the input route up with ip_route_input_noref()
and then forces a reference on it, which is dropped again when the
packet is transmitted. End.DX4 and End.DT4 call it from the RCU
read-side section of the receive path, either directly from the
seg6local input handler or from a netfilter okfn, and hand the skb to
dst_input() before leaving that section.
Use ip_route_input_noref(), as ip_rcv_finish() does.
Throughput at 0.5% packet loss of 82-byte IPv4-in-IPv6 UDP packets
(no SRH), spread by RSS on an ixgbe 82599ES across two 10-core Xeon
E5-2650 v3, offered by TRex over 10 runs of 10 s, in Mpps:
End.DX4
queues cores before after
1 1 0.791 0.811 (+2.5%)
10 10 on the NIC's socket 6.118 7.394 (+20.9%)
16 10 + 6 on two sockets 3.305 10.205 (+208.8%)
End.DT4
queues cores before after
1 1 0.481 0.489 (+1.6%)
10 10 on the NIC's socket 4.328 4.588 (+6.0%)
16 10 + 6 on two sockets 3.351 7.153 (+113.5%)
Every CPU takes and drops a reference on the same input route, the
one cached on the nexthop. At 16 queues that cache line bounces
between the sockets, and skb_dst_force() and dst_release() together
take more than half of the cycles for End.DX4 and over 40% for End.DT4.
Assisted-by: LLM
Signed-off-by: Yuya Kusakabe <yuya.kusakabe@gmail.com>
---
net/ipv6/seg6_local.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/net/ipv6/seg6_local.c b/net/ipv6/seg6_local.c
index f23330278922..60abd139dbe3 100644
--- a/net/ipv6/seg6_local.c
+++ b/net/ipv6/seg6_local.c
@@ -1099,7 +1099,7 @@ static int input_action_end_dx4_finish(struct net *net, struct sock *sk,
skb_dst_drop(skb);
- reason = ip_route_input(skb, nhaddr, iph->saddr, 0, skb->dev);
+ reason = ip_route_input_noref(skb, nhaddr, iph->saddr, 0, skb->dev);
if (reason) {
kfree_skb_reason(skb, reason);
return -EINVAL;
@@ -1325,7 +1325,7 @@ static int input_action_end_dt4(struct sk_buff *skb,
iph = ip_hdr(skb);
- reason = ip_route_input(skb, iph->daddr, iph->saddr, 0, skb->dev);
+ reason = ip_route_input_noref(skb, iph->daddr, iph->saddr, 0, skb->dev);
if (unlikely(reason))
goto drop;
--
2.50.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH net-next v2 1/2] seg6: skip the route refcount in seg6local IPv6 lookups
2026-10-10 10:10 ` [PATCH net-next v2 1/2] seg6: skip the route refcount in seg6local IPv6 lookups Yuya Kusakabe
@ 2026-10-13 23:58 ` Andrea Mayer
2026-10-15 14:31 ` Yuya Kusakabe
2026-10-15 14:30 ` Gabriel Goller
1 sibling, 1 reply; 7+ messages in thread
From: Andrea Mayer @ 2026-10-13 23:58 UTC (permalink / raw)
To: Yuya Kusakabe
Cc: David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Simon Horman, netdev, linux-kernel, Andrea Mayer
On Sat, 10 Oct 2026 19:10:39 +0900
Yuya Kusakabe <yuya.kusakabe@gmail.com> wrote:
Hi Yuya,
Thanks for v2. I re-ran the BPF_PROG_TEST_RUN case from v1 on 32-bit ARM
with the changes of v2, and I could not reproduce the use-after-free
anymore.
> ip6_route_input() attaches the input route to the skb without taking a
> reference, relying on the RCU read-side section of the receive path.
> The seg6local input actions run in that same section, either directly
> from the seg6local input handler or from a netfilter okfn, yet
> seg6_lookup_any_nexthop() takes and drops a route reference for every
> packet.
For a packet queued with NFQUEUE, the okfn runs later from nf_reinject(),
under the rcu_read_lock() of the nfnetlink verdict handler. Is "that same
section" accurate for that case?
> [snip]
> if (!tbl_id && !oif) {
> + flags |= RT6_LOOKUP_F_DST_NOREF;
> dst = ip6_route_input_lookup(net, skb->dev, &fl6, skb, flags);
> [snip]
> + flags |= RT6_LOOKUP_F_DST_NOREF;
> rt = ip6_pol_route(net, table, oif, &fl6, skb, flags);
With RT6_LOOKUP_F_DST_NOREF, ip6_pol_route() no longer calls
ip6_hold_safe(). If the route it finds is released on another CPU during
the lookup, the packet can be dropped without an ICMP error. Before the
series, when ip6_hold_safe() did not get the reference on the released
route, the packet went to the next policy rule, or to ip6_null_entry and
its ICMPv6 Destination Unreachable. As far as I can see, only packets that
race with the release are affected. It is still a change in behavior, and
it would be worth at least mentioning it in the commit message.
> [snip]
> int seg6_lookup_nexthop(struct sk_buff *skb,
> struct in6_addr *nhaddr, u32 tbl_id)
> {
> - return seg6_lookup_any_nexthop(skb, nhaddr, tbl_id, false, 0);
> + int err;
> +
> + rcu_read_lock();
> + err = seg6_lookup_nexthop_noref(skb, nhaddr, tbl_id);
> + if (!skb_dst_force(skb)) {
> + struct dst_entry *dst;
> +
> + dst = &dev_net(skb->dev)->ipv6.ip6_blk_hole_entry->dst;
> + dst_hold(dst);
> + skb_dst_set(skb, dst);
> + err = dst->error;
> + }
> + rcu_read_unlock();
> +
> + return err;
> }
The split works, and the contract is now in the names. One detail is how
seg6_lookup_nexthop() takes its reference: after the noref lookup, with
skb_dst_force(). Because of this, the BPF LWT helpers are affected by this
race too. Before the series, when ip6_hold_safe() did not get the reference
on the released route, seg6_lookup_nexthop() returned 0 if a later policy
rule had a route, or -ENETUNREACH. Now it can return -EINVAL in both cases.
The Sashiko review points out the second one.
It would be good to keep seg6_lookup_nexthop() unchanged for the BPF
helpers, also while a route is being released. One idea, as a refinement of
the split, could be a common lookup function with a noref argument. For
example, seg6_lookup_any_nexthop_noref() would call it with noref set, and
seg6_lookup_nexthop() with noref clear, keeping the refcounted lookup it
had before the series. What do you think?
> [snip]
Ciao,
Andrea
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH net-next v2 1/2] seg6: skip the route refcount in seg6local IPv6 lookups
2026-10-10 10:10 ` [PATCH net-next v2 1/2] seg6: skip the route refcount in seg6local IPv6 lookups Yuya Kusakabe
2026-10-13 23:58 ` Andrea Mayer
@ 2026-10-15 14:30 ` Gabriel Goller
2026-10-15 14:38 ` Yuya Kusakabe
1 sibling, 1 reply; 7+ messages in thread
From: Gabriel Goller @ 2026-10-15 14:30 UTC (permalink / raw)
To: Yuya Kusakabe
Cc: Andrea Mayer, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Simon Horman, netdev, linux-kernel
Hi Yuya,
> [snip]
> @@ -372,17 +374,41 @@ seg6_lookup_any_nexthop(struct sk_buff *skb, struct in6_addr *nhaddr,
> rt = net->ipv6.ip6_blk_hole_entry;
> dst = &rt->dst;
> dst_hold(dst);
> + flags &= ~RT6_LOOKUP_F_DST_NOREF;
> }
>
> skb_dst_drop(skb);
> - skb_dst_set(skb, dst);
> + if ((flags & RT6_LOOKUP_F_DST_NOREF) && !dst->rt_uncached_list)
> + skb_dst_set_noref(skb, dst);
> + else
> + skb_dst_set(skb, dst);
> return dst->error;
> }
>
> +static int seg6_lookup_nexthop_noref(struct sk_buff *skb,
> + struct in6_addr *nhaddr, u32 tbl_id)
> +{
> + return seg6_lookup_any_nexthop_noref(skb, nhaddr, tbl_id, false, 0);
> +}
> +
> int seg6_lookup_nexthop(struct sk_buff *skb,
> struct in6_addr *nhaddr, u32 tbl_id)
> {
> - return seg6_lookup_any_nexthop(skb, nhaddr, tbl_id, false, 0);
> + int err;
> +
> + rcu_read_lock();
> + err = seg6_lookup_nexthop_noref(skb, nhaddr, tbl_id);
> + if (!skb_dst_force(skb)) {
> + struct dst_entry *dst;
> +
> + dst = &dev_net(skb->dev)->ipv6.ip6_blk_hole_entry->dst;
I think we should use ip6_null_entry instead of ip6_blk_hole_entry here.
Previously this path (failure to acquire the dst ref) was reached through
ip6_pol_route() and ip6_hold_safe(), which uses ip6_null_entry and returns
-ENETUNREACH as an error.
After this patch, the error is triggered here and we use ip6_blk_hole_entry,
which returns -EINVAL.
What do you think?
> + dst_hold(dst);
> + skb_dst_set(skb, dst);
> + err = dst->error;
> + }
> + rcu_read_unlock();
> +
> + return err;
> }
>
> static __u8 seg6_flv_lcblock_octects(const struct seg6_flavors_info *finfo)
> [snip]
Thanks,
Gabriel
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH net-next v2 1/2] seg6: skip the route refcount in seg6local IPv6 lookups
2026-10-13 23:58 ` Andrea Mayer
@ 2026-10-15 14:31 ` Yuya Kusakabe
0 siblings, 0 replies; 7+ messages in thread
From: Yuya Kusakabe @ 2026-10-15 14:31 UTC (permalink / raw)
To: Andrea Mayer
Cc: David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Simon Horman, netdev, linux-kernel
On Wed, 14 Oct 2026 01:58:19 +0200
Andrea Mayer <andrea.mayer@uniroma2.it> wrote:
> For a packet queued with NFQUEUE, the okfn runs later from nf_reinject(),
> under the rcu_read_lock() of the nfnetlink verdict handler. Is "that same
> section" accurate for that case?
No, it is not. The lookup and dst_input() still run within one RCU
read-side section, but for a reinjected packet it is the one of the
verdict handler. v3 will say so in both patches.
> With RT6_LOOKUP_F_DST_NOREF, ip6_pol_route() no longer calls
> ip6_hold_safe(). If the route it finds is released on another CPU during
> the lookup, the packet can be dropped without an ICMP error. Before the
> series, when ip6_hold_safe() did not get the reference on the released
> route, the packet went to the next policy rule, or to ip6_null_entry and
> its ICMPv6 Destination Unreachable. As far as I can see, only packets that
> race with the release are affected. It is still a change in behavior, and
> it would be worth at least mentioning it in the commit message.
Agreed. v3 will mention it in the 1/2 message, along with the fact
that ip6_route_input() has the same window.
> It would be good to keep seg6_lookup_nexthop() unchanged for the BPF
> helpers, also while a route is being released. One idea, as a refinement of
> the split, could be a common lookup function with a noref argument. For
> example, seg6_lookup_any_nexthop_noref() would call it with noref set, and
> seg6_lookup_nexthop() with noref clear, keeping the refcounted lookup it
> had before the series. What do you think?
That works better. In v3, seg6_lookup_any_nexthop() will take a noref
argument, seg6_lookup_any_nexthop_noref() will set it for the seg6local
input actions, and seg6_lookup_nexthop() will keep its refcounted
lookup. The skb_dst_force() fallback goes away, and with it the
-EINVAL that Sashiko pointed out.
pw-bot: cr
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH net-next v2 1/2] seg6: skip the route refcount in seg6local IPv6 lookups
2026-10-15 14:30 ` Gabriel Goller
@ 2026-10-15 14:38 ` Yuya Kusakabe
0 siblings, 0 replies; 7+ messages in thread
From: Yuya Kusakabe @ 2026-10-15 14:38 UTC (permalink / raw)
To: Gabriel Goller
Cc: Andrea Mayer, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Simon Horman, netdev, linux-kernel
On Thu, 15 Oct 2026 16:30:02 +0200
Gabriel Goller <g.goller@proxmox.com> wrote:
> I think we should use ip6_null_entry instead of ip6_blk_hole_entry here.
> Previously this path (failure to acquire the dst ref) was reached through
> ip6_pol_route() and ip6_hold_safe(), which uses ip6_null_entry and returns
> -ENETUNREACH as an error.
> After this patch, the error is triggered here and we use ip6_blk_hole_entry,
> which returns -EINVAL.
>
> What do you think?
Agreed, the error changes. v3 will drop this fallback altogether:
following Andrea's suggestion, seg6_lookup_nexthop() will keep its
refcounted lookup, so ip6_hold_safe() handles the failure as before.
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-10-15 14:38 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-10-10 10:10 [PATCH net-next v2 0/2] seg6: skip route refcounts in seg6local lookups Yuya Kusakabe
2026-10-10 10:10 ` [PATCH net-next v2 1/2] seg6: skip the route refcount in seg6local IPv6 lookups Yuya Kusakabe
2026-10-13 23:58 ` Andrea Mayer
2026-10-15 14:31 ` Yuya Kusakabe
2026-10-15 14:30 ` Gabriel Goller
2026-10-15 14:38 ` Yuya Kusakabe
2026-10-10 10:10 ` [PATCH net-next v2 2/2] seg6: skip the route refcount in seg6local IPv4 lookups Yuya Kusakabe
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.