From: Andrei Vagin <ava...@virtuozzo.com> If a socket buffer is full and some messaged have been dropped, the first recvmsg will return -ENOBUF.
We can avoid this if we set the NETLINK_NO_ENOBUFS opt for a socket. Signed-off-by: Andrei Vagin <ava...@virtuozzo.com> --- criu/sk-netlink.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/criu/sk-netlink.c b/criu/sk-netlink.c index 71bb77e..8ec4e90 100644 --- a/criu/sk-netlink.c +++ b/criu/sk-netlink.c @@ -151,6 +151,23 @@ static int dump_nl_opts(int sk, NlSkOptsEntry *e) return ret; } +static int dump_nl_queue(int sk, int id) { + int ret, old_val, on = 1; + + if (dump_opt(sk, SOL_NETLINK, NETLINK_NO_ENOBUFS, &old_val)) + return -1; + + if (!old_val && restore_opt(sk, SOL_NETLINK, NETLINK_NO_ENOBUFS, &on)) + return -1; + + ret = dump_sk_queue(sk, id, SK_QUEUE_DUMP_ADDR); + + if (!old_val && restore_opt(sk, SOL_NETLINK, NETLINK_NO_ENOBUFS, &old_val)) + return -1; + + return ret; +} + static int dump_one_netlink_fd(int lfd, u32 id, const struct fd_parms *p) { struct netlink_sk_desc *sk; @@ -217,7 +234,7 @@ static int dump_one_netlink_fd(int lfd, u32 id, const struct fd_parms *p) if (dump_socket_opts(lfd, &skopts)) goto err; - if (kdat.has_nl_repair && dump_sk_queue(lfd, id, SK_QUEUE_DUMP_ADDR)) + if (kdat.has_nl_repair && dump_nl_queue(lfd, id)) goto err; if (pb_write_one(img_from_set(glob_imgset, CR_FD_NETLINK_SK), &ne, PB_NETLINK_SK)) -- 1.8.3.1 _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel