> On Feb 25, 2020, at 9:08 AM, Martin Lau <kafai@xxxxxx> wrote: > > On Mon, Feb 24, 2020 at 09:47:33PM -0800, Song Liu wrote: >> On Fri, Feb 21, 2020 at 10:49 AM Martin KaFai Lau <kafai@xxxxxx> wrote: >>> >>> This patch will dump out the bpf_sk_storages of a sk >>> if the request has the INET_DIAG_REQ_SK_BPF_STORAGES nlattr. >>> >>> An array of SK_DIAG_BPF_STORAGE_REQ_MAP_FD can be specified in >>> INET_DIAG_REQ_SK_BPF_STORAGES to select which bpf_sk_storage to dump. >>> If no map_fd is specified, all bpf_sk_storages of a sk will be dumped. >> [...] >> >>> Signed-off-by: Martin KaFai Lau <kafai@xxxxxx> [...] > >>> @@ -1022,8 +1069,11 @@ static int __inet_diag_dump(struct sk_buff *skb, struct netlink_callback *cb, >>> const struct inet_diag_req_v2 *r) >>> { >>> const struct inet_diag_handler *handler; >>> + u32 prev_min_dump_alloc; >>> int err = 0; >>> >>> +again: >>> + prev_min_dump_alloc = cb->min_dump_alloc; >>> handler = inet_diag_lock_handler(r->sdiag_protocol); >>> if (!IS_ERR(handler)) >>> handler->dump(skb, cb, r); >>> @@ -1031,6 +1081,12 @@ static int __inet_diag_dump(struct sk_buff *skb, struct netlink_callback *cb, >>> err = PTR_ERR(handler); >>> inet_diag_unlock_handler(handler); >>> >>> + if (!skb->len && cb->min_dump_alloc > prev_min_dump_alloc) { >> >> Why do we check for !skb->len here? > skb contains the info of sk(s) to be dumped to the userspace. > It may contain no sk info (i.e. !skb->len), 1 sk info, 2 sk info...etc. > It only retries if there is no sk info and the cb->min_dump_alloc becomes > larger (together, it means the current skb is not large enough to fit one > sk info). I see. Thanks for the explanation. Acked-by: Song Liu <songliubraving@xxxxxx>