Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 31fe62b9 authored by Tim Bird's avatar Tim Bird Committed by David S. Miller
Browse files

mm: add a low limit to alloc_large_system_hash



UDP stack needs a minimum hash size value for proper operation and also
uses alloc_large_system_hash() for proper NUMA distribution of its hash
tables and automatic sizing depending on available system memory.

On some low memory situations, udp_table_init() must ignore the
alloc_large_system_hash() result and reallocs a bigger memory area.

As we cannot easily free old hash table, we leak it and kmemleak can
issue a warning.

This patch adds a low limit parameter to alloc_large_system_hash() to
solve this problem.

We then specify UDP_HTABLE_SIZE_MIN for UDP/UDPLite hash table
allocation.

Reported-by: default avatarMark Asselstine <mark.asselstine@windriver.com>
Reported-by: default avatarTim Bird <tim.bird@am.sony.com>
Signed-off-by: default avatarEric Dumazet <eric.dumazet@gmail.com>
Cc: Paul Gortmaker <paul.gortmaker@windriver.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d0a24a35
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -3093,6 +3093,7 @@ static void __init dcache_init_early(void)
					HASH_EARLY,
					&d_hash_shift,
					&d_hash_mask,
					0,
					0);

	for (loop = 0; loop < (1U << d_hash_shift); loop++)
@@ -3123,6 +3124,7 @@ static void __init dcache_init(void)
					0,
					&d_hash_shift,
					&d_hash_mask,
					0,
					0);

	for (loop = 0; loop < (1U << d_hash_shift); loop++)
+2 −0
Original line number Diff line number Diff line
@@ -1647,6 +1647,7 @@ void __init inode_init_early(void)
					HASH_EARLY,
					&i_hash_shift,
					&i_hash_mask,
					0,
					0);

	for (loop = 0; loop < (1U << i_hash_shift); loop++)
@@ -1677,6 +1678,7 @@ void __init inode_init(void)
					0,
					&i_hash_shift,
					&i_hash_mask,
					0,
					0);

	for (loop = 0; loop < (1U << i_hash_shift); loop++)
+2 −1
Original line number Diff line number Diff line
@@ -154,7 +154,8 @@ extern void *alloc_large_system_hash(const char *tablename,
				     int flags,
				     unsigned int *_hash_shift,
				     unsigned int *_hash_mask,
				     unsigned long limit);
				     unsigned long low_limit,
				     unsigned long high_limit);

#define HASH_EARLY	0x00000001	/* Allocating during early boot? */
#define HASH_SMALL	0x00000002	/* sub-page allocation allowed, min
+2 −1
Original line number Diff line number Diff line
@@ -547,7 +547,8 @@ void __init pidhash_init(void)

	pid_hash = alloc_large_system_hash("PID", sizeof(*pid_hash), 0, 18,
					   HASH_EARLY | HASH_SMALL,
					   &pidhash_shift, NULL, 4096);
					   &pidhash_shift, NULL,
					   0, 4096);
	pidhash_size = 1U << pidhash_shift;

	for (i = 0; i < pidhash_size; i++)
+5 −2
Original line number Diff line number Diff line
@@ -5242,9 +5242,10 @@ void *__init alloc_large_system_hash(const char *tablename,
				     int flags,
				     unsigned int *_hash_shift,
				     unsigned int *_hash_mask,
				     unsigned long limit)
				     unsigned long low_limit,
				     unsigned long high_limit)
{
	unsigned long long max = limit;
	unsigned long long max = high_limit;
	unsigned long log2qty, size;
	void *table = NULL;

@@ -5282,6 +5283,8 @@ void *__init alloc_large_system_hash(const char *tablename,
	}
	max = min(max, 0x80000000ULL);

	if (numentries < low_limit)
		numentries = low_limit;
	if (numentries > max)
		numentries = max;

Loading