Skip to content

Commit

Permalink
net/pppoe: make number of hash bits configurable
Browse files Browse the repository at this point in the history
When running large numbers of pppoe connections, a bucket size of 16 may
be too small and 256 may be more appropriate.  This sacrifices some RAM
but should result in faster processing of incoming PPPoE frames.

On our systems we run upwards of 150 PPPoE connections at any point in
time, and we suspect we're starting to see the effects of this small
number of buckets.

The legal values according to pppoe.c is anything that when 8 is divided
by that results in a modulo of 0, ie, 1, 2, 4 and 8.

The size of the per-underlying-interface structure is:

sizeof(rwlock_t) + sizeof(pppox_sock*) * PPPOE_HASH_SIZE.

Assuming a 64-bit pointer this will result in just over a 2KiB structure
for PPPOE_HASH_BITS=8, which will likely result in a 4KiB allocation,
which for us at least is acceptable.

Not sure what the minimum allocation size is, and thus if values of 1
and 2 truly make sense.  Default results in historic sizing and
behaviour.

Signed-off-by: Jaco Kroon <jaco@uls.co.za>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Jaco Kroon authored and David S. Miller committed May 17, 2023
1 parent c83ae45 commit 96ba44c
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 1 deletion.
34 changes: 34 additions & 0 deletions drivers/net/ppp/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,40 @@ config PPPOE
which contains instruction on how to use this driver (under
the heading "Kernel mode PPPoE").

choice
prompt "Number of PPPoE hash bits"
default PPPOE_HASH_BITS_4
depends on PPPOE
help
Select the number of bits used for hashing PPPoE interfaces.

Larger sizes reduces the risk of hash collisions at the cost
of slightly increased memory usage.

This hash table is on a per outer ethernet interface.

config PPPOE_HASH_BITS_2
bool "1 bit (2 buckets)"

config PPPOE_HASH_BITS_2
bool "2 bits (4 buckets)"

config PPPOE_HASH_BITS_4
bool "4 bits (16 buckets)"

config PPPOE_HASH_BITS_8
bool "8 bits (256 buckets)"

endchoice

config PPPOE_HASH_BITS
int
default 1 if PPPOE_HASH_BITS_1
default 2 if PPPOE_HASH_BITS_2
default 4 if PPPOE_HASH_BITS_4
default 8 if PPPOE_HASH_BITS_8
default 4

config PPTP
tristate "PPP over IPv4 (PPTP)"
depends on PPP && NET_IPGRE_DEMUX
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ppp/pppoe.c
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@

#include <linux/uaccess.h>

#define PPPOE_HASH_BITS 4
#define PPPOE_HASH_BITS CONFIG_PPPOE_HASH_BITS
#define PPPOE_HASH_SIZE (1 << PPPOE_HASH_BITS)
#define PPPOE_HASH_MASK (PPPOE_HASH_SIZE - 1)

Expand Down

0 comments on commit 96ba44c

Please sign in to comment.