linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Marcelo Tosatti <marcelo@kvack.org>
To: Balbir Singh <balbir@linux.vnet.ibm.com>
Cc: Marcelo Tosatti <marcelo@kvack.org>,
	linux-mm@kvack.org, drepper@redhat.com, riel@redhat.com,
	akpm@linux-foundation.org, mbligh@mbligh.org,
	Gautham shenoy <ego@in.ibm.com>,
	roland@redhat.com
Subject: Re: [RFC] oom notifications via /dev/oom_notify
Date: Tue, 30 Oct 2007 18:16:35 -0400	[thread overview]
Message-ID: <20071030221635.GA643@dmt> (raw)
In-Reply-To: <47279A9D.70504@linux.vnet.ibm.com>

Hi Balbir, 

Last message was lacking details and clarity, sorry.

And yes, the OOM acronym is confusing since it usually refers to OOM
killer.. mem_notify sounds way better.

On Wed, Oct 31, 2007 at 02:27:01AM +0530, Balbir Singh wrote:

> > +void oom_check_fn(unsigned long unused)
> > +{
> > +	bool wake = 0;
> > +	unsigned int swapped_pages;
> > +
> > +	swapped_pages = sum_vm_event(PSWPOUT);
> > +	if (swapped_pages > prev_swapped_pages)
> > +		wake = 1;
> > +	prev_swapped_pages = swapped_pages;
> > +
> 
> Two comments
> 
> 1. So this is a rate growth function and continues to wake
>    up tasks as long as the rate of swapout keeps growing?"

Correct.

> 2. How will this function work in the absence of swap? Does
>   this feature work in the absence of swap?

In the absence of swap PSWPOUT does not increase, therefore the function
won't wake-up tasks.

> > +	oom_notify_status = wake;
> > +
> > +	if (wake)
> > +		wake_up_all(&oom_wait);
> > +
> > +	return;
> > +}
> > +
> > +static int oom_notify_open(struct inode *inode, struct file *file)
> > +{
> 
> Should we check current->oomkilladj before allowing open to proceed?
> 
> > +	spin_lock(&oom_notify_lock);
> > +	if (!oom_notify_users) {
> > +		oom_notify_status = 0;
> > +		oom_check_timer.expires = jiffies + msecs_to_jiffies(1000);
> 
> A more meaningful name for 1000, here please?

Fixed.

> > +		mod_timer(&oom_check_timer, oom_check_timer.expires);
> > +	}
> > +	oom_notify_users++;
> > +	spin_unlock(&oom_notify_lock);
> > +
> > +	return 0;
> > +}
> > +
> > +static int oom_notify_release(struct inode *inode, struct file *file)
> > +{
> > +	spin_lock(&oom_notify_lock);
> > +	oom_notify_users--;
> > +	if (!oom_notify_users) {
> > +		del_timer(&oom_check_timer);
> > +		oom_notify_status = 0;
> > +	}
> > +	spin_unlock(&oom_notify_lock);
> > +	return 0;
> > +}
> > +
> > +static unsigned int oom_notify_poll(struct file *file, poll_table *wait)
> > +{
> > +	unsigned int val = 0;
> > +	struct zone *zone;
> > +	int cz_idx = zone_idx(NODE_DATA(nid)->node_zonelists->zones[0]);
> > +
> > +	poll_wait(file, &oom_wait, wait);
> > +
> > +	if (oom_notify_status)
> > +		val = POLLIN;
> > +
> > +	for_each_zone(zone) {
> > +		if (!populated_zone(zone))
> > +			continue;	
> > +		if (!zone_watermark_ok(zone, 0, zone->pages_low, cz_idx, 0)) {
> > +			val = POLLIN;
> > +			break;
> > +		}
> > +	}
> > +
> > +	return val;
> > +}
> > +
> > +struct file_operations oom_notify_fops = {
> > +	.open = oom_notify_open,
> > +	.release = oom_notify_release,
> > +	.poll = oom_notify_poll,
> > +};
> 
> Can we also implement a oom_notify_read() function, so that a read on
> /dev/oom_notify will give the reason for returning on select on
> /dev/oom_notify.

There are two different notifications:

1) normal memory shortage, allowing userspace to intelligently free
data.

2) critical memory shortage, allowing userspace to take an action before
the OOM killer kicks in.

1 is a fast path AND the large majority of applications only care
about it anyway... which means that I see little value on reporting
both events via the same descriptor.

However, that might be bullshit?

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

  reply	other threads:[~2007-10-30 22:16 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-10-30 19:18 [RFC] oom notifications via /dev/oom_notify Marcelo Tosatti
2007-10-30 20:57 ` Balbir Singh
2007-10-30 22:16   ` Marcelo Tosatti [this message]
2007-10-30 21:00 ` Rik van Riel
2007-10-30 21:07 ` Marcelo Tosatti
2007-10-30 21:19   ` Rik van Riel
2007-10-30 22:26     ` Marcelo Tosatti
2007-10-31 17:20   ` Dave Jones
2007-11-01 23:58     ` Marcelo Tosatti
2007-10-30 21:59 ` Badari Pulavarty
2007-10-30 21:12   ` Rik van Riel
2007-10-31  4:17     ` Badari
2007-10-31  4:31       ` Rik van Riel
2007-10-31 17:01         ` Badari Pulavarty
2007-10-31 16:15           ` Rik van Riel
2007-10-31  5:38       ` Balbir Singh

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=20071030221635.GA643@dmt \
    --to=marcelo@kvack.org \
    --cc=akpm@linux-foundation.org \
    --cc=balbir@linux.vnet.ibm.com \
    --cc=drepper@redhat.com \
    --cc=ego@in.ibm.com \
    --cc=linux-mm@kvack.org \
    --cc=mbligh@mbligh.org \
    --cc=riel@redhat.com \
    --cc=roland@redhat.com \
    /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;
as well as URLs for NNTP newsgroup(s).