[Devel] [PATCH RHEL7 COMMIT] neighbour: restore hashtable size limit

Konstantin Khorenko khorenko at virtuozzo.com
Fri Jun 14 13:07:11 MSK 2024


The commit is pushed to "branch-rh7-3.10.0-1160.114.2.vz7.222.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-1160.114.2.vz7.222.1
------>
commit bfbb42a6e0b98b59d0c36435e8fe33001c8dae02
Author: Alexander Atanasov <alexander.atanasov at virtuozzo.com>
Date:   Thu Jun 6 14:50:51 2024 +0300

    neighbour: restore hashtable size limit
    
    With counters fro neigh entries per VE introduced in
    https://virtuozzo.atlassian.net/browse/PSBM-87155
    tbl->entries, which served as limit of hashtable size,
    become unlimited, so the table can grow very large.
    
    Table is allocated via __get_free_pages which allocates
    continuous regions of phys mem and large order allocations
    are very likely to fail - which was observed in the issue.
    
    To address this limit the allocation order to 5.
    
    Fixes: 019712d0d37d (ve/net/neighbour: per-ct limit for neighbour entries)
    https://virtuozzo.atlassian.net/browse/PSBM-153199
    Signed-off-by: Alexander Atanasov <alexander.atanasov at virtuozzo.com>
---
 net/core/neighbour.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/net/core/neighbour.c b/net/core/neighbour.c
index 9e53bb3d1c81..f622e5298019 100644
--- a/net/core/neighbour.c
+++ b/net/core/neighbour.c
@@ -641,8 +641,16 @@ struct neighbour *__neigh_create(struct neigh_table *tbl, const void *pkey,
 	nht = rcu_dereference_protected(tbl->nht,
 					lockdep_is_held(&tbl->lock));
 
-	if (atomic_read(&tbl->entries) > (1 << nht->hash_shift))
+	/* Since entries can grow unlimited we limit the size of the hash table
+	 * here. __get_free_pages allocates continuous regions of phys mem
+	 * and orders above 10 are very hard to satisfy.
+	 * We limit the size to 5 as it is the middle ground.
+	 */
+	#define NEIGH_HASH_SHIFT_MAX 5
+	if (nht->hash_shift < NEIGH_HASH_SHIFT_MAX &&
+	    atomic_read(&tbl->entries) > (1 << nht->hash_shift))
 		nht = neigh_hash_grow(tbl, nht->hash_shift + 1);
+	#undef NEIGH_HASH_SHIFT_MAX
 
 	hash_val = tbl->hash(pkey, dev, nht->hash_rnd) >> (32 - nht->hash_shift);
 


More information about the Devel mailing list