[CRIU] [PATCH 2/2] tcp: don't split packets for restoring a send queue
Andrew Vagin
avagin at parallels.com
Wed Nov 26 11:45:44 PST 2014
On Wed, Nov 26, 2014 at 10:31:36PM +0300, Pavel Emelyanov wrote:
> On 11/21/2014 05:10 PM, Andrey Vagin wrote:
> > The kernel can do it better. The problem exists only for recv queues.
>
> But what the problem is? We still can feed recv queue with
> small chunks, kernel just doesn't eat _parts_ of it. If the
> recv queue is too big, you try to feed it all at once with
> this fix, which increases the risk of failure.
I do it only for the send queue.
>
> > Signed-off-by: Andrey Vagin <avagin at openvz.org>
> > ---
> > include/kerndat.h | 1 -
> > kerndat.c | 7 ++-----
> > sk-tcp.c | 8 +++++---
> > 3 files changed, 7 insertions(+), 9 deletions(-)
> >
> > diff --git a/include/kerndat.h b/include/kerndat.h
> > index 1f511cf..12517d1 100644
> > --- a/include/kerndat.h
> > +++ b/include/kerndat.h
> > @@ -16,7 +16,6 @@ extern int kerndat_get_dirty_track(void);
> >
> > struct kerndat_s {
> > dev_t shmem_dev;
> > - int tcp_max_wshare;
> > int tcp_max_rshare;
> > int last_cap;
> > u64 zero_page_pfn;
> > diff --git a/kerndat.c b/kerndat.c
> > index 68c3e35..7855066 100644
> > --- a/kerndat.c
> > +++ b/kerndat.c
> > @@ -19,7 +19,6 @@
> > #include "util.h"
> >
> > struct kerndat_s kdat = {
> > - .tcp_max_wshare = 2U << 20,
> > .tcp_max_rshare = 3U << 20,
> > };
> >
> > @@ -197,7 +196,6 @@ static int tcp_read_sysctl_limits(void)
> > int ret;
> >
> > struct sysctl_req req[] = {
> > - { "net/ipv4/tcp_wmem", &vect[0], CTL_U32A(ARRAY_SIZE(vect[0])) },
> > { "net/ipv4/tcp_rmem", &vect[1], CTL_U32A(ARRAY_SIZE(vect[1])) },
> > { },
> > };
> > @@ -212,13 +210,12 @@ static int tcp_read_sysctl_limits(void)
> > goto out;
> > }
> >
> > - kdat.tcp_max_wshare = min(kdat.tcp_max_wshare, (int)vect[0][2]);
> > kdat.tcp_max_rshare = min(kdat.tcp_max_rshare, (int)vect[1][2]);
> >
> > - if (kdat.tcp_max_wshare < 128 || kdat.tcp_max_rshare < 128)
> > + if (kdat.tcp_max_rshare < 128)
> > pr_warn("The memory limits for TCP queues are suspiciously small\n");
> > out:
> > - pr_debug("TCP queue memory limits are %d:%d\n", kdat.tcp_max_wshare, kdat.tcp_max_rshare);
> > + pr_debug("TCP recv queue memory limit is %d\n", kdat.tcp_max_rshare);
> > return 0;
> > }
> >
> > diff --git a/sk-tcp.c b/sk-tcp.c
> > index 3ef7015..e280ee6 100644
> > --- a/sk-tcp.c
> > +++ b/sk-tcp.c
> > @@ -456,7 +456,7 @@ static int restore_tcp_seqs(int sk, TcpStreamEntry *tse)
> > static int __send_tcp_queue(int sk, int queue, u32 len, struct cr_img *img)
> > {
> > int ret, err = -1;
> > - int off, max;
> > + int off;
> > char *buf;
> >
> > buf = xmalloc(len);
> > @@ -466,10 +466,12 @@ static int __send_tcp_queue(int sk, int queue, u32 len, struct cr_img *img)
> > if (read_img_buf(img, buf, len) < 0)
> > goto err;
> >
> > - max = (queue == TCP_SEND_QUEUE) ? kdat.tcp_max_wshare : kdat.tcp_max_rshare;
> > off = 0;
> > while (len) {
> > - int chunk = (len > max ? max : len);
> > + int chunk = len;
> > +
> > + if (queue == TCP_RECV_QUEUE && len > kdat.tcp_max_rshare)
> > + chunk = kdat.tcp_max_rshare;
> >
> > ret = send(sk, buf + off, chunk, 0);
> > if (ret <= 0) {
> >
>
More information about the CRIU
mailing list