[RFC PATCHv2 net-next 1/3] net/udp: Add a new struct for hash2 slot

From: Gur Stavi
Date: Tue Sep 24 2024 - 08:31:28 EST


> + * @hslot: basic hash slot
> + * @hash4_cnt: number of sockets in hslot4 of the same (local port, local address)
> + */
> +struct udp_hslot_main {
> + struct udp_hslot hslot; /* must be the first member */
> + u32 hash4_cnt;
> +} __aligned(2 * sizeof(long));
> +#define UDP_HSLOT_MAIN(__hslot) ((struct udp_hslot_main *)(__hslot))

Wouldn't container_of be more suitable than brutal cast?

> @@ -91,7 +110,7 @@ static inline struct udp_hslot *udp_hashslot(struct udp_table *table,
> static inline struct udp_hslot *udp_hashslot2(struct udp_table *table,
> unsigned int hash)
> {
> - return &table->hash2[hash & table->mask];
> + return (struct udp_hslot *)udp_hashslot2_main(table, hash);

Why cast and not use ->hslot. Preferably with a local variable?

> @@ -3438,16 +3436,17 @@ void __init udp_table_init(struct udp_table *table, const char *name)
> UDP_HTABLE_SIZE_MIN,
> UDP_HTABLE_SIZE_MAX);
>
> - table->hash2 = table->hash + (table->mask + 1);
> + table->hash2 = UDP_HSLOT_MAIN(table->hash + (table->mask + 1));

Wouldn't it be simpler to just cast to void? It is pure pointer
arithmetic where type checking is meaningless.
(void *)(table->hash + (table->mask + 1))
I realize now why UDP_HSLOT_MAIN couldn't use container_of but it
just demonstrates how convoluted this is.