Re: [PATCH net-next] net: sock: add the case if sk is NULL

From: Eric Dumazet
Date: Mon Aug 09 2021 - 05:34:47 EST

On 8/9/21 8:12 AM, yajun.deng@xxxxxxxxx wrote:
> August 6, 2021 9:11 PM, "Jakub Kicinski" <kuba@xxxxxxxxxx> wrote:
>> On Fri, 6 Aug 2021 14:38:15 +0800 Yajun Deng wrote:
>>> Add the case if sk is NULL in sock_{put, hold},
>>> The caller is free to use it.
>>> Signed-off-by: Yajun Deng <yajun.deng@xxxxxxxxx>
>> The obvious complaint about this patch (and your previous netdev patch)
>> is that you're spraying branches everywhere in the code. Sure, it may
> Sorry for that, I'll be more normative in later submission.
>> be okay for free(), given how expensive of an operation that is but
>> is having refcounting functions accept NULL really the best practice?
>> Can you give us examples in the kernel where that's the case?
> 0 include/net/neighbour.h neigh_clone()
> 1 include/linux/cgroup.h get_cgroup_ns() and put_cgroup_ns() (This is very similar to my submission)
> 2 include/linux/ipc_namespace.h get_ipc_ns()
> 3 include/linux/posix_acl.h posix_acl_dup()
> 4 include/linux/pid.h get_pid()
> 5 include/linux/user_namespace.h get_user_ns()

These helpers might be called with NULL pointers by design.

sock_put() and sock_hold() are never called with NULL.

Same for put_page() and hundreds of other functions.

By factorizing a conditional in the function, hoping to remove one in few callers,
we add more conditional branches (and increase code size)