From: Oren Laadan <orenl-RdfvBDnrOixBDgjK7y7TUQ@public.gmane.org>
To: Dan Smith <danms-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
Cc: containers-qjLDD68F18O7TbgM5vRIOg@public.gmane.org
Subject: Re: [PATCH 2/3] Make sockets proper objhash objects and use checkpoint_obj() on them
Date: Tue, 25 Aug 2009 01:01:37 -0400 [thread overview]
Message-ID: <4A937031.10300@librato.com> (raw)
In-Reply-To: <1251133918-8117-3-git-send-email-danms-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
Hi Dan,
Dan Smith wrote:
> This changes the checkpoint/restart procedure for sockets a bit. The
> socket file header is now checkpointed separately from the socket itself,
> which allows us to checkpoint a socket without arriving at it from a
> file descriptor. Thus, most sockets will be checkpointed as a result
> of processing the file table, calling sock_file_checkpoint(fd), which
> in turn calls checkpoint_obj(socket).
It's perhaps more accurate to s/most sockets/some sockets/. It may
be more likely for a socket to be checkpointed as a peer of another
process, or as the sender of an skb.
The patch looks fine - see a few comment below.
Now that you made 'struct sock' a 1st class object, they deserve to
enjoy 1st class treatment :p That also means proper collect() method
- probably starting with the f_op ...
I may be mistaken, but I suspect that the suggested implementation
cannot limit the depth of recursive calls to checkpoint_obj(). For
instance, consider a dgram socket that received data from another
dgram socket, that received data from another dgram, ad infinitum.
>
> However, we may arrive at some sockets while checkpointing other objects,
> such as the other end of an AF_UNIX socket with buffers in flight. This
> patch just opens that door, which is utilized by the next patch.
>
> Signed-off-by: Dan Smith <danms-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
> ---
> checkpoint/objhash.c | 2 +
> include/linux/checkpoint_hdr.h | 4 +-
> include/net/sock.h | 2 +
> net/checkpoint.c | 116 ++++++++++++++++++++++++++++-----------
> net/unix/checkpoint.c | 3 +-
> 5 files changed, 91 insertions(+), 36 deletions(-)
>
> diff --git a/checkpoint/objhash.c b/checkpoint/objhash.c
> index 019077b..4f26e86 100644
> --- a/checkpoint/objhash.c
> +++ b/checkpoint/objhash.c
> @@ -381,6 +381,8 @@ static struct ckpt_obj_ops ckpt_obj_ops[] = {
> .obj_type = CKPT_OBJ_SOCK,
> .ref_drop = obj_sock_drop,
> .ref_grab = obj_sock_grab,
> + .checkpoint = checkpoint_sock,
> + .restore = restore_sock,
> },
> };
>
> diff --git a/include/linux/checkpoint_hdr.h b/include/linux/checkpoint_hdr.h
> index 78f1f27..39b3cb4 100644
> --- a/include/linux/checkpoint_hdr.h
> +++ b/include/linux/checkpoint_hdr.h
> @@ -68,6 +68,7 @@ enum {
> CKPT_HDR_USER,
> CKPT_HDR_GROUPINFO,
> CKPT_HDR_TASK_CREDS,
> + CKPT_HDR_SOCKET,
>
> /* 201-299: reserved for arch-dependent */
>
> @@ -367,6 +368,7 @@ struct ckpt_hdr_file_pipe {
>
> /* socket */
> struct ckpt_hdr_socket {
> + struct ckpt_hdr h;
> struct { /* struct socket */
> __u64 flags;
> __u8 state;
> @@ -425,7 +427,7 @@ struct ckpt_hdr_socket_unix {
>
> struct ckpt_hdr_file_socket {
> struct ckpt_hdr_file common;
> - struct ckpt_hdr_socket socket;
> + __s32 sock_objref;
> } __attribute__((aligned(8)));
I'm thinking about the two other use cases that I mentioned:
"dangling" (not-referenced by a file) and "pending" (not yet
accepted) sockets.
In both cases (well, at least with "pending"), the 'struct sock'
exist but the 'struct socket' does not exit until after the
socket is attached to a file descriptor. IIRC, the lifespan of
'struct socket' is coupled to that of the referencing file.
In that case, I guess it make more sense to leave the 'struct
socket' related data within ckpt_hdr_file_socket.
[...]
> + sk = ckpt_obj_fetch(ctx, h->sock_objref, CKPT_OBJ_SOCK);
> + if (IS_ERR(sk))
> + return ERR_PTR(PTR_ERR(sk));
Nit: I vaguely recall some disapproval of such construct...
How about '(struct file *) sk' ?
> +
> + file = sock_alloc_attach_fd(sk->sk_socket);
> + if (IS_ERR(file))
> + return file;
[...]
Oren.
next prev parent reply other threads:[~2009-08-25 5:01 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-08-24 17:11 [RFC] Change socket checkpoint to retain DGRAM source addresses Dan Smith
[not found] ` <1251133918-8117-1-git-send-email-danms-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2009-08-24 17:11 ` [PATCH 1/3] Set the CHECKPOINTED flag on objects before calling checkpoint Dan Smith
[not found] ` <1251133918-8117-2-git-send-email-danms-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2009-08-25 5:53 ` Oren Laadan
2009-08-24 17:11 ` [PATCH 2/3] Make sockets proper objhash objects and use checkpoint_obj() on them Dan Smith
[not found] ` <1251133918-8117-3-git-send-email-danms-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2009-08-25 5:01 ` Oren Laadan [this message]
[not found] ` <4A937031.10300-RdfvBDnrOixBDgjK7y7TUQ@public.gmane.org>
2009-08-25 14:52 ` Dan Smith
[not found] ` <87y6p8q728.fsf-FLMGYpZoEPULwtHQx/6qkW3U47Q5hpJU@public.gmane.org>
2009-08-25 17:55 ` Oren Laadan
[not found] ` <4A94257C.5060702-RdfvBDnrOixBDgjK7y7TUQ@public.gmane.org>
2009-08-26 2:53 ` Matt Helsley
2009-08-26 2:47 ` Matt Helsley
2009-08-24 17:11 ` [PATCH 3/3] Store socket owner with buffers Dan Smith
[not found] ` <1251133918-8117-4-git-send-email-danms-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2009-08-25 5:33 ` Oren Laadan
2009-08-26 17:31 ` Dan Smith
[not found] ` <87bpm2qy6q.fsf-FLMGYpZoEPULwtHQx/6qkW3U47Q5hpJU@public.gmane.org>
2009-08-26 20:34 ` Oren Laadan
[not found] ` <4A959C4A.6050803-RdfvBDnrOixBDgjK7y7TUQ@public.gmane.org>
2009-08-26 21:44 ` Dan Smith
2009-08-25 0:06 ` [RFC] Change socket checkpoint to retain DGRAM source addresses Serge E. Hallyn
2009-08-25 4:33 ` Oren Laadan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4A937031.10300@librato.com \
--to=orenl-rdfvbdnroixbdgjk7y7tuq@public.gmane.org \
--cc=containers-qjLDD68F18O7TbgM5vRIOg@public.gmane.org \
--cc=danms-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.