All of lore.kernel.org
 help / color / mirror / Atom feed
From: Oleg Nesterov <oleg@redhat.com>
To: Boaz Harrosh <bharrosh@panasas.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
	Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>,
	"Rafael J. Wysocki" <rjw@sisk.pl>,
	keyrings@linux-nfs.org, linux-security-module@vger.kernel.org,
	linux-fsdevel <linux-fsdevel@vger.kernel.org>,
	linux-kernel <linux-kernel@vger.kernel.org>,
	NFS list <linux-nfs@vger.kernel.org>,
	Trond Myklebust <Trond.Myklebust@netapp.com>,
	"Bhamare, Sachin" <sbhamare@panasas.com>,
	David Howells <dhowells@redhat.com>,
	Eric Paris <eparis@redhat.com>,
	"Srivatsa S. Bhat" <srivatsa.bhat@linux.vnet.ibm.com>,
	Kay Sievers <kay.sievers@vrfy.org>,
	James Morris <jmorris@namei.org>,
	"Eric W. Biederman" <ebiederm@xmission.com>,
	Greg KH <gregkh@linuxfoundation.org>,
	Rusty Russell <rusty@rustcorp.com.au>, Tejun Heo <tj@kernel.org>,
	David Rientjes <rientjes@google.com>
Subject: Re: [RFC 4/4] {RFC} kmod.c: Add new call_usermodehelper_timeout() API
Date: Thu, 22 Mar 2012 15:27:58 +0100	[thread overview]
Message-ID: <20120322142758.GA12370@redhat.com> (raw)
In-Reply-To: <4F6A92FC.6060702@panasas.com>

On 03/21, Boaz Harrosh wrote:
>
> > @@ -258,7 +262,8 @@ static void __call_usermodehelper(struct work_struct *work)
> >
> >  	switch (wait) {
> >  	case UMH_NO_WAIT:
> > -		call_usermodehelper_freeinfo(sub_info);
> > +		kref_put(&sub_info->kref,  call_usermodehelper_freeinfo);
> > +		kref_put(&sub_info->kref,  call_usermodehelper_freeinfo);
> >  		break;

This doesn't look very nice. If you add the refcounting, it should be
consistent. Imho it is better to change call_usermodehelper_exec() so
that UMH_NO_WAIT does kref_put() too. Just s/goto unlock/goto out/ afaics.

> > @@ -452,22 +459,27 @@ int call_usermodehelper_exec(struct subprocess_info *sub_info,
> >
> >  	sub_info->complete = &done;
> >  	sub_info->wait = wait;
> > +	if (!sub_info->wait_timeout)
> > +		sub_info->wait_timeout = MAX_SCHEDULE_TIMEOUT;
> >
> > +	/* Balanced in __call_usermodehelper or wait_for_helper */
> > +	kref_get(&sub_info->kref);
> >  	queue_work(khelper_wq, &sub_info->work);
> >  	if (wait == UMH_NO_WAIT)	/* task has freed sub_info */
> >  		goto unlock;
> > -	wait_for_completion(&done);
> > -	retval = sub_info->retval;
> > -
> > +	if (likely(wait_for_completion_timeout(&done, sub_info->wait_timeout)))
> > +		retval = sub_info->retval;
> > +	else
> > +		retval = -ETIMEDOUT;
> >  out:
> > -	call_usermodehelper_freeinfo(sub_info);
> > +	kref_put(&sub_info->kref, call_usermodehelper_freeinfo);
> >  unlock:
> >  	helper_unlock();
> >  	return retval;
> >  }

This looks obviously wrong. You also need to move *sub_info->complete
into subprocess_info.

> Author: Oleg Nesterov <oleg@redhat.com>
> Date:   Wed Mar 21 10:57:41 2012 +1100
>
>     usermodehelper: implement UMH_KILLABLE
>
>     Implement UMH_KILLABLE, should be used along with UMH_WAIT_EXEC/PROC.  The
>     caller must ensure that subprocess_info->path/etc can not go away until
>     call_usermodehelper_freeinfo().
> ...
>
> I think that my patch above does a much better/cleaner lifetime management of the
> subprocess_info struct, with the use of a kref.

This is subjective, you know ;) I specially tried to avoid the
refcounting.

In any case. I do not know why do we need timeout, but this is
orthogonal to KILLABLE. Please redo your patches on top of -mm
tree? Please note that in this case the change becomes trivial.

And please explain the use-case for the new API.

> Anyway I thought that we are not
> suppose to use xhcg() since it is not portable to all ARCHs. ;-)

Hmm. For example, exit_mm() does xchg().

Oleg.


WARNING: multiple messages have this Message-ID (diff)
From: Oleg Nesterov <oleg-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
To: Boaz Harrosh <bharrosh-C4P08NqkoRlBDgjK7y7TUQ@public.gmane.org>
Cc: Andrew Morton
	<akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org>,
	Tetsuo Handa
	<penguin-kernel-JPay3/Yim36HaxMnTkn67Xf5DAMn2ifp@public.gmane.org>,
	"Rafael J. Wysocki" <rjw-KKrjLPT3xs0@public.gmane.org>,
	keyrings-6DNke4IJHB0gsBAKwltoeQ@public.gmane.org,
	linux-security-module-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	linux-fsdevel
	<linux-fsdevel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
	linux-kernel
	<linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
	NFS list <linux-nfs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
	Trond Myklebust
	<Trond.Myklebust-HgOvQuBEEgTQT0dZR+AlfA@public.gmane.org>,
	"Bhamare,
	Sachin" <sbhamare-C4P08NqkoRlBDgjK7y7TUQ@public.gmane.org>,
	David Howells <dhowells-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>,
	Eric Paris <eparis-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>,
	"Srivatsa S. Bhat"
	<srivatsa.bhat-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>,
	Kay Sievers <kay.sievers-tD+1rO4QERM@public.gmane.org>,
	James Morris <jmorris-gx6/JNMH7DfYtjvyW6yDsg@public.gmane.org>,
	"Eric W. Biederman"
	<ebiederm-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org>,
	Greg KH
	<gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org>,
	Rusty Russell <rusty-8n+1lVoiYb80n/F98K4Iww@public.gmane.org>,
	Tejun Heo <tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>,
	David Rientjes <rientjes-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
Subject: Re: [RFC 4/4] {RFC} kmod.c: Add new call_usermodehelper_timeout() API
Date: Thu, 22 Mar 2012 15:27:58 +0100	[thread overview]
Message-ID: <20120322142758.GA12370@redhat.com> (raw)
In-Reply-To: <4F6A92FC.6060702-C4P08NqkoRlBDgjK7y7TUQ@public.gmane.org>

On 03/21, Boaz Harrosh wrote:
>
> > @@ -258,7 +262,8 @@ static void __call_usermodehelper(struct work_struct *work)
> >
> >  	switch (wait) {
> >  	case UMH_NO_WAIT:
> > -		call_usermodehelper_freeinfo(sub_info);
> > +		kref_put(&sub_info->kref,  call_usermodehelper_freeinfo);
> > +		kref_put(&sub_info->kref,  call_usermodehelper_freeinfo);
> >  		break;

This doesn't look very nice. If you add the refcounting, it should be
consistent. Imho it is better to change call_usermodehelper_exec() so
that UMH_NO_WAIT does kref_put() too. Just s/goto unlock/goto out/ afaics.

> > @@ -452,22 +459,27 @@ int call_usermodehelper_exec(struct subprocess_info *sub_info,
> >
> >  	sub_info->complete = &done;
> >  	sub_info->wait = wait;
> > +	if (!sub_info->wait_timeout)
> > +		sub_info->wait_timeout = MAX_SCHEDULE_TIMEOUT;
> >
> > +	/* Balanced in __call_usermodehelper or wait_for_helper */
> > +	kref_get(&sub_info->kref);
> >  	queue_work(khelper_wq, &sub_info->work);
> >  	if (wait == UMH_NO_WAIT)	/* task has freed sub_info */
> >  		goto unlock;
> > -	wait_for_completion(&done);
> > -	retval = sub_info->retval;
> > -
> > +	if (likely(wait_for_completion_timeout(&done, sub_info->wait_timeout)))
> > +		retval = sub_info->retval;
> > +	else
> > +		retval = -ETIMEDOUT;
> >  out:
> > -	call_usermodehelper_freeinfo(sub_info);
> > +	kref_put(&sub_info->kref, call_usermodehelper_freeinfo);
> >  unlock:
> >  	helper_unlock();
> >  	return retval;
> >  }

This looks obviously wrong. You also need to move *sub_info->complete
into subprocess_info.

> Author: Oleg Nesterov <oleg-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
> Date:   Wed Mar 21 10:57:41 2012 +1100
>
>     usermodehelper: implement UMH_KILLABLE
>
>     Implement UMH_KILLABLE, should be used along with UMH_WAIT_EXEC/PROC.  The
>     caller must ensure that subprocess_info->path/etc can not go away until
>     call_usermodehelper_freeinfo().
> ...
>
> I think that my patch above does a much better/cleaner lifetime management of the
> subprocess_info struct, with the use of a kref.

This is subjective, you know ;) I specially tried to avoid the
refcounting.

In any case. I do not know why do we need timeout, but this is
orthogonal to KILLABLE. Please redo your patches on top of -mm
tree? Please note that in this case the change becomes trivial.

And please explain the use-case for the new API.

> Anyway I thought that we are not
> suppose to use xhcg() since it is not portable to all ARCHs. ;-)

Hmm. For example, exit_mm() does xchg().

Oleg.

--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

  parent reply	other threads:[~2012-03-22 14:35 UTC|newest]

Thread overview: 62+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-03-20 23:18 [PATCHSET 0/4] kmod: Optional timeout on the wait in call_usermodehelper_exec Boaz Harrosh
2012-03-20 23:18 ` Boaz Harrosh
2012-03-20 23:23 ` [PATCH 1/4] kmod: Un-export call_usermodehelper_freeinfo() Boaz Harrosh
2012-03-20 23:23   ` Boaz Harrosh
2012-03-20 23:26 ` [PATCH 2/4] kmod: Convert two call sites to call_usermodehelper_fns() Boaz Harrosh
2012-03-20 23:26   ` Boaz Harrosh
2012-03-22  3:00   ` James Morris
2012-03-22  3:00     ` James Morris
2012-03-20 23:28 ` [PATCH 3/4] kmod: Move call_usermodehelper_fns() to .c file and unexport it's helpers Boaz Harrosh
2012-03-20 23:32 ` [RFC 4/4] {RFC} kmod.c: Add new call_usermodehelper_timeout() API Boaz Harrosh
2012-03-22  2:44   ` Boaz Harrosh
2012-03-22  2:48   ` Boaz Harrosh
2012-03-22  2:52     ` Boaz Harrosh
     [not found]       ` <201203241028.IGJ09825.MtOVFHFJQSLOFO@I-love.SAKURA.ne.jp>
     [not found]         ` <4F6D35F0.2020808@panasas.com>
     [not found]           ` <20120323200028.fadf49f8.akpm@linux-foundation.org>
     [not found]             ` <20120324145308.GA10023@redhat.com>
     [not found]               ` <201205191121.BIF57837.FHFOtMOLJQSOFV@I-love.SAKURA.ne.jp>
     [not found]                 ` <4FB7170F.7070807@panasas.com>
2012-05-21 17:01                   ` call_usermodehelper && check_hung_uninterruptible_tasks Oleg Nesterov
2012-05-21 18:24                     ` Oleg Nesterov
     [not found]                 ` <87fwau4aag.fsf@rustcorp.com.au>
2012-05-21 17:34                   ` UMH_WAIT_EXEC->UMH_WAIT_PROC deadlock Oleg Nesterov
2012-05-21 18:12                     ` Oleg Nesterov
2012-03-22 11:48     ` [RFC 4/4] {RFC} kmod.c: Add new call_usermodehelper_timeout()API Tetsuo Handa
2012-03-22 14:27     ` Oleg Nesterov [this message]
2012-03-22 14:27       ` [RFC 4/4] {RFC} kmod.c: Add new call_usermodehelper_timeout() API Oleg Nesterov
2012-03-22 14:42       ` Oleg Nesterov
2012-03-22 14:42         ` Oleg Nesterov
2012-03-22 19:08       ` Boaz Harrosh
2012-03-22 22:16         ` [RFC 4/4] {RFC} kmod.c: Add new call_usermodehelper_timeout()API Tetsuo Handa
2012-03-23  4:48           ` Boaz Harrosh
2012-03-23  5:23             ` Tetsuo Handa
2012-03-23  5:23               ` Tetsuo Handa
2012-03-23 16:30             ` Oleg Nesterov
2012-03-23 13:34         ` [RFC 4/4] {RFC} kmod.c: Add new call_usermodehelper_timeout() API Oleg Nesterov
2012-03-23 13:34           ` Oleg Nesterov
2012-03-21 15:35 ` [PATCHSET 0/4] kmod: Optional timeout on the wait in call_usermodehelper_exec Greg KH
2012-03-22  0:18   ` Boaz Harrosh
2012-03-22  0:31     ` Myklebust, Trond
2012-03-22  0:31       ` Myklebust, Trond
2012-03-22  0:31       ` Myklebust, Trond
2012-03-22  1:18       ` Boaz Harrosh
2012-03-27  1:57 ` [PATCHSET 0/6 version 2] " Boaz Harrosh
2012-03-27  2:00   ` [PATCH 1/6] kmod: Unexport call_usermodehelper_freeinfo() Boaz Harrosh
2012-03-27  2:00     ` Boaz Harrosh
2012-03-27  2:02   ` [PATCH 2/6] kmod: Convert two call sites to call_usermodehelper_fns() Boaz Harrosh
2012-03-27  2:04   ` [PATCH 3/6] kmod: Move call_usermodehelper_fns() to .c file and unexport all it's helpers Boaz Harrosh
2012-03-27  2:06   ` [PATCH 4/6 OPTION-A] completion: Add new wait_for_completion_timeout_state Boaz Harrosh
2012-03-27  2:06     ` Boaz Harrosh
2012-03-27  2:33     ` [PATCH 4/6 OPTION-A version 3] " Boaz Harrosh
2012-03-27  8:11       ` Peter Zijlstra
2012-03-27  8:11         ` Peter Zijlstra
2012-03-28 18:19         ` Boaz Harrosh
2012-03-28 18:19           ` Boaz Harrosh
2012-03-28 18:25           ` Peter Zijlstra
2012-03-28 18:25             ` Peter Zijlstra
2012-03-28 17:38       ` Oleg Nesterov
2012-03-27  2:09   ` [PATCH 4/6 option-B] kmod: add new wait_for_completion_timeout_state() helper Boaz Harrosh
2012-03-27  2:13   ` [PATCH 5/6] kmod: Add new call_usermodehelper_timeout() API Boaz Harrosh
2012-03-27 15:43     ` Oleg Nesterov
2012-03-27 15:43       ` Oleg Nesterov
2012-03-28 17:04       ` Oleg Nesterov
2012-03-27  2:15   ` [PATCH 6/6] kmod: optional: Convert the use of xchg to a kref Boaz Harrosh
2012-03-28 16:35     ` Oleg Nesterov
2012-03-27 21:07   ` [PATCHSET 0/6 version 2] kmod: Optional timeout on the wait in call_usermodehelper_exec Andrew Morton
2012-03-27 21:07     ` Andrew Morton
2012-03-28 20:19     ` Oleg Nesterov
2012-03-28 21:42       ` Boaz Harrosh

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=20120322142758.GA12370@redhat.com \
    --to=oleg@redhat.com \
    --cc=Trond.Myklebust@netapp.com \
    --cc=akpm@linux-foundation.org \
    --cc=bharrosh@panasas.com \
    --cc=dhowells@redhat.com \
    --cc=ebiederm@xmission.com \
    --cc=eparis@redhat.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=jmorris@namei.org \
    --cc=kay.sievers@vrfy.org \
    --cc=keyrings@linux-nfs.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-nfs@vger.kernel.org \
    --cc=linux-security-module@vger.kernel.org \
    --cc=penguin-kernel@I-love.SAKURA.ne.jp \
    --cc=rientjes@google.com \
    --cc=rjw@sisk.pl \
    --cc=rusty@rustcorp.com.au \
    --cc=sbhamare@panasas.com \
    --cc=srivatsa.bhat@linux.vnet.ibm.com \
    --cc=tj@kernel.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.