improves ingress+u32 performance from 22.4 Mpps to 22.9 Mpps
Unified · Split
| @@ -65,11 +65,13 @@ bits 9,10,11: redirect counter - redirect TTL. Loop avoidance · 64 unmodified lines | |||
| 65 | #define SET_TC_NCLS(v) ( TC_NCLS | (v & ~TC_NCLS)) | 65 | #define SET_TC_NCLS(v) ( TC_NCLS | (v & ~TC_NCLS)) |
| 66 | #define CLR_TC_NCLS(v) ( v & ~TC_NCLS) | 66 | #define CLR_TC_NCLS(v) ( v & ~TC_NCLS) |
| 67 | 67 | ||
| 68 | #ifndef __KERNEL__ | ||
| 68 | #define S_TC_RTTL _TC_MAKE32(9) | 69 | #define S_TC_RTTL _TC_MAKE32(9) |
| 69 | #define M_TC_RTTL _TC_MAKEMASK(3,S_TC_RTTL) | 70 | #define M_TC_RTTL _TC_MAKEMASK(3,S_TC_RTTL) |
| 70 | #define G_TC_RTTL(x) _TC_GETVALUE(x,S_TC_RTTL,M_TC_RTTL) | 71 | #define G_TC_RTTL(x) _TC_GETVALUE(x,S_TC_RTTL,M_TC_RTTL) |
| 71 | #define V_TC_RTTL(x) _TC_MAKEVALUE(x,S_TC_RTTL) | 72 | #define V_TC_RTTL(x) _TC_MAKEVALUE(x,S_TC_RTTL) |
| 72 | #define SET_TC_RTTL(v,n) ((V_TC_RTTL(n)) | (v & ~M_TC_RTTL)) | 73 | #define SET_TC_RTTL(v,n) ((V_TC_RTTL(n)) | (v & ~M_TC_RTTL)) |
| 74 | #endif | ||
| 73 | 75 | ||
| 74 | #define S_TC_AT _TC_MAKE32(12) | 76 | #define S_TC_AT _TC_MAKE32(12) |
| 75 | #define M_TC_AT _TC_MAKEMASK(2,S_TC_AT) | 77 | #define M_TC_AT _TC_MAKEMASK(2,S_TC_AT) |
| @@ -3531,18 +3531,9 @@ EXPORT_SYMBOL_GPL(br_fdb_test_addr_hook); · 3530 unmodified lines | |||
| 3531 | */ | 3531 | */ |
| 3532 | static int ing_filter(struct sk_buff *skb, struct netdev_queue *rxq) | 3532 | static int ing_filter(struct sk_buff *skb, struct netdev_queue *rxq) |
| 3533 | { | 3533 | { |
| 3534 | struct net_device *dev = skb->dev; | ||
| 3535 | u32 ttl = G_TC_RTTL(skb->tc_verd); | ||
| 3536 | int result = TC_ACT_OK; | 3534 | int result = TC_ACT_OK; |
| 3537 | struct Qdisc *q; | 3535 | struct Qdisc *q; |
| 3538 | 3536 | ||
| 3539 | if (unlikely(MAX_RED_LOOP < ttl++)) { | ||
| 3540 | net_warn_ratelimited("Redir loop detected Dropping packet (%d->%d)\n", | ||
| 3541 | skb->skb_iif, dev->ifindex); | ||
| 3542 | return TC_ACT_SHOT; | ||
| 3543 | } | ||
| 3544 | |||
| 3545 | skb->tc_verd = SET_TC_RTTL(skb->tc_verd, ttl); | ||
| 3546 | skb->tc_verd = SET_TC_AT(skb->tc_verd, AT_INGRESS); | 3537 | skb->tc_verd = SET_TC_AT(skb->tc_verd, AT_INGRESS); |
| 3547 | 3538 | ||
| 3548 | q = rcu_dereference(rxq->qdisc); | 3539 | q = rcu_dereference(rxq->qdisc); |