From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Jann Horn <jannh@google.com>,
"David S . Miller" <davem@davemloft.net>,
Sasha Levin <sashal@kernel.org>,
linux-mm@kvack.org
Subject: [PATCH AUTOSEL 4.20 46/52] mm: page_alloc: fix ref bias in page_frag_alloc() for 1-byte allocs
Date: Mon, 11 Mar 2019 15:55:10 -0400 [thread overview]
Message-ID: <20190311195516.137772-46-sashal@kernel.org> (raw)
In-Reply-To: <20190311195516.137772-1-sashal@kernel.org>
From: Jann Horn <jannh@google.com>
[ Upstream commit 2c2ade81741c66082f8211f0b96cf509cc4c0218 ]
The basic idea behind ->pagecnt_bias is: If we pre-allocate the maximum
number of references that we might need to create in the fastpath later,
the bump-allocation fastpath only has to modify the non-atomic bias value
that tracks the number of extra references we hold instead of the atomic
refcount. The maximum number of allocations we can serve (under the
assumption that no allocation is made with size 0) is nc->size, so that's
the bias used.
However, even when all memory in the allocation has been given away, a
reference to the page is still held; and in the `offset < 0` slowpath, the
page may be reused if everyone else has dropped their references.
This means that the necessary number of references is actually
`nc->size+1`.
Luckily, from a quick grep, it looks like the only path that can call
page_frag_alloc(fragsz=1) is TAP with the IFF_NAPI_FRAGS flag, which
requires CAP_NET_ADMIN in the init namespace and is only intended to be
used for kernel testing and fuzzing.
To test for this issue, put a `WARN_ON(page_ref_count(page) == 0)` in the
`offset < 0` path, below the virt_to_page() call, and then repeatedly call
writev() on a TAP device with IFF_TAP|IFF_NO_PI|IFF_NAPI_FRAGS|IFF_NAPI,
with a vector consisting of 15 elements containing 1 byte each.
Signed-off-by: Jann Horn <jannh@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
mm/page_alloc.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index a29043ea9212..870b2906281b 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -4537,11 +4537,11 @@ void *page_frag_alloc(struct page_frag_cache *nc,
/* Even if we own the page, we do not use atomic_set().
* This would break get_page_unless_zero() users.
*/
- page_ref_add(page, size - 1);
+ page_ref_add(page, size);
/* reset page count bias and offset to start of new frag */
nc->pfmemalloc = page_is_pfmemalloc(page);
- nc->pagecnt_bias = size;
+ nc->pagecnt_bias = size + 1;
nc->offset = size;
}
@@ -4557,10 +4557,10 @@ void *page_frag_alloc(struct page_frag_cache *nc,
size = nc->size;
#endif
/* OK, page count is 0, we can safely set it */
- set_page_count(page, size);
+ set_page_count(page, size + 1);
/* reset page count bias and offset to start of new frag */
- nc->pagecnt_bias = size;
+ nc->pagecnt_bias = size + 1;
offset = size - fragsz;
}
--
2.19.1
next prev parent reply other threads:[~2019-03-11 20:09 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-03-11 19:54 [PATCH AUTOSEL 4.20 01/52] drm/imx: ignore plane updates on disabled crtcs Sasha Levin
2019-03-11 19:54 ` [PATCH AUTOSEL 4.20 02/52] gpu: ipu-v3: Fix i.MX51 CSI control registers offset Sasha Levin
2019-03-11 19:54 ` [PATCH AUTOSEL 4.20 03/52] drm/imx: imx-ldb: add missing of_node_puts Sasha Levin
2019-03-11 19:54 ` [PATCH AUTOSEL 4.20 04/52] gpu: ipu-v3: Fix CSI offsets for imx53 Sasha Levin
2019-03-11 19:54 ` [PATCH AUTOSEL 4.20 05/52] ASoC: rt5682: Correct the setting while select ASRC clk for AD/DA filter Sasha Levin
2019-03-11 19:54 ` [PATCH AUTOSEL 4.20 06/52] clocksource: timer-ti-dm: Fix pwm dmtimer usage of fck reparenting Sasha Levin
2019-03-11 19:54 ` [PATCH AUTOSEL 4.20 07/52] KVM: arm/arm64: vgic: Make vgic_dist->lpi_list_lock a raw_spinlock Sasha Levin
2019-03-11 19:54 ` [PATCH AUTOSEL 4.20 08/52] arm64: dts: rockchip: fix graph_port warning on rk3399 bob kevin and excavator Sasha Levin
2019-03-11 19:54 ` [PATCH AUTOSEL 4.20 09/52] hwmon: (nct6775) Fix fan6 detection for NCT6793D Sasha Levin
2019-03-11 19:54 ` [PATCH AUTOSEL 4.20 10/52] s390/dasd: fix using offset into zero size array error Sasha Levin
2019-03-11 19:54 ` [PATCH AUTOSEL 4.20 11/52] Input: pwm-vibra - prevent unbalanced regulator Sasha Levin
2019-03-11 19:54 ` [PATCH AUTOSEL 4.20 12/52] Input: pwm-vibra - stop regulator after disabling pwm, not before Sasha Levin
2019-03-11 19:54 ` [PATCH AUTOSEL 4.20 13/52] ARM: dts: Configure clock parent for pwm vibra Sasha Levin
2019-03-11 19:54 ` [PATCH AUTOSEL 4.20 14/52] ARM: OMAP2+: Variable "reg" in function omap4_dsi_mux_pads() could be uninitialized Sasha Levin
2019-03-11 19:54 ` [PATCH AUTOSEL 4.20 15/52] ASoC: topology: fix oops/use-after-free case with dai driver Sasha Levin
2019-03-11 19:54 ` [PATCH AUTOSEL 4.20 16/52] ASoC: dapm: fix out-of-bounds accesses to DAPM lookup tables Sasha Levin
2019-03-11 19:54 ` [PATCH AUTOSEL 4.20 17/52] ASoC: rsnd: fixup rsnd_ssi_master_clk_start() user count check Sasha Levin
2019-03-11 19:54 ` [PATCH AUTOSEL 4.20 18/52] KVM: arm/arm64: Reset the VCPU without preemption and vcpu state loaded Sasha Levin
2019-03-11 19:54 ` [PATCH AUTOSEL 4.20 19/52] arm/arm64: KVM: Allow a VCPU to fully reset itself Sasha Levin
2019-03-11 19:54 ` [PATCH AUTOSEL 4.20 20/52] arm/arm64: KVM: Don't panic on failure to properly reset system registers Sasha Levin
2019-03-11 19:54 ` [PATCH AUTOSEL 4.20 21/52] KVM: arm/arm64: vgic: Always initialize the group of private IRQs Sasha Levin
2019-03-11 19:54 ` [PATCH AUTOSEL 4.20 22/52] KVM: arm64: Forbid kprobing of the VHE world-switch code Sasha Levin
2019-03-11 19:54 ` [PATCH AUTOSEL 4.20 23/52] ASoC: samsung: Prevent clk_get_rate() calls in atomic context Sasha Levin
2019-03-11 19:54 ` [PATCH AUTOSEL 4.20 24/52] ARM: OMAP2+: fix lack of timer interrupts on CPU1 after hotplug Sasha Levin
2019-03-11 19:54 ` [PATCH AUTOSEL 4.20 25/52] Input: cap11xx - switch to using set_brightness_blocking() Sasha Levin
2019-03-11 19:54 ` [PATCH AUTOSEL 4.20 26/52] Input: ps2-gpio - flush TX work when closing port Sasha Levin
2019-03-11 19:54 ` [PATCH AUTOSEL 4.20 27/52] Input: matrix_keypad - use flush_delayed_work() Sasha Levin
2019-03-11 19:54 ` [PATCH AUTOSEL 4.20 28/52] mac80211: call drv_ibss_join() on restart Sasha Levin
2019-03-11 19:54 ` [PATCH AUTOSEL 4.20 29/52] cfg80211: prevent speculation on cfg80211_classify8021d() return Sasha Levin
2019-03-11 19:54 ` [PATCH AUTOSEL 4.20 30/52] mac80211: Fix Tx aggregation session tear down with ITXQs Sasha Levin
2019-03-11 19:54 ` [PATCH AUTOSEL 4.20 31/52] netfilter: compat: initialize all fields in xt_init Sasha Levin
2019-03-11 19:54 ` [PATCH AUTOSEL 4.20 32/52] blk-mq: insert rq with DONTPREP to hctx dispatch list when requeue Sasha Levin
2019-03-11 19:54 ` [PATCH AUTOSEL 4.20 33/52] ipvs: fix dependency on nf_defrag_ipv6 Sasha Levin
2019-03-11 19:54 ` [PATCH AUTOSEL 4.20 34/52] floppy: check_events callback should not return a negative number Sasha Levin
2019-03-11 19:54 ` [PATCH AUTOSEL 4.20 35/52] xprtrdma: Make sure Send CQ is allocated on an existing compvec Sasha Levin
2019-03-11 19:55 ` [PATCH AUTOSEL 4.20 36/52] NFS: Don't use page_file_mapping after removing the page Sasha Levin
2019-03-11 19:55 ` [PATCH AUTOSEL 4.20 37/52] mm/gup: fix gup_pmd_range() for dax Sasha Levin
2019-03-11 19:55 ` [PATCH AUTOSEL 4.20 38/52] Revert "mm: use early_pfn_to_nid in page_ext_init" Sasha Levin
2019-03-11 19:55 ` [PATCH AUTOSEL 4.20 39/52] csky: Fixup _PAGE_GLOBAL bit for 610 tlb entry Sasha Levin
2019-03-11 19:55 ` [PATCH AUTOSEL 4.20 40/52] csky: Fixup wrong pt_regs size Sasha Levin
2019-03-11 19:55 ` [PATCH AUTOSEL 4.20 41/52] csky: Fixup io-range page attribute for mmap("/dev/mem") Sasha Levin
2019-03-11 19:55 ` [PATCH AUTOSEL 4.20 42/52] csky: Fixup dead loop in show_stack Sasha Levin
2019-03-11 19:55 ` [PATCH AUTOSEL 4.20 43/52] scsi: qla2xxx: Fix panic from use after free in qla2x00_async_tm_cmd Sasha Levin
2019-03-11 19:55 ` [PATCH AUTOSEL 4.20 44/52] net: dsa: bcm_sf2: potential array overflow in bcm_sf2_sw_suspend() Sasha Levin
2019-03-11 19:55 ` [PATCH AUTOSEL 4.20 45/52] x86/CPU: Add Icelake model number Sasha Levin
2019-03-11 19:55 ` Sasha Levin [this message]
2019-03-11 19:55 ` [PATCH AUTOSEL 4.20 47/52] net: hns: Fix object reference leaks in hns_dsaf_roce_reset() Sasha Levin
2019-03-11 19:55 ` [PATCH AUTOSEL 4.20 48/52] i2c: cadence: Fix the hold bit setting Sasha Levin
2019-03-11 19:55 ` [PATCH AUTOSEL 4.20 49/52] i2c: bcm2835: Clear current buffer pointers and counts after a transfer Sasha Levin
2019-03-11 19:55 ` [PATCH AUTOSEL 4.20 50/52] auxdisplay: ht16k33: fix potential user-after-free on module unload Sasha Levin
2019-03-11 19:55 ` [PATCH AUTOSEL 4.20 51/52] lib/crc32.c: mark crc32_le_base/__crc32c_le_base aliases as __pure Sasha Levin
2019-03-11 19:55 ` [PATCH AUTOSEL 4.20 52/52] Input: st-keyscan - fix potential zalloc NULL dereference Sasha Levin
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=20190311195516.137772-46-sashal@kernel.org \
--to=sashal@kernel.org \
--cc=davem@davemloft.net \
--cc=jannh@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=stable@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