[CRIU] [PATCH] flock: blocked processes are not interesting for us
Andrew Vagin
avagin at parallels.com
Wed Nov 5 05:11:52 PST 2014
On Wed, Nov 05, 2014 at 03:40:03PM +0400, Pavel Emelyanov wrote:
> On 10/31/2014 02:42 PM, Andrey Vagin wrote:
> > All out processes are stopped in a moment, when file locks are
> > collected, so they can't to wait any locks.
> >
> > Here is a proof of this theory:
> > [root at avagin-fc19-cr ~]# flock xxx sleep 1000 &
> > [1] 23278
> > [root at avagin-fc19-cr ~]# flock xxx sleep 1000 &
> > [2] 23280
> > [root at avagin-fc19-cr ~]# cat /proc/locks
> > 1: FLOCK ADVISORY WRITE 23278 08:03:280001 0 EOF
> > 1: -> FLOCK ADVISORY WRITE 23280 08:03:280001 0 EOF
> > [root at avagin-fc19-cr ~]# gdb -p 23280
> > (gdb) ^Z
> > [3]+ Stopped gdb -p 23280
> > [root at avagin-fc19-cr ~]# cat /proc/locks
> > 1: FLOCK ADVISORY WRITE 23278 08:03:280001 0 EOF
> >
> > Currently criu can dump nothing, if we have one process which is
> > waiting a lock. I don't see any reason to do this.
> >
> > Cc: Qiang Huang <h.huangqiang at huawei.com>
> > Reported-by: Mr Jenkins
> > Signed-off-by: Andrey Vagin <avagin at openvz.org>
> > ---
> > proc_parse.c | 36 ++++++++++++++++--------------------
> > 1 file changed, 16 insertions(+), 20 deletions(-)
> >
> > diff --git a/proc_parse.c b/proc_parse.c
> > index 389cb72..b1afb61 100644
> > --- a/proc_parse.c
> > +++ b/proc_parse.c
> > @@ -1501,6 +1501,12 @@ int parse_file_locks(void)
> > goto err;
> > }
> >
> > + pr_info("lockinfo: %lld:%d %x %d %02x:%02x:%ld %lld %s\n",
> > + fl->fl_id, fl->fl_kind, fl->fl_ltype,
> > + fl->fl_owner, fl->maj, fl->min, fl->i_no,
> > + fl->start, fl->end);
> > +
> > +
> > if (fl->fl_kind == FL_UNKNOWN) {
> > pr_err("Unknown file lock!\n");
> > ret = -1;
> > @@ -1508,6 +1514,16 @@ int parse_file_locks(void)
> > goto err;
> > }
> >
> > + if (is_blocked) {
> > + /*
> > + * All target processes are stopped in this moment and
> > + * can't wait any locks.
> > + */
> > + pr_debug("Skip blocked processes\n");
> > + xfree(fl);
> > + goto err;
>
> Why goto err? I thought the intention is to just skip those.
You are right. Thanks.
>
> > + }
> > +
> > if ((fl->fl_kind == FL_POSIX) &&
> > !pid_in_pstree(fl->fl_owner)) {
> > /*
> > @@ -1519,26 +1535,6 @@ int parse_file_locks(void)
> > continue;
> > }
> >
> > - pr_info("lockinfo: %lld:%d %x %d %02x:%02x:%ld %lld %s\n",
> > - fl->fl_id, fl->fl_kind, fl->fl_ltype,
> > - fl->fl_owner, fl->maj, fl->min, fl->i_no,
> > - fl->start, fl->end);
> > -
> > - if (is_blocked) {
> > - /*
> > - * Here the task is in the pstree.
> > - * If it is blocked on a flock, when we try to
> > - * ptrace-seize it, the kernel will unblock task
> > - * from flock and will stop it in another place.
> > - * So in dumping, a blocked file lock should never
> > - * be here.
> > - */
> > - pr_perror("We have a blocked file lock!");
> > - ret = -1;
> > - xfree(fl);
> > - goto err;
> > - }
> > -
> > list_add_tail(&fl->list, &file_lock_list);
> > }
> >
> >
>
More information about the CRIU
mailing list