Skip to content

Commit 20c76da

Browse files
idoschPaolo Abeni
authored andcommitted
vxlan: Do not treat dst cache initialization errors as fatal
FDB entries are allocated in an atomic context as they can be added from the data path when learning is enabled. After converting the FDB hash table to rhashtable, the insertion rate will be much higher (*) which will entail a much higher rate of per-CPU allocations via dst_cache_init(). When adding a large number of entries (e.g., 256k) in a batch, a small percentage (< 0.02%) of these per-CPU allocations will fail [1]. This does not happen with the current code since the insertion rate is low enough to give the per-CPU allocator a chance to asynchronously create new chunks of per-CPU memory. Given that: a. Only a small percentage of these per-CPU allocations fail. b. The scenario where this happens might not be the most realistic one. c. The driver can work correctly without dst caches. The dst_cache_*() APIs first check that the dst cache was properly initialized. d. The dst caches are not always used (e.g., 'tos inherit'). It seems reasonable to not treat these allocation failures as fatal. Therefore, do not bail when dst_cache_init() fails and suppress warnings by specifying '__GFP_NOWARN'. [1] percpu: allocation failed, size=40 align=8 atomic=1, atomic alloc failed, no space left (*) 97% reduction in average latency of vxlan_fdb_update() when adding 256k entries in a batch. Reviewed-by: Petr Machata <petrm@nvidia.com> Signed-off-by: Ido Schimmel <idosch@nvidia.com> Link: https://patch.msgid.link/20250415121143.345227-14-idosch@nvidia.com Reviewed-by: Nikolay Aleksandrov <razor@blackwall.org> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
1 parent ebe6420 commit 20c76da

File tree

1 file changed

+4
-4
lines changed

1 file changed

+4
-4
lines changed

drivers/net/vxlan/vxlan_core.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -619,10 +619,10 @@ static int vxlan_fdb_append(struct vxlan_fdb *f,
619619
if (rd == NULL)
620620
return -ENOMEM;
621621

622-
if (dst_cache_init(&rd->dst_cache, GFP_ATOMIC)) {
623-
kfree(rd);
624-
return -ENOMEM;
625-
}
622+
/* The driver can work correctly without a dst cache, so do not treat
623+
* dst cache initialization errors as fatal.
624+
*/
625+
dst_cache_init(&rd->dst_cache, GFP_ATOMIC | __GFP_NOWARN);
626626

627627
rd->remote_ip = *ip;
628628
rd->remote_port = port;

0 commit comments

Comments
 (0)