mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Matt Helsley <matthltc@us.ibm.com>
To: "Kirill A. Shutemov" <kirill@shutemov.name>
Cc: Matt Helsley <matthltc@us.ibm.com>,
	jacob.jun.pan@linux.intel.com,
	LKML <linux-kernel@vger.kernel.org>,
	Arjan van de Ven <arjan@linux.intel.com>,
	container cgroup <containers@lists.linux-foundation.org>,
	Li Zefan <lizf@cn.fujitsu.com>, Paul Menage <menage@google.com>,
	akpm@linux-foundation.org, rdunlap@xenotime.net,
	Cedric Le Goater <clg@vnet.ibm.com>,
	Wysocki Rafael Wysocki <rjw@sisk.pl>
Subject: Re: [PATCH 1/1, v6] cgroup/freezer: add per freezer duty ratio control
Date: Thu, 10 Feb 2011 10:58:52 -0800	[thread overview]
Message-ID: <20110210185851.GH16432@count0.beaverton.ibm.com> (raw)
In-Reply-To: <20110210091522.GA28511@shutemov.name>

On Thu, Feb 10, 2011 at 11:15:22AM +0200, Kirill A. Shutemov wrote:
> On Wed, Feb 09, 2011 at 07:04:42PM -0800, Matt Helsley wrote:
> > > +{
> > > +	struct cgroup *cgroup = (struct cgroup *)data;
> > > +	struct freezer *freezer = cgroup_freezer(cgroup);
> > > +
> > > +	do {
> > > +		if (freezer->duty.ratio < 100 && freezer->duty.ratio > 0 &&
> > > +			freezer->duty.period_pct_ms) {
> > > +			if (try_to_freeze_cgroup(cgroup, freezer))
> > > +				pr_info("cannot freeze\n");
> > > +			msleep(freezer->duty.period_pct_ms *
> > > +				freezer->duty.ratio);
> > > +			unfreeze_cgroup(cgroup, freezer);
> > > +			msleep(freezer->duty.period_pct_ms *
> > > +				(100 - freezer->duty.ratio));
> > > +		} else {
> > > +			sleep_on(&freezer_wait);
> > > +			pr_debug("freezer thread wake up\n");
> > > +		}
> > > +	} while (!kthread_should_stop());
> > > +	return 0;
> > > +}
> > 
> > Seems to me you could avoid the thread-per-cgroup overhead and the
> > sleep-loop code by using one timer-per-cgroup. When the timer expires
> > you freeze/thaw the cgroup associated with the timer, setup the next
> > wakeup timer, and use only one kernel thread to do it all. If you
> > use workqueues you might even avoid the single kernel thread.
> > 
> > Seems to me like that'd be a good fit for embedded devices.
> 
> I proposed to use delayed workqueues (schedule_delayed_work()).

Even better.

> 
> > > +#define FREEZER_KH_PREFIX  "freezer_"
> > > +static int freezer_write_param(struct cgroup *cgroup, struct cftype *cft,
> > > +		u64 val)
> > > +{
> > > +	struct freezer *freezer;
> > > +	char thread_name[32];
> > > +	int ret = 0;
> > > +
> > > +	freezer = cgroup_freezer(cgroup);
> > > +
> > > +	if (!cgroup_lock_live_group(cgroup))
> > > +		return -ENODEV;
> > > +
> > > +	switch (cft->private) {
> > > +	case FREEZER_DUTY_RATIO:
> > > +		if (val >= 100 || val < 0) {
> > > +			ret = -EINVAL;
> > > +			goto exit;
> > > +		}
> > > +		freezer->duty.ratio = val;
> > 
> > Why can't val == 100? At that point it's always THAWED and no kernel
> > thread is necessary (just like at 0 it's always FROZEN and no kernel
> > thread is necessary).
> 
> val == 100 is interface abuse, I think. I just turn off the feature, if
> you want.

And how is userspace supposed to do that at runtime if we can't disable
it by writing to the state file (see below)? Then I don't see anyway
to get rid of the duty cycling unless you clear out the cgroup and
recreate it.

Frankly, I think 0 and 100 percent aren't interface abuse. Anybody
who knows it's a percent value will naturally try to put 0 or 100
there.

> > >  static struct cftype files[] = {
> > >  	{
> > >  		.name = "state",
> > >  		.read_seq_string = freezer_read,
> > >  		.write_string = freezer_write,
> > 
> > It's not clear what should happen when userspace writes the state
> > file after writing a duty_ratio_pct.
> 
> It should return -EBUSY, I think.

Ahh, that is another solution I hadn't considered. That further proves my
point though :). It's not obvious what should happen and that's a red-flag
that we're defining policy and should be careful which solution we select.

> 
> > >  	},
> > > +	{
> > > +		.name = "duty_ratio_pct",
> > > +		.private = FREEZER_DUTY_RATIO,
> > > +		.read_u64 = freezer_read_duty_ratio,
> > > +		.write_u64 = freezer_write_param,
> > > +	},
> > 
> > nit: Why use a u64 for a value that can only be 0-100? (or perhaps
> > 0-1000 if you wanted sub-1% granularity...)
> 
> .read_u64/.write_64 is a standard cgroup's interface.

Oops -- I was thinking there was a smaller variant of these.

Cheers,
	-Matt Helsley

  reply	other threads:[~2011-02-10 19:00 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-02-09  1:05 jacob.jun.pan
2011-02-09  3:07 ` Li Zefan
2011-02-09 18:16   ` jacob pan
2011-02-10  1:26     ` Li Zefan
2011-02-10  4:43       ` jacob pan
2011-02-10  4:51   ` jacob pan
2011-02-10  3:04 ` Matt Helsley
2011-02-10  3:06   ` Arjan van de Ven
2011-02-10 19:11     ` Matt Helsley
2011-02-10 22:22       ` jacob pan
2011-02-10 22:43         ` Matt Helsley
2011-02-14 18:03     ` Vaidyanathan Srinivasan
2011-02-10  9:15   ` Kirill A. Shutemov
2011-02-10 18:58     ` Matt Helsley [this message]
2011-02-10 23:06   ` Jacob Pan

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=20110210185851.GH16432@count0.beaverton.ibm.com \
    --to=matthltc@us.ibm.com \
    --cc=akpm@linux-foundation.org \
    --cc=arjan@linux.intel.com \
    --cc=clg@vnet.ibm.com \
    --cc=containers@lists.linux-foundation.org \
    --cc=jacob.jun.pan@linux.intel.com \
    --cc=kirill@shutemov.name \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lizf@cn.fujitsu.com \
    --cc=menage@google.com \
    --cc=rdunlap@xenotime.net \
    --cc=rjw@sisk.pl \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®