From: Rafael Aquini <aquini@redhat.com>
To: Minchan Kim <minchan@kernel.org>
Cc: linux-mm@kvack.org, Rik van Riel <riel@redhat.com>,
Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
"Michael S. Tsirkin" <mst@redhat.com>,
linux-kernel@vger.kernel.org,
virtualization@lists.linux-foundation.org,
Andi Kleen <andi@firstfloor.org>,
Andrew Morton <akpm@linux-foundation.org>
Subject: Re: [PATCH v2 1/4] mm: introduce compaction and migration for virtio ballooned pages
Date: Fri, 29 Jun 2012 22:34:48 -0300 [thread overview]
Message-ID: <20120630013447.GA1545@x61.redhat.com> (raw)
In-Reply-To: <20120629220333.GA2079@barrios>
Howdy Minchan,
On Sat, Jun 30, 2012 at 07:03:33AM +0900, Minchan Kim wrote:
> > > > +static inline bool is_balloon_page(struct page *page)
> > > > +{
> > > > + return (page->mapping == balloon_mapping) ? true : false;
> > > > +}
> > >
> > >
> > > What lock should it protect?
> > >
> > I'm afraid I didn't quite get what you meant by that question. If you were
> > referring to lock protection to the address_space balloon_mapping, we don't need
> > it. balloon_mapping, once initialized lives forever (as long as driver is
> > loaded, actually) as a static reference that just helps us on identifying pages
> > that are enlisted in a memory balloon as well as it keeps the callback pointers
> > to functions that will make those pages mobility magic happens.
>
> Thanks. That's what I want to know.
> If anyone(like me don't know of ballooning in detail) see this, it would be very helpful.
>
Good point! I'll make sure this explanation gets properly registered either at commit log or
at a comment along with balloon_mapping declaration, then.
> > > > + if (likely(PageLRU(page))) {
> > >
> > >
> > > We can't make sure it is likely because there might be so many pages for kernel.
> > >
> > I thought that by that far in codepath that would be the likelihood since most
> > pages of an ordinary workload will be at LRU lists. Following that idea, it
> > sounded neat to hint the compiler to not branch for that block. But, if in the
> > end that is just a "bad hint", I'll get rid of it right away.
>
> Yeb. I hope you remove this.
> If you want really, it should be separated patch because it's not related to your
> series.
>
That will be removed, then.
> > > > +/* __isolate_lru_page() counterpart for a ballooned page */
> > > > +bool isolate_balloon_page(struct page *page)
> > > > +{
> > > > + if (WARN_ON(!is_balloon_page(page)))
> > > > + return false;
> > > > +
> > > > + if (likely(get_page_unless_zero(page))) {
> > > > + /*
> > > > + * We can race against move_to_new_page() & __unmap_and_move().
> > > > + * If we stumble across a locked balloon page and succeed on
> > > > + * isolating it, the result tends to be disastrous.
> > > > + */
> > > > + if (likely(trylock_page(page))) {
> > > > + /*
> > > > + * A ballooned page, by default, has just one refcount.
> > > > + * Prevent concurrent compaction threads from isolating
> > > > + * an already isolated balloon page.
> > > > + */
> > > > + if (is_balloon_page(page) && (page_count(page) == 2)) {
> > > > + page->mapping->a_ops->invalidatepage(page, 0);
> > >
> > >
> > > Could you add more meaningful name wrapping raw invalidatepage?
> > > But I don't know what is proper name. ;)
> > >
> > If I understood you correctely, your suggestion is to add two extra callback
> > pointers to struct address_space_operations, instead of re-using those which are
> > already there, and are suitable for the mission. Is this really necessary? It
> > seems just like unecessary bloat to struct address_space_operations, IMHO.
>
> I meant this. :)
>
> void isolate_page_from_balloonlist(struct page* page)
> {
> page->mapping->a_ops->invalidatepage(page, 0);
> }
>
> if (is_balloon_page(page) && (page_count(page) == 2)) {
> isolate_page_from_balloonlist(page);
> }
>
Humm, my feelings on your approach here: just an unecessary indirection that
doesn't bring the desired code readability improvement.
If the header comment statement on balloon_mapping->a_ops is not clear enough
on those methods usage for ballooned pages:
.....
/*
* Balloon pages special page->mapping.
* users must properly allocate and initialize an instance of balloon_mapping,
* and set it as the page->mapping for balloon enlisted page instances.
*
* address_space_operations necessary methods for ballooned pages:
* .migratepage - used to perform balloon's page migration (as is)
* .invalidatepage - used to isolate a page from balloon's page list
* .freepage - used to reinsert an isolated page to balloon's page list
*/
struct address_space *balloon_mapping;
EXPORT_SYMBOL_GPL(balloon_mapping);
.....
I can add an extra commentary, to recollect folks about that usage, next to the
points where those callbacks are used at isolate_balloon_page() &
putback_balloon_page(). What do you think?
> Thanks!
>
Thank you for such attention and valuable feedback! Have a nice weekend!
Rafael
--
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>
WARNING: multiple messages have this Message-ID (diff)
From: Rafael Aquini <aquini@redhat.com>
To: Minchan Kim <minchan@kernel.org>
Cc: linux-mm@kvack.org, Rik van Riel <riel@redhat.com>,
Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
"Michael S. Tsirkin" <mst@redhat.com>,
linux-kernel@vger.kernel.org,
virtualization@lists.linux-foundation.org,
Andi Kleen <andi@firstfloor.org>,
Andrew Morton <akpm@linux-foundation.org>
Subject: Re: [PATCH v2 1/4] mm: introduce compaction and migration for virtio ballooned pages
Date: Fri, 29 Jun 2012 22:34:48 -0300 [thread overview]
Message-ID: <20120630013447.GA1545@x61.redhat.com> (raw)
In-Reply-To: <20120629220333.GA2079@barrios>
Howdy Minchan,
On Sat, Jun 30, 2012 at 07:03:33AM +0900, Minchan Kim wrote:
> > > > +static inline bool is_balloon_page(struct page *page)
> > > > +{
> > > > + return (page->mapping == balloon_mapping) ? true : false;
> > > > +}
> > >
> > >
> > > What lock should it protect?
> > >
> > I'm afraid I didn't quite get what you meant by that question. If you were
> > referring to lock protection to the address_space balloon_mapping, we don't need
> > it. balloon_mapping, once initialized lives forever (as long as driver is
> > loaded, actually) as a static reference that just helps us on identifying pages
> > that are enlisted in a memory balloon as well as it keeps the callback pointers
> > to functions that will make those pages mobility magic happens.
>
> Thanks. That's what I want to know.
> If anyone(like me don't know of ballooning in detail) see this, it would be very helpful.
>
Good point! I'll make sure this explanation gets properly registered either at commit log or
at a comment along with balloon_mapping declaration, then.
> > > > + if (likely(PageLRU(page))) {
> > >
> > >
> > > We can't make sure it is likely because there might be so many pages for kernel.
> > >
> > I thought that by that far in codepath that would be the likelihood since most
> > pages of an ordinary workload will be at LRU lists. Following that idea, it
> > sounded neat to hint the compiler to not branch for that block. But, if in the
> > end that is just a "bad hint", I'll get rid of it right away.
>
> Yeb. I hope you remove this.
> If you want really, it should be separated patch because it's not related to your
> series.
>
That will be removed, then.
> > > > +/* __isolate_lru_page() counterpart for a ballooned page */
> > > > +bool isolate_balloon_page(struct page *page)
> > > > +{
> > > > + if (WARN_ON(!is_balloon_page(page)))
> > > > + return false;
> > > > +
> > > > + if (likely(get_page_unless_zero(page))) {
> > > > + /*
> > > > + * We can race against move_to_new_page() & __unmap_and_move().
> > > > + * If we stumble across a locked balloon page and succeed on
> > > > + * isolating it, the result tends to be disastrous.
> > > > + */
> > > > + if (likely(trylock_page(page))) {
> > > > + /*
> > > > + * A ballooned page, by default, has just one refcount.
> > > > + * Prevent concurrent compaction threads from isolating
> > > > + * an already isolated balloon page.
> > > > + */
> > > > + if (is_balloon_page(page) && (page_count(page) == 2)) {
> > > > + page->mapping->a_ops->invalidatepage(page, 0);
> > >
> > >
> > > Could you add more meaningful name wrapping raw invalidatepage?
> > > But I don't know what is proper name. ;)
> > >
> > If I understood you correctely, your suggestion is to add two extra callback
> > pointers to struct address_space_operations, instead of re-using those which are
> > already there, and are suitable for the mission. Is this really necessary? It
> > seems just like unecessary bloat to struct address_space_operations, IMHO.
>
> I meant this. :)
>
> void isolate_page_from_balloonlist(struct page* page)
> {
> page->mapping->a_ops->invalidatepage(page, 0);
> }
>
> if (is_balloon_page(page) && (page_count(page) == 2)) {
> isolate_page_from_balloonlist(page);
> }
>
Humm, my feelings on your approach here: just an unecessary indirection that
doesn't bring the desired code readability improvement.
If the header comment statement on balloon_mapping->a_ops is not clear enough
on those methods usage for ballooned pages:
.....
/*
* Balloon pages special page->mapping.
* users must properly allocate and initialize an instance of balloon_mapping,
* and set it as the page->mapping for balloon enlisted page instances.
*
* address_space_operations necessary methods for ballooned pages:
* .migratepage - used to perform balloon's page migration (as is)
* .invalidatepage - used to isolate a page from balloon's page list
* .freepage - used to reinsert an isolated page to balloon's page list
*/
struct address_space *balloon_mapping;
EXPORT_SYMBOL_GPL(balloon_mapping);
.....
I can add an extra commentary, to recollect folks about that usage, next to the
points where those callbacks are used at isolate_balloon_page() &
putback_balloon_page(). What do you think?
> Thanks!
>
Thank you for such attention and valuable feedback! Have a nice weekend!
Rafael
next prev parent reply other threads:[~2012-06-30 1:35 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-06-28 21:49 [PATCH v2 0/4] make balloon pages movable by compaction Rafael Aquini
2012-06-28 21:49 ` Rafael Aquini
2012-06-28 21:49 ` [PATCH v2 1/4] mm: introduce compaction and migration for virtio ballooned pages Rafael Aquini
2012-06-28 21:49 ` Rafael Aquini
2012-06-28 21:49 ` Rafael Aquini
2012-06-29 5:32 ` Minchan Kim
2012-06-29 5:32 ` Minchan Kim
2012-06-29 5:32 ` Minchan Kim
2012-06-29 17:36 ` Rafael Aquini
2012-06-29 17:36 ` Rafael Aquini
2012-06-29 22:03 ` Minchan Kim
2012-06-29 22:03 ` Minchan Kim
2012-06-29 22:03 ` Minchan Kim
2012-06-30 1:34 ` Rafael Aquini [this message]
2012-06-30 1:34 ` Rafael Aquini
2012-07-01 23:36 ` Minchan Kim
2012-07-01 23:36 ` Minchan Kim
2012-07-01 23:36 ` Minchan Kim
2012-07-03 18:31 ` Rafael Aquini
2012-07-03 18:31 ` Rafael Aquini
2012-07-03 18:31 ` Rafael Aquini
2012-06-30 1:34 ` Rafael Aquini
2012-06-29 17:36 ` Rafael Aquini
2012-06-29 15:31 ` Mel Gorman
2012-06-29 15:31 ` Mel Gorman
2012-06-29 15:31 ` Mel Gorman
2012-06-29 17:43 ` Rafael Aquini
2012-06-29 17:43 ` Rafael Aquini
2012-06-29 17:43 ` Rafael Aquini
2012-06-28 21:49 ` [PATCH v2 2/4] virtio_balloon: handle concurrent accesses to virtio_balloon struct elements Rafael Aquini
2012-06-28 21:49 ` Rafael Aquini
2012-06-28 21:49 ` Rafael Aquini
2012-06-28 21:49 ` [PATCH v2 3/4] virtio_balloon: introduce migration primitives to balloon pages Rafael Aquini
2012-06-28 21:49 ` Rafael Aquini
2012-06-28 21:49 ` Rafael Aquini
2012-06-28 21:49 ` [PATCH v2 4/4] mm: add vm event counters for balloon pages compaction Rafael Aquini
2012-06-28 21:49 ` Rafael Aquini
2012-06-28 21:49 ` Rafael Aquini
2012-06-29 1:37 ` [PATCH v2 0/4] make balloon pages movable by compaction Minchan Kim
2012-06-29 1:37 ` Minchan Kim
2012-06-29 3:51 ` Rafael Aquini
2012-06-29 3:51 ` Rafael Aquini
2012-06-29 3:51 ` Rafael Aquini
2012-06-29 1:37 ` Minchan Kim
2012-06-29 4:31 ` Rusty Russell
2012-06-29 4:31 ` Rusty Russell
2012-06-29 4:31 ` Rusty Russell
2012-06-29 17:46 ` Rafael Aquini
2012-06-29 17:46 ` Rafael Aquini
2012-06-29 17:46 ` Rafael Aquini
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=20120630013447.GA1545@x61.redhat.com \
--to=aquini@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=andi@firstfloor.org \
--cc=konrad.wilk@oracle.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=minchan@kernel.org \
--cc=mst@redhat.com \
--cc=riel@redhat.com \
--cc=virtualization@lists.linux-foundation.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.