Re: [PATCH net] packets: Always register packet sk in the same order

From: Willem de Bruijn
Date: Sat Mar 16 2019 - 14:10:13 EST


On Sat, Mar 16, 2019 at 9:43 AM Maxime Chevallier
<maxime.chevallier@xxxxxxxxxxx> wrote:
>
> When using fanouts with AF_PACKET, the demux functions such as
> fanout_demux_cpu will return an index in the fanout socket array, which
> corresponds to the selected socket.
>
> The ordering of this array depends on the order the sockets were added
> to a given fanout group, so for FANOUT_CPU this means sockets are bound
> to cpus in the order they are configured, which is OK.
>
> However, when stopping then restarting the interface these sockets are
> bound to, the sockets are reassigned to the fanout group in the reverse
> order, due to the fact that they were inserted at the head of the
> interface's AF_PACKET socket list.
>
> This means that traffic that was directed to the first socket in the
> fanout group is now directed to the last one after an interface restart.
>
> In the case of FANOUT_CPU, traffic from CPU0 will be directed to the
> socket that used to receive traffic from the last CPU after an interface
> restart.
>
> This commit introduces a helper to add a socket at the tail of a list,
> then uses it to register AF_PACKET sockets.
>
> Note that this changes the order in which sockets are listed in /proc and
> with sock_diag.
>
> Fixes: dc99f600698d ("packet: Add fanout support")
> Signed-off-by: Maxime Chevallier <maxime.chevallier@xxxxxxxxxxx>

Acked-by: Willem de Bruijn <willemb@xxxxxxxxxx>

Note that another consequence of this patch is that insertion on
packet create is now O(N) with the number of active packet sockets,
due to sklist being an hlist.