On Tue, Aug 13, 2019 at 09:36:29PM +0200, Florian Westphal wrote: > Pablo Neira Ayuso <pablo@xxxxxxxxxxxxx> wrote: > > > diff --git a/src/mnl.c b/src/mnl.c > > > index 97a2e0765189..0c7a4c1fa63f 100644 > > > --- a/src/mnl.c > > > +++ b/src/mnl.c > > > @@ -311,6 +311,7 @@ int mnl_batch_talk(struct netlink_ctx *ctx, struct list_head *err_list, > > > int ret, fd = mnl_socket_get_fd(nl), portid = mnl_socket_get_portid(nl); > > > uint32_t iov_len = nftnl_batch_iovec_len(ctx->batch); > > > char rcv_buf[MNL_SOCKET_BUFFER_SIZE]; > > > + unsigned int enobuf_restarts = 0; > > > size_t avg_msg_size, batch_size; > > > const struct sockaddr_nl snl = { > > > .nl_family = AF_NETLINK > > > @@ -320,6 +321,7 @@ int mnl_batch_talk(struct netlink_ctx *ctx, struct list_head *err_list, > > > .tv_usec = 0 > > > }; > > > struct iovec iov[iov_len]; > > > + unsigned int scale = 4; > > > struct msghdr msg = {}; > > > fd_set readfds; > > > > > > @@ -327,9 +329,7 @@ int mnl_batch_talk(struct netlink_ctx *ctx, struct list_head *err_list, > > > > > > batch_size = mnl_nft_batch_to_msg(ctx, &msg, &snl, iov, iov_len); > > > avg_msg_size = div_round_up(batch_size, num_cmds); > > > - > > > - mnl_set_rcvbuffer(ctx->nft->nf_sock, num_cmds * avg_msg_size * 4); > > > > Leaving this in place does not harm, right? This would speed up things > > for x86_64. > > ok, I can keep it. > > > It looks like s390 allocates larger page there to accomodate each > > netlink event. > > > > All this probing and guess games could be fixed if there is a > > getsockopt() to fetch sk->sk_rmem_alloc, this is already exposed in > > netlink via /proc. Later :-) > > How? The error occurs because sk_rmem_alloc is not large enough to > store all the netlink acks in the socket backlog. Oh, indeed. We'll need this probing in place as we cannot know what page size of the netlink event is used on every arch.