Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net, neigh: introduce interval_probe_time_ms for periodic probe

commit ed6cd6a17896 ("net, neigh: Set lower cap for neigh_managed_work rearming")
fixed a case when DELAY_PROBE_TIME is configured to 0, the processing of the
system work queue hog CPU to 100%, and further more we should introduce
a new option used by periodic probe

Signed-off-by: Yuwei Wang <wangyuweihx@gmail.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>

authored by

Yuwei Wang and committed by
Paolo Abeni
211da42e c381d02b

+60 -20
+6
Documentation/networking/ip-sysctl.rst
··· 202 202 203 203 Default: 101 204 204 205 + neigh/default/interval_probe_time_ms - INTEGER 206 + The probe interval for neighbor entries with NTF_MANAGED flag, 207 + the min value is 1. 208 + 209 + Default: 5000 210 + 205 211 mtu_expires - INTEGER 206 212 Time, in seconds, that cached PMTU information is kept. 207 213
+1
include/net/neighbour.h
··· 48 48 NEIGH_VAR_RETRANS_TIME, 49 49 NEIGH_VAR_BASE_REACHABLE_TIME, 50 50 NEIGH_VAR_DELAY_PROBE_TIME, 51 + NEIGH_VAR_INTERVAL_PROBE_TIME_MS, 51 52 NEIGH_VAR_GC_STALETIME, 52 53 NEIGH_VAR_QUEUE_LEN_BYTES, 53 54 NEIGH_VAR_PROXY_QLEN,
+1
include/uapi/linux/neighbour.h
··· 154 154 NDTPA_QUEUE_LENBYTES, /* u32 */ 155 155 NDTPA_MCAST_REPROBES, /* u32 */ 156 156 NDTPA_PAD, 157 + NDTPA_INTERVAL_PROBE_TIME_MS, /* u64, msecs */ 157 158 __NDTPA_MAX 158 159 }; 159 160 #define NDTPA_MAX (__NDTPA_MAX - 1)
+19 -18
include/uapi/linux/sysctl.h
··· 584 584 585 585 /* /proc/sys/net/<protocol>/neigh/<dev> */ 586 586 enum { 587 - NET_NEIGH_MCAST_SOLICIT=1, 588 - NET_NEIGH_UCAST_SOLICIT=2, 589 - NET_NEIGH_APP_SOLICIT=3, 590 - NET_NEIGH_RETRANS_TIME=4, 591 - NET_NEIGH_REACHABLE_TIME=5, 592 - NET_NEIGH_DELAY_PROBE_TIME=6, 593 - NET_NEIGH_GC_STALE_TIME=7, 594 - NET_NEIGH_UNRES_QLEN=8, 595 - NET_NEIGH_PROXY_QLEN=9, 596 - NET_NEIGH_ANYCAST_DELAY=10, 597 - NET_NEIGH_PROXY_DELAY=11, 598 - NET_NEIGH_LOCKTIME=12, 599 - NET_NEIGH_GC_INTERVAL=13, 600 - NET_NEIGH_GC_THRESH1=14, 601 - NET_NEIGH_GC_THRESH2=15, 602 - NET_NEIGH_GC_THRESH3=16, 603 - NET_NEIGH_RETRANS_TIME_MS=17, 604 - NET_NEIGH_REACHABLE_TIME_MS=18, 587 + NET_NEIGH_MCAST_SOLICIT = 1, 588 + NET_NEIGH_UCAST_SOLICIT = 2, 589 + NET_NEIGH_APP_SOLICIT = 3, 590 + NET_NEIGH_RETRANS_TIME = 4, 591 + NET_NEIGH_REACHABLE_TIME = 5, 592 + NET_NEIGH_DELAY_PROBE_TIME = 6, 593 + NET_NEIGH_GC_STALE_TIME = 7, 594 + NET_NEIGH_UNRES_QLEN = 8, 595 + NET_NEIGH_PROXY_QLEN = 9, 596 + NET_NEIGH_ANYCAST_DELAY = 10, 597 + NET_NEIGH_PROXY_DELAY = 11, 598 + NET_NEIGH_LOCKTIME = 12, 599 + NET_NEIGH_GC_INTERVAL = 13, 600 + NET_NEIGH_GC_THRESH1 = 14, 601 + NET_NEIGH_GC_THRESH2 = 15, 602 + NET_NEIGH_GC_THRESH3 = 16, 603 + NET_NEIGH_RETRANS_TIME_MS = 17, 604 + NET_NEIGH_REACHABLE_TIME_MS = 18, 605 + NET_NEIGH_INTERVAL_PROBE_TIME_MS = 19, 605 606 }; 606 607 607 608 /* /proc/sys/net/dccp */
+30 -2
net/core/neighbour.c
··· 1579 1579 list_for_each_entry(neigh, &tbl->managed_list, managed_list) 1580 1580 neigh_event_send_probe(neigh, NULL, false); 1581 1581 queue_delayed_work(system_power_efficient_wq, &tbl->managed_work, 1582 - max(NEIGH_VAR(&tbl->parms, DELAY_PROBE_TIME), HZ)); 1582 + NEIGH_VAR(&tbl->parms, INTERVAL_PROBE_TIME_MS)); 1583 1583 write_unlock_bh(&tbl->lock); 1584 1584 } 1585 1585 ··· 2100 2100 nla_put_msecs(skb, NDTPA_PROXY_DELAY, 2101 2101 NEIGH_VAR(parms, PROXY_DELAY), NDTPA_PAD) || 2102 2102 nla_put_msecs(skb, NDTPA_LOCKTIME, 2103 - NEIGH_VAR(parms, LOCKTIME), NDTPA_PAD)) 2103 + NEIGH_VAR(parms, LOCKTIME), NDTPA_PAD) || 2104 + nla_put_msecs(skb, NDTPA_INTERVAL_PROBE_TIME_MS, 2105 + NEIGH_VAR(parms, INTERVAL_PROBE_TIME_MS), NDTPA_PAD)) 2104 2106 goto nla_put_failure; 2105 2107 return nla_nest_end(skb, nest); 2106 2108 ··· 2257 2255 [NDTPA_ANYCAST_DELAY] = { .type = NLA_U64 }, 2258 2256 [NDTPA_PROXY_DELAY] = { .type = NLA_U64 }, 2259 2257 [NDTPA_LOCKTIME] = { .type = NLA_U64 }, 2258 + [NDTPA_INTERVAL_PROBE_TIME_MS] = { .type = NLA_U64, .min = 1 }, 2260 2259 }; 2261 2260 2262 2261 static int neightbl_set(struct sk_buff *skb, struct nlmsghdr *nlh, ··· 2375 2372 NEIGH_VAR_SET(p, DELAY_PROBE_TIME, 2376 2373 nla_get_msecs(tbp[i])); 2377 2374 call_netevent_notifiers(NETEVENT_DELAY_PROBE_TIME_UPDATE, p); 2375 + break; 2376 + case NDTPA_INTERVAL_PROBE_TIME_MS: 2377 + NEIGH_VAR_SET(p, INTERVAL_PROBE_TIME_MS, 2378 + nla_get_msecs(tbp[i])); 2378 2379 break; 2379 2380 case NDTPA_RETRANS_TIME: 2380 2381 NEIGH_VAR_SET(p, RETRANS_TIME, ··· 3569 3562 return ret; 3570 3563 } 3571 3564 3565 + static int neigh_proc_dointvec_ms_jiffies_positive(struct ctl_table *ctl, int write, 3566 + void *buffer, size_t *lenp, loff_t *ppos) 3567 + { 3568 + struct ctl_table tmp = *ctl; 3569 + int ret; 3570 + 3571 + int min = msecs_to_jiffies(1); 3572 + 3573 + tmp.extra1 = &min; 3574 + tmp.extra2 = NULL; 3575 + 3576 + ret = proc_dointvec_ms_jiffies_minmax(&tmp, write, buffer, lenp, ppos); 3577 + neigh_proc_update(ctl, write); 3578 + return ret; 3579 + } 3580 + 3572 3581 int neigh_proc_dointvec(struct ctl_table *ctl, int write, void *buffer, 3573 3582 size_t *lenp, loff_t *ppos) 3574 3583 { ··· 3681 3658 #define NEIGH_SYSCTL_USERHZ_JIFFIES_ENTRY(attr, name) \ 3682 3659 NEIGH_SYSCTL_ENTRY(attr, attr, name, 0644, neigh_proc_dointvec_userhz_jiffies) 3683 3660 3661 + #define NEIGH_SYSCTL_MS_JIFFIES_POSITIVE_ENTRY(attr, name) \ 3662 + NEIGH_SYSCTL_ENTRY(attr, attr, name, 0644, neigh_proc_dointvec_ms_jiffies_positive) 3663 + 3684 3664 #define NEIGH_SYSCTL_MS_JIFFIES_REUSED_ENTRY(attr, data_attr, name) \ 3685 3665 NEIGH_SYSCTL_ENTRY(attr, data_attr, name, 0644, neigh_proc_dointvec_ms_jiffies) 3686 3666 ··· 3702 3676 NEIGH_SYSCTL_USERHZ_JIFFIES_ENTRY(RETRANS_TIME, "retrans_time"), 3703 3677 NEIGH_SYSCTL_JIFFIES_ENTRY(BASE_REACHABLE_TIME, "base_reachable_time"), 3704 3678 NEIGH_SYSCTL_JIFFIES_ENTRY(DELAY_PROBE_TIME, "delay_first_probe_time"), 3679 + NEIGH_SYSCTL_MS_JIFFIES_POSITIVE_ENTRY(INTERVAL_PROBE_TIME_MS, 3680 + "interval_probe_time_ms"), 3705 3681 NEIGH_SYSCTL_JIFFIES_ENTRY(GC_STALETIME, "gc_stale_time"), 3706 3682 NEIGH_SYSCTL_ZERO_INTMAX_ENTRY(QUEUE_LEN_BYTES, "unres_qlen_bytes"), 3707 3683 NEIGH_SYSCTL_ZERO_INTMAX_ENTRY(PROXY_QLEN, "proxy_qlen"),
+1
net/decnet/dn_neigh.c
··· 94 94 [NEIGH_VAR_RETRANS_TIME] = 1 * HZ, 95 95 [NEIGH_VAR_BASE_REACHABLE_TIME] = 30 * HZ, 96 96 [NEIGH_VAR_DELAY_PROBE_TIME] = 5 * HZ, 97 + [NEIGH_VAR_INTERVAL_PROBE_TIME_MS] = 5 * HZ, 97 98 [NEIGH_VAR_GC_STALETIME] = 60 * HZ, 98 99 [NEIGH_VAR_QUEUE_LEN_BYTES] = SK_WMEM_MAX, 99 100 [NEIGH_VAR_PROXY_QLEN] = 0,
+1
net/ipv4/arp.c
··· 168 168 [NEIGH_VAR_RETRANS_TIME] = 1 * HZ, 169 169 [NEIGH_VAR_BASE_REACHABLE_TIME] = 30 * HZ, 170 170 [NEIGH_VAR_DELAY_PROBE_TIME] = 5 * HZ, 171 + [NEIGH_VAR_INTERVAL_PROBE_TIME_MS] = 5 * HZ, 171 172 [NEIGH_VAR_GC_STALETIME] = 60 * HZ, 172 173 [NEIGH_VAR_QUEUE_LEN_BYTES] = SK_WMEM_MAX, 173 174 [NEIGH_VAR_PROXY_QLEN] = 64,
+1
net/ipv6/ndisc.c
··· 128 128 [NEIGH_VAR_RETRANS_TIME] = ND_RETRANS_TIMER, 129 129 [NEIGH_VAR_BASE_REACHABLE_TIME] = ND_REACHABLE_TIME, 130 130 [NEIGH_VAR_DELAY_PROBE_TIME] = 5 * HZ, 131 + [NEIGH_VAR_INTERVAL_PROBE_TIME_MS] = 5 * HZ, 131 132 [NEIGH_VAR_GC_STALETIME] = 60 * HZ, 132 133 [NEIGH_VAR_QUEUE_LEN_BYTES] = SK_WMEM_MAX, 133 134 [NEIGH_VAR_PROXY_QLEN] = 64,