linux_dsm_epyc7002/drivers/net/ethernet/intel/ixgbe
Michal Hocko 2f064f3485 mm: make page pfmemalloc check more robust
Commit c48a11c7ad ("netvm: propagate page->pfmemalloc to skb") added
checks for page->pfmemalloc to __skb_fill_page_desc():

        if (page->pfmemalloc && !page->mapping)
                skb->pfmemalloc = true;

It assumes page->mapping == NULL implies that page->pfmemalloc can be
trusted.  However, __delete_from_page_cache() can set set page->mapping
to NULL and leave page->index value alone.  Due to being in union, a
non-zero page->index will be interpreted as true page->pfmemalloc.

So the assumption is invalid if the networking code can see such a page.
And it seems it can.  We have encountered this with a NFS over loopback
setup when such a page is attached to a new skbuf.  There is no copying
going on in this case so the page confuses __skb_fill_page_desc which
interprets the index as pfmemalloc flag and the network stack drops
packets that have been allocated using the reserves unless they are to
be queued on sockets handling the swapping which is the case here and
that leads to hangs when the nfs client waits for a response from the
server which has been dropped and thus never arrive.

The struct page is already heavily packed so rather than finding another
hole to put it in, let's do a trick instead.  We can reuse the index
again but define it to an impossible value (-1UL).  This is the page
index so it should never see the value that large.  Replace all direct
users of page->pfmemalloc by page_is_pfmemalloc which will hide this
nastiness from unspoiled eyes.

The information will get lost if somebody wants to use page->index
obviously but that was the case before and the original code expected
that the information should be persisted somewhere else if that is
really needed (e.g.  what SLAB and SLUB do).

[akpm@linux-foundation.org: fix blooper in slub]
Fixes: c48a11c7ad ("netvm: propagate page->pfmemalloc to skb")
Signed-off-by: Michal Hocko <mhocko@suse.com>
Debugged-by: Vlastimil Babka <vbabka@suse.com>
Debugged-by: Jiri Bohac <jbohac@suse.com>
Cc: Eric Dumazet <eric.dumazet@gmail.com>
Cc: David Miller <davem@davemloft.net>
Acked-by: Mel Gorman <mgorman@suse.de>
Cc: <stable@vger.kernel.org>	[3.6+]
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2015-08-21 14:30:10 -07:00
..
ixgbe_82598.c ixgbe: Add a PHY power state method 2015-06-09 17:21:14 -07:00
ixgbe_82599.c ixgbe: add array of MAC type dependent values 2015-06-09 17:15:01 -07:00
ixgbe_common.c ixgbe: fix bug in not clearing counters for X550 devices 2015-06-09 17:30:05 -07:00
ixgbe_common.h ixgbe: add array of MAC type dependent values 2015-06-09 17:15:01 -07:00
ixgbe_dcb_82598.c ixgbe: convert low_water into an array 2014-04-22 23:07:11 -07:00
ixgbe_dcb_82598.h ixgbe: update date to 2013 2013-02-05 01:44:13 -08:00
ixgbe_dcb_82599.c ixgbe: convert low_water into an array 2014-04-22 23:07:11 -07:00
ixgbe_dcb_82599.h ixgbe: clean up checkpatch warnings about CODE_INDENT and LEADING_SPACE 2014-05-23 05:24:04 -07:00
ixgbe_dcb_nl.c ixgbe: Add new support for X550 MAC's 2014-11-11 06:18:56 -08:00
ixgbe_dcb.c ixgbe: Add new support for X550 MAC's 2014-11-11 06:18:56 -08:00
ixgbe_dcb.h IXGBE: Set the SW prio_tc values at initialization to the HW setting. 2013-05-21 03:14:21 -07:00
ixgbe_debugfs.c ixgbe: don't check NULL for debugfs_remove_recursive 2014-05-23 05:28:24 -07:00
ixgbe_ethtool.c ixgbe: add define for X557 PHY ID 2015-06-09 17:21:08 -07:00
ixgbe_fcoe.c ixgbe: adds x550 specific FCoE offloads 2015-04-10 00:15:55 -07:00
ixgbe_fcoe.h ixgbe: adds x550 specific FCoE offloads 2015-04-10 00:15:55 -07:00
ixgbe_lib.c ixgbe: Add new support for X550 MAC's 2014-11-11 06:18:56 -08:00
ixgbe_main.c mm: make page pfmemalloc check more robust 2015-08-21 14:30:10 -07:00
ixgbe_mbx.c ixgbe: Add new support for X550 MAC's 2014-11-11 06:18:56 -08:00
ixgbe_mbx.h ixgbe: Add GET_RSS_KEY command to VF-PF channel commands set 2015-04-11 11:30:12 -07:00
ixgbe_phy.c ixgbe: Set lan_id before using I2C 2015-06-09 17:48:54 -07:00
ixgbe_phy.h ixgbe: Add a PHY power state method 2015-06-09 17:21:14 -07:00
ixgbe_ptp.c ptp: ixgbe: use helpers for converting ns to timespec. 2015-03-31 17:19:19 -04:00
ixgbe_sriov.c ixgbe: Add GET_RSS_KEY command to VF-PF channel commands set 2015-04-11 11:30:12 -07:00
ixgbe_sriov.h ixgbe: Add a new netdev op to allow/prevent a VF from querying an RSS info 2015-04-10 22:26:30 -07:00
ixgbe_sysfs.c ixgbe: add Linux NICS mailing list to contact info 2014-03-12 19:05:30 -07:00
ixgbe_type.h ixgbe: Add support for another X550 device. 2015-06-09 17:39:46 -07:00
ixgbe_x540.c ixgbe: Add a PHY power state method 2015-06-09 17:21:14 -07:00
ixgbe_x540.h ixgbe: Add X550 support function pointers 2014-12-05 09:13:07 -08:00
ixgbe_x550.c ixgbe: Remember to write ixfi changes after modifying 2015-06-09 17:55:59 -07:00
ixgbe.h ixgbe: add support for interrupts from X550 external PHY 2015-06-09 17:24:16 -07:00
Makefile ixgbe: Add X550 support function pointers 2014-12-05 09:13:07 -08:00