All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mel Gorman <mel@csn.ul.ie>
To: Minchan Kim <minchan.kim@gmail.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
	linux-mm <linux-mm@kvack.org>,
	LKML <linux-kernel@vger.kernel.org>,
	Peter Zijlstra <peterz@infradead.org>,
	Rik van Riel <riel@redhat.com>,
	KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>,
	Johannes Weiner <hannes@cmpxchg.org>,
	Nick Piggin <npiggin@kernel.dk>
Subject: Re: [RFC 1/2] deactive invalidated pages
Date: Wed, 24 Nov 2010 10:02:42 +0000	[thread overview]
Message-ID: <20101124100242.GW19571@csn.ul.ie> (raw)
In-Reply-To: <AANLkTi=KunDRwVd73vtbng0F+a=QBgJeV5BXrewYJa3R@mail.gmail.com>

On Wed, Nov 24, 2010 at 08:24:35AM +0900, Minchan Kim wrote:
> >> <SNIP>
> >>
> >> +static void __pagevec_lru_deactive(struct pagevec *pvec)
> >> +{
> >
> > Might be worth commenting that this function must be called with pre-emption
> > disabled. FWIW, I am reasonably sure your implementation is prefectly safe
> > but a note wouldn't hurt.
> 
> Will fix.
> 

Thanks

> >
> >> +     int i, lru, file;
> >> +
> >> +     struct zone *zone = NULL;
> >> +
> >> +     for (i = 0; i < pagevec_count(pvec); i++) {
> >> +             struct page *page = pvec->pages[i];
> >> +             struct zone *pagezone = page_zone(page);
> >> +
> >> +             if (pagezone != zone) {
> >> +                     if (zone)
> >> +                             spin_unlock_irq(&zone->lru_lock);
> >> +                     zone = pagezone;
> >> +                     spin_lock_irq(&zone->lru_lock);
> >> +             }
> >> +
> >> +             if (PageLRU(page)) {
> >> +                     if (PageActive(page)) {
> >> +                             file = page_is_file_cache(page);
> >> +                             lru = page_lru_base_type(page);
> >> +                             del_page_from_lru_list(zone, page,
> >> +                                             lru + LRU_ACTIVE);
> >> +                             ClearPageActive(page);
> >> +                             ClearPageReferenced(page);
> >> +                             add_page_to_lru_list(zone, page, lru);
> >> +                             __count_vm_event(PGDEACTIVATE);
> >> +
> >
> > What about memcg, do we not need to be calling mem_cgroup_add_lru_list() here
> > as well? I'm looking at the differences between what move_active_pages_to_lru()
> 
> Recently, add_page_to_lru_list contains mem_cgroup_add_lru_list.
> 

My bad, you're right. I was thrown by move_active_pages_to_lru() needing to
do memcg stuff manually and didn't spot why it ok to miss it here.

> > is doing and this. I'm wondering if it'd be worth your whole building a list
> > of active pages that are to be moved to the inactive list and passing them
> > to move_active_pages_to_lru() ? I confuess I have not thought about it deeply
> > so it might be a terrible suggestion but it might reduce duplication of code.
> 
> Firstly I tried it so I sent a patch about making
> move_to_active_pages_to_lru more generic.
> move_to_active_pages_to_lru needs zone argument so I need gathering
> pages per zone in truncate.
> I don't want for user of the function to consider even zone and
> zone->lru_lock handling.
> 
> I think the lru_demote_pages could be used elsewhere(ex, readahead max
> size heuristic).
> So it's generic and easy to use. :)
> 

Ok, that's fair enough.

> >
> >> +                             update_page_reclaim_stat(zone, page, file, 0);
> >> +                     }
> >> +             }
> >> +     }
> >> +     if (zone)
> >> +             spin_unlock_irq(&zone->lru_lock);
> >> +
> >> +     release_pages(pvec->pages, pvec->nr, pvec->cold);
> >> +     pagevec_reinit(pvec);
> >> +}
> >> +
> >>  /*
> >>   * Drain pages out of the cpu's pagevecs.
> >>   * Either "cpu" is the current CPU, and preemption has already been
> >> @@ -292,8 +333,28 @@ static void drain_cpu_pagevecs(int cpu)
> >>               pagevec_move_tail(pvec);
> >>               local_irq_restore(flags);
> >>       }
> >> +
> >> +     pvec = &per_cpu(lru_deactive_pvecs, cpu);
> >> +     if (pagevec_count(pvec))
> >> +             __pagevec_lru_deactive(pvec);
> >> +}
> >> +
> >> +/*
> >> + * Function used to forecefully demote a page to the head of the inactive
> >> + * list.
> >
> > s/forecefully/forcefully/
> >
> > The comment should also state *why* and under what circumstances we move
> > pages to the inactive list like this. Also based on the discussions
> > elsewhere in this thread, it'd be nice to include a comment why it's the
> > head of the inactive list and not the tail.
> 
> Fair enough.
> 
> Thanks for the comment, Mel.
> 
> -- 
> Kind regards,
> Minchan Kim
> 

-- 
Mel Gorman
Part-time Phd Student                          Linux Technology Center
University of Limerick                         IBM Dublin Software Lab

WARNING: multiple messages have this Message-ID (diff)
From: Mel Gorman <mel@csn.ul.ie>
To: Minchan Kim <minchan.kim@gmail.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
	linux-mm <linux-mm@kvack.org>,
	LKML <linux-kernel@vger.kernel.org>,
	Peter Zijlstra <peterz@infradead.org>,
	Rik van Riel <riel@redhat.com>,
	KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>,
	Johannes Weiner <hannes@cmpxchg.org>,
	Nick Piggin <npiggin@kernel.dk>
Subject: Re: [RFC 1/2] deactive invalidated pages
Date: Wed, 24 Nov 2010 10:02:42 +0000	[thread overview]
Message-ID: <20101124100242.GW19571@csn.ul.ie> (raw)
In-Reply-To: <AANLkTi=KunDRwVd73vtbng0F+a=QBgJeV5BXrewYJa3R@mail.gmail.com>

On Wed, Nov 24, 2010 at 08:24:35AM +0900, Minchan Kim wrote:
> >> <SNIP>
> >>
> >> +static void __pagevec_lru_deactive(struct pagevec *pvec)
> >> +{
> >
> > Might be worth commenting that this function must be called with pre-emption
> > disabled. FWIW, I am reasonably sure your implementation is prefectly safe
> > but a note wouldn't hurt.
> 
> Will fix.
> 

Thanks

> >
> >> +     int i, lru, file;
> >> +
> >> +     struct zone *zone = NULL;
> >> +
> >> +     for (i = 0; i < pagevec_count(pvec); i++) {
> >> +             struct page *page = pvec->pages[i];
> >> +             struct zone *pagezone = page_zone(page);
> >> +
> >> +             if (pagezone != zone) {
> >> +                     if (zone)
> >> +                             spin_unlock_irq(&zone->lru_lock);
> >> +                     zone = pagezone;
> >> +                     spin_lock_irq(&zone->lru_lock);
> >> +             }
> >> +
> >> +             if (PageLRU(page)) {
> >> +                     if (PageActive(page)) {
> >> +                             file = page_is_file_cache(page);
> >> +                             lru = page_lru_base_type(page);
> >> +                             del_page_from_lru_list(zone, page,
> >> +                                             lru + LRU_ACTIVE);
> >> +                             ClearPageActive(page);
> >> +                             ClearPageReferenced(page);
> >> +                             add_page_to_lru_list(zone, page, lru);
> >> +                             __count_vm_event(PGDEACTIVATE);
> >> +
> >
> > What about memcg, do we not need to be calling mem_cgroup_add_lru_list() here
> > as well? I'm looking at the differences between what move_active_pages_to_lru()
> 
> Recently, add_page_to_lru_list contains mem_cgroup_add_lru_list.
> 

My bad, you're right. I was thrown by move_active_pages_to_lru() needing to
do memcg stuff manually and didn't spot why it ok to miss it here.

> > is doing and this. I'm wondering if it'd be worth your whole building a list
> > of active pages that are to be moved to the inactive list and passing them
> > to move_active_pages_to_lru() ? I confuess I have not thought about it deeply
> > so it might be a terrible suggestion but it might reduce duplication of code.
> 
> Firstly I tried it so I sent a patch about making
> move_to_active_pages_to_lru more generic.
> move_to_active_pages_to_lru needs zone argument so I need gathering
> pages per zone in truncate.
> I don't want for user of the function to consider even zone and
> zone->lru_lock handling.
> 
> I think the lru_demote_pages could be used elsewhere(ex, readahead max
> size heuristic).
> So it's generic and easy to use. :)
> 

Ok, that's fair enough.

> >
> >> +                             update_page_reclaim_stat(zone, page, file, 0);
> >> +                     }
> >> +             }
> >> +     }
> >> +     if (zone)
> >> +             spin_unlock_irq(&zone->lru_lock);
> >> +
> >> +     release_pages(pvec->pages, pvec->nr, pvec->cold);
> >> +     pagevec_reinit(pvec);
> >> +}
> >> +
> >>  /*
> >>   * Drain pages out of the cpu's pagevecs.
> >>   * Either "cpu" is the current CPU, and preemption has already been
> >> @@ -292,8 +333,28 @@ static void drain_cpu_pagevecs(int cpu)
> >>               pagevec_move_tail(pvec);
> >>               local_irq_restore(flags);
> >>       }
> >> +
> >> +     pvec = &per_cpu(lru_deactive_pvecs, cpu);
> >> +     if (pagevec_count(pvec))
> >> +             __pagevec_lru_deactive(pvec);
> >> +}
> >> +
> >> +/*
> >> + * Function used to forecefully demote a page to the head of the inactive
> >> + * list.
> >
> > s/forecefully/forcefully/
> >
> > The comment should also state *why* and under what circumstances we move
> > pages to the inactive list like this. Also based on the discussions
> > elsewhere in this thread, it'd be nice to include a comment why it's the
> > head of the inactive list and not the tail.
> 
> Fair enough.
> 
> Thanks for the comment, Mel.
> 
> -- 
> Kind regards,
> Minchan Kim
> 

-- 
Mel Gorman
Part-time Phd Student                          Linux Technology Center
University of Limerick                         IBM Dublin Software Lab

--
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/ .
Fight unfair telecom policy in Canada: sign http://dissolvethecrtc.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

  reply	other threads:[~2010-11-24 10:03 UTC|newest]

Thread overview: 108+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-11-21 14:30 [RFC 1/2] deactive invalidated pages Minchan Kim
2010-11-21 14:30 ` Minchan Kim
2010-11-21 14:30 ` [RFC 2/2] Prevent promotion of page in madvise_dontneed Minchan Kim
2010-11-21 14:30   ` Minchan Kim
2010-11-21 14:38   ` Minchan Kim
2010-11-21 14:38     ` Minchan Kim
2010-11-21 16:34   ` Ben Gamari
2010-11-21 16:34     ` Ben Gamari
2010-11-22  0:31     ` Minchan Kim
2010-11-22  0:31       ` Minchan Kim
2010-11-22 22:21   ` Andrew Morton
2010-11-22 22:21     ` Andrew Morton
2010-11-23  4:57     ` Minchan Kim
2010-11-23  4:57       ` Minchan Kim
2010-11-23  9:50     ` Mel Gorman
2010-11-23  9:50       ` Mel Gorman
2010-11-23 23:49       ` Minchan Kim
2010-11-23 23:49         ` Minchan Kim
2010-11-21 15:21 ` [RFC 1/2] deactive invalidated pages Ben Gamari
2010-11-21 15:21   ` Ben Gamari
2010-11-23  7:16   ` KOSAKI Motohiro
2010-11-23  7:16     ` KOSAKI Motohiro
2010-11-23 13:48     ` Ben Gamari
2010-11-23 13:48       ` Ben Gamari
2010-11-23 23:48       ` Minchan Kim
2010-11-23 23:48         ` Minchan Kim
2010-11-23 14:49     ` [RFC PATCH] fadvise support in rsync Ben Gamari
2010-11-23 14:49       ` Ben Gamari
2010-11-23 15:35       ` Pádraig Brady
2010-11-23 15:35         ` Pádraig Brady
2010-11-24  0:17       ` KOSAKI Motohiro
2010-11-24  0:17         ` KOSAKI Motohiro
2010-11-23 14:49     ` [PATCH 1/3] Add fadvise interface wrapper Ben Gamari
2010-11-23 14:49       ` Ben Gamari
2010-11-23 14:49     ` [PATCH 2/3] Inform kernel of FADV_DONTNEED hint in sender Ben Gamari
2010-11-23 14:49       ` Ben Gamari
2010-11-23 14:49     ` [PATCH 3/3] Inform kernel of FADV_DONTNEED hint in receiver Ben Gamari
2010-11-23 14:49       ` Ben Gamari
2010-11-22  1:17 ` [RFC 1/2] deactive invalidated pages Rik van Riel
2010-11-22  1:17   ` Rik van Riel
2010-11-22 22:14 ` Andrew Morton
2010-11-22 22:14   ` Andrew Morton
2010-11-23  4:52   ` Minchan Kim
2010-11-23  4:52     ` Minchan Kim
2010-11-23  5:01     ` Andrew Morton
2010-11-23  5:01       ` Andrew Morton
2010-11-23  5:23       ` Minchan Kim
2010-11-23  5:23         ` Minchan Kim
2010-11-23  5:22         ` Andrew Morton
2010-11-23  5:22           ` Andrew Morton
2010-11-23  5:45           ` Minchan Kim
2010-11-23  5:45             ` Minchan Kim
2010-11-23  5:48             ` Andrew Morton
2010-11-23  5:48               ` Andrew Morton
2010-11-23  6:05               ` Minchan Kim
2010-11-23  6:05                 ` Minchan Kim
2010-11-23  7:15                 ` Andrew Morton
2010-11-23  7:15                   ` Andrew Morton
2010-11-23  7:44                   ` Minchan Kim
2010-11-23  7:44                     ` Minchan Kim
2010-11-23  7:53                     ` Andrew Morton
2010-11-23  7:53                       ` Andrew Morton
2010-11-23  8:02                       ` Minchan Kim
2010-11-23  8:02                         ` Minchan Kim
2010-11-23  9:43               ` Mel Gorman
2010-11-23  9:43                 ` Mel Gorman
2010-11-23 23:32                 ` Minchan Kim
2010-11-23 23:32                   ` Minchan Kim
2010-11-23  9:38       ` Mel Gorman
2010-11-23  9:38         ` Mel Gorman
2010-11-23 14:55         ` Ben Gamari
2010-11-23 14:55           ` Ben Gamari
2010-11-23 14:58           ` Mel Gorman
2010-11-23 14:58             ` Mel Gorman
2010-11-23 20:35             ` Andrew Morton
2010-11-23 20:35               ` Andrew Morton
2010-11-23 22:10               ` Mel Gorman
2010-11-23 22:10                 ` Mel Gorman
2010-11-23 23:45                 ` Minchan Kim
2010-11-23 23:45                   ` Minchan Kim
2010-11-24 18:01                   ` Mel Gorman
2010-11-24 18:01                     ` Mel Gorman
2010-11-23  7:16 ` KOSAKI Motohiro
2010-11-23  7:16   ` KOSAKI Motohiro
2010-11-23  7:40   ` Minchan Kim
2010-11-23  7:40     ` Minchan Kim
2010-11-23  7:42     ` Andrew Morton
2010-11-23  7:42       ` Andrew Morton
2010-11-23  8:01     ` KOSAKI Motohiro
2010-11-23  8:01       ` KOSAKI Motohiro
2010-11-23  8:44       ` Minchan Kim
2010-11-23  8:44         ` Minchan Kim
2010-11-23  9:02         ` KOSAKI Motohiro
2010-11-23  9:02           ` KOSAKI Motohiro
2010-11-23  9:05           ` Minchan Kim
2010-11-23  9:05             ` Minchan Kim
2010-11-23  9:07             ` Minchan Kim
2010-11-23  9:07               ` Minchan Kim
2010-11-23 14:57   ` Ben Gamari
2010-11-23 14:57     ` Ben Gamari
2010-11-24  0:13     ` KOSAKI Motohiro
2010-11-24  0:13       ` KOSAKI Motohiro
2010-11-23  9:28 ` Mel Gorman
2010-11-23  9:28   ` Mel Gorman
2010-11-23 23:24   ` Minchan Kim
2010-11-23 23:24     ` Minchan Kim
2010-11-24 10:02     ` Mel Gorman [this message]
2010-11-24 10:02       ` Mel Gorman

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=20101124100242.GW19571@csn.ul.ie \
    --to=mel@csn.ul.ie \
    --cc=akpm@linux-foundation.org \
    --cc=hannes@cmpxchg.org \
    --cc=kosaki.motohiro@jp.fujitsu.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=minchan.kim@gmail.com \
    --cc=npiggin@kernel.dk \
    --cc=peterz@infradead.org \
    --cc=riel@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 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.