From: Mel Gorman <mgorman@suse.de>
To: Alexander Duyck <alexander.h.duyck@intel.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Linux-MM <linux-mm@kvack.org>,
Linux-Netdev <netdev@vger.kernel.org>,
LKML <linux-kernel@vger.kernel.org>,
David Miller <davem@davemloft.net>, Neil Brown <neilb@suse.de>,
Peter Zijlstra <a.p.zijlstra@chello.nl>
Subject: Re: [PATCH 10/15] netvm: Propagate page->pfmemalloc from netdev_alloc_page to skb
Date: Wed, 8 Feb 2012 15:23:46 +0000 [thread overview]
Message-ID: <20120208152346.GJ5938@suse.de> (raw)
In-Reply-To: <4F31B604.5070401@intel.com>
On Tue, Feb 07, 2012 at 03:38:44PM -0800, Alexander Duyck wrote:
> On 02/06/2012 02:56 PM, Mel Gorman wrote:
> > diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
> > index e91d73c..c062909 100644
> > --- a/drivers/net/ethernet/intel/igb/igb_main.c
> > +++ b/drivers/net/ethernet/intel/igb/igb_main.c
> > @@ -6187,7 +6187,7 @@ static bool igb_alloc_mapped_page(struct igb_ring *rx_ring,
> > return true;
> >
> > if (!page) {
> > - page = alloc_page(GFP_ATOMIC | __GFP_COLD);
> > + page = __netdev_alloc_page(GFP_ATOMIC, bi->skb);
> > bi->page = page;
> > if (unlikely(!page)) {
> > rx_ring->rx_stats.alloc_failed++;
>
> This takes care of the case where we are allocating the page, but what
> about if we are reusing the page?
Then nothing... You're right, I did not consider that case.
> For this driver it might work better
> to hold of on doing the association between the page and skb either
> somewhere after the skb and the page have both been allocated, or in the
> igb_clean_rx_irq path where we will have both the page and the data
> accessible.
Again, from looking through the code you appear to be right. Thanks for
the suggestion!
> > diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
> > index 1ee5d0f..7a011c3 100644
> > --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
> > +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
> > @@ -1143,7 +1143,7 @@ void ixgbe_alloc_rx_buffers(struct ixgbe_ring *rx_ring, u16 cleaned_count)
> >
> > if (ring_is_ps_enabled(rx_ring)) {
> > if (!bi->page) {
> > - bi->page = alloc_page(GFP_ATOMIC | __GFP_COLD);
> > + bi->page = __netdev_alloc_page(GFP_ATOMIC, skb);
> > if (!bi->page) {
> > rx_ring->rx_stats.alloc_rx_page_failed++;
> > goto no_buffers;
>
> Same thing for this driver.
> > diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
> > index bed411b..f6ea14a 100644
> > --- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
> > +++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
> > @@ -366,7 +366,7 @@ static void ixgbevf_alloc_rx_buffers(struct ixgbevf_adapter *adapter,
> > if (!bi->page_dma &&
> > (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED)) {
> > if (!bi->page) {
> > - bi->page = alloc_page(GFP_ATOMIC | __GFP_COLD);
> > + bi->page = __netdev_alloc_page(GFP_ATOMIC, NULL);
> > if (!bi->page) {
> > adapter->alloc_rx_page_failed++;
> > goto no_buffers;
> > @@ -400,6 +400,7 @@ static void ixgbevf_alloc_rx_buffers(struct ixgbevf_adapter *adapter,
> > */
> > skb_reserve(skb, NET_IP_ALIGN);
> >
> > + propagate_pfmemalloc_skb(bi->page_dma, skb);
> > bi->skb = skb;
> > }
> > if (!bi->dma) {
>
> I am pretty sure this is incorrect. I believe you want bi->page, not
> bi->page_dma. This one is closer though to what I had in mind for igb
> and ixgbe in terms of making it so there is only one location that
> generates the association.
>
You are on a roll of being right.
> Also a similar changes would be needed for the igbvf , e1000, and e1000e
> drivers in the Intel tree.
>
> > diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
> > index 17ed022..8da4ca0 100644
> > --- a/include/linux/skbuff.h
> > +++ b/include/linux/skbuff.h
> > @@ -1696,6 +1696,44 @@ static inline struct sk_buff *netdev_alloc_skb_ip_align(struct net_device *dev,
> > }
> >
> > /**
> > + * __netdev_alloc_page - allocate a page for ps-rx on a specific device
> > + * @gfp_mask: alloc_pages_node mask. Set __GFP_NOMEMALLOC if not for network packet RX
> > + * @skb: skb to set pfmemalloc on if __GFP_MEMALLOC is used
> > + *
> > + * Allocate a new page. dev currently unused.
> > + *
> > + * %NULL is returned if there is no free memory.
> > + */
> > +static inline struct page *__netdev_alloc_page(gfp_t gfp_mask,
> > + struct sk_buff *skb)
> > +{
> > + struct page *page;
> > +
> > + gfp_mask |= __GFP_COLD;
> > +
> > + if (!(gfp_mask & __GFP_NOMEMALLOC))
> > + gfp_mask |= __GFP_MEMALLOC;
> > +
> > + page = alloc_pages_node(NUMA_NO_NODE, gfp_mask, 0);
> > + if (skb && page && page->pfmemalloc)
> > + skb->pfmemalloc = true;
> > +
> > + return page;
> > +}
> > +
> > +/**
> > + * propagate_pfmemalloc_skb - Propagate pfmemalloc if skb is allocated after RX page
> > + * @page: The page that was allocated from netdev_alloc_page
> > + * @skb: The skb that may need pfmemalloc set
> > + */
> > +static inline void propagate_pfmemalloc_skb(struct page *page,
> > + struct sk_buff *skb)
> > +{
> > + if (page && page->pfmemalloc)
> > + skb->pfmemalloc = true;
> > +}
> > +
> > +/**
> > * skb_frag_page - retrieve the page refered to by a paged fragment
> > * @frag: the paged fragment
> > *
>
> Is this function even really needed?
It's not *really* needed. As noted in the changelog, getting this wrong
has minor consequences. At worst, swap becomes a little slower but it
should not result in hangs.
> It seems like you already have
> this covered in your earlier patches, specifically 9/15, which takes
> care of associating the skb and the page pfmemalloc flags when you use
> skb_fill_page_desc.
Yes, this patch was an attempt to being thorough but the actual impact
is moving a bunch of complexity into drivers where it is difficult to
test and of marginal benefit.
> It would be useful to narrow things down so that we
> are associating this either at the allocation time or at the
> fill_page_desc call instead of doing it at both.
>
I think you're right. I'm going to drop this patch entirely as the
benfit is marginal and not necessary for swap over network to work.
Thanks very much for the review.
--
Mel Gorman
SUSE Labs
next prev parent reply other threads:[~2012-02-08 15:23 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-02-06 22:56 [PATCH 00/15] Swap-over-NBD without deadlocking V8 Mel Gorman
2012-02-06 22:56 ` [PATCH 01/15] mm: Serialize access to min_free_kbytes Mel Gorman
2012-02-08 18:47 ` Rik van Riel
2012-02-06 22:56 ` [PATCH 02/15] mm: sl[au]b: Add knowledge of PFMEMALLOC reserve pages Mel Gorman
2012-02-07 16:27 ` Christoph Lameter
2012-02-08 14:45 ` Mel Gorman
2012-02-08 15:14 ` Christoph Lameter
2012-02-08 16:34 ` Mel Gorman
2012-02-08 19:49 ` Christoph Lameter
2012-02-08 21:23 ` Mel Gorman
2012-02-08 22:13 ` Christoph Lameter
2012-02-09 12:50 ` Mel Gorman
2012-02-09 19:53 ` Christoph Lameter
2012-02-10 10:26 ` Mel Gorman
2012-02-10 21:01 ` Christoph Lameter
2012-02-10 22:07 ` Christoph Lameter
2012-02-13 10:12 ` Mel Gorman
2012-02-13 11:10 ` Mel Gorman
2012-02-06 22:56 ` [PATCH 03/15] mm: Introduce __GFP_MEMALLOC to allow access to emergency reserves Mel Gorman
2012-02-06 22:56 ` [PATCH 04/15] mm: allow PF_MEMALLOC from softirq context Mel Gorman
2012-02-06 22:56 ` [PATCH 05/15] mm: Ignore mempolicies when using ALLOC_NO_WATERMARK Mel Gorman
2012-02-06 22:56 ` [PATCH 06/15] net: Introduce sk_allocation() to allow addition of GFP flags depending on the individual socket Mel Gorman
2012-02-06 22:56 ` [PATCH 07/15] netvm: Allow the use of __GFP_MEMALLOC by specific sockets Mel Gorman
2012-02-06 22:56 ` [PATCH 08/15] netvm: Allow skb allocation to use PFMEMALLOC reserves Mel Gorman
2012-02-06 22:56 ` [PATCH 09/15] netvm: Propagate page->pfmemalloc to skb Mel Gorman
2012-02-06 22:56 ` [PATCH 10/15] netvm: Propagate page->pfmemalloc from netdev_alloc_page " Mel Gorman
2012-02-07 23:38 ` Alexander Duyck
2012-02-08 15:23 ` Mel Gorman [this message]
2012-02-06 22:56 ` [PATCH 11/15] netvm: Set PF_MEMALLOC as appropriate during SKB processing Mel Gorman
2012-02-06 22:56 ` [PATCH 12/15] mm: Micro-optimise slab to avoid a function call Mel Gorman
2012-02-06 22:56 ` [PATCH 13/15] nbd: Set SOCK_MEMALLOC for access to PFMEMALLOC reserves Mel Gorman
2012-02-06 22:56 ` [PATCH 14/15] mm: Throttle direct reclaimers if PF_MEMALLOC reserves are low and swap is backed by network storage Mel Gorman
2012-02-06 22:56 ` [PATCH 15/15] mm: Account for the number of times direct reclaimers get throttled Mel Gorman
2012-02-07 12:45 ` [PATCH 00/15] Swap-over-NBD without deadlocking V8 Hillf Danton
2012-02-07 13:27 ` Mel Gorman
2012-02-08 12:51 ` Hillf Danton
2012-02-08 15:26 ` 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=20120208152346.GJ5938@suse.de \
--to=mgorman@suse.de \
--cc=a.p.zijlstra@chello.nl \
--cc=akpm@linux-foundation.org \
--cc=alexander.h.duyck@intel.com \
--cc=davem@davemloft.net \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=neilb@suse.de \
--cc=netdev@vger.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 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).