[CRIU] [PATCH v2] Add inherit fd support
Saied Kazemi
saied at google.com
Thu Dec 11 10:47:22 PST 2014
On Thu, Dec 11, 2014 at 12:18 AM, Pavel Emelyanov <xemul at parallels.com> wrote:
> On 12/10/2014 08:39 PM, Saied Kazemi wrote:
>> On Wed, Dec 10, 2014 at 1:52 AM, Pavel Emelyanov <xemul at parallels.com> wrote:
>>> On 12/09/2014 11:20 PM, Saied Kazemi wrote:
>>>> There are cases where a process's file descriptor cannot be restored
>>>> from the checkpoint images. For example, a pipe file descriptor with
>>>> one end in the checkpointed process and the other end in a separate
>>>> process (that was not part of the checkpointed process tree) cannot be
>>>> restored because after checkpoint the pipe will be broken.
>>>>
>>>> There are also cases where the user wants to use a new file during
>>>> restore instead of the original file at checkpoint time. For example,
>>>> the user wants to change the log file of a process from /path/to/oldlog
>>>> to /path/to/newlog.
>>>>
>>>> In these cases, criu's caller should set up a new file descriptor to be
>>>> inherited by the restored process and specify the file descriptor with the
>>>> --inherit-fd command line option. The argument of --inherit-fd has the
>>>> format fd[%d]:%s, where %d tells criu which of its own file descriptors
>>>> to use for restoring the file identified by %s.
>>>>
>>>> As a debugging aid, if the argument has the format debug[%d]:%s, it tells
>>>> criu to write out the string after colon to the file descriptor %d. This
>>>> can be used, for example, as an easy way to leave a "restore marker"
>>>> in the output stream of the process.
>>>>
>>>> It's important to note that inherit fd support breaks applications
>>>> that depend on the state of the file descriptor being inherited. So,
>>>> consider inherit fd only for specific use cases that you know for sure
>>>> won't break the application.
>>>>
>>>> For examples please visit http://criu.org/Category:HOWTO.
>>>>
>>>> Signed-off-by: Saied Kazemi <saied at google.com>
>>>
>>> Patch applied, thanks a lot! I have only one question, would you clarify
>>> it please:
>>>
>>>
>>>> +int inherit_fd_fini()
>>>> +{
>>>> + int reused;
>>>> + struct inherit_fd *inh;
>>>> +
>>>> + list_for_each_entry(inh, &opts.inherit_fds, inh_list) {
>>>> + if (inh->inh_fd < 0) {
>>>> + pr_err("File %s in inherit fd list has invalid fd %d\n",
>>>> + inh->inh_id, inh->inh_fd);
>>>> + return -1;
>>>> + }
>>>> +
>>>> + reused = inherit_fd_reused(inh);
>>>
>>> How can the fd become reused? I've found no places where the fd sitting
>>> in the inh object may become such.
>>
>> Sorry that it's not obvious, Andrew had the same question. Please let
>> me know if we should add a comment to explain.
>>
>> Some parts of the file restore engine can close an inherit fd
>> explicitly by close() or implicitly by dup2() to reuse that
>> descriptor. For example, here is a code snippet from
>> send_fd_to_self():
>>
>> if (move_img_fd(sock, dfd))
>> return -1;
>>
>> if (dup2(fd, dfd) != dfd) {
>> pr_perror("Can't dup local fd %d -> %d", fd, dfd);
>> return -1;
>> }
>>
>> dfd may be an inherit fd. In the specific case of send_fd_to_self(),
>> we check for clashes at the beginning of the function and, therefore,
>> this function will not reuse an inherit fd. However, to avoid adding
>> a ton of clash detect and resolve code everywhere we close() and/or
>> dup2(), we just make sure that when we're dup()ing or close()ing our
>> inherit fd we're still dealing with the same fd that we inherited.
>
> Ah, I see. Would you send a patch with the comment describing these
> precautions?
Sure. Just sent a patch.
--Saied
More information about the CRIU
mailing list