All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Dave Kleikamp <dave.kleikamp@oracle.com>,
	Santosh Shilimkar <santosh.shilimkar@oracle.com>,
	Calum Mackay <calum.mackay@oracle.com>,
	Trond Myklebust <trond.myklebust@hammerspace.com>,
	Sasha Levin <sashal@kernel.org>,
	linux-nfs@vger.kernel.org
Subject: [PATCH AUTOSEL 4.19 25/73] nfs: don't dirty kernel pages read by direct-io
Date: Wed, 12 Dec 2018 23:27:50 -0500	[thread overview]
Message-ID: <20181213042838.75160-25-sashal@kernel.org> (raw)
In-Reply-To: <20181213042838.75160-1-sashal@kernel.org>

From: Dave Kleikamp <dave.kleikamp@oracle.com>

[ Upstream commit ad3cba223ac02dc769c3bbe88efe277bbb457566 ]

When we use direct_IO with an NFS backing store, we can trigger a
WARNING in __set_page_dirty(), as below, since we're dirtying the page
unnecessarily in nfs_direct_read_completion().

To fix, replicate the logic in commit 53cbf3b157a0 ("fs: direct-io:
don't dirtying pages for ITER_BVEC/ITER_KVEC direct read").

Other filesystems that implement direct_IO handle this; most use
blockdev_direct_IO(). ceph and cifs have similar logic.

mount 127.0.0.1:/export /nfs
dd if=/dev/zero of=/nfs/image bs=1M count=200
losetup --direct-io=on -f /nfs/image
mkfs.btrfs /dev/loop0
mount -t btrfs /dev/loop0 /mnt/

kernel: WARNING: CPU: 0 PID: 8067 at fs/buffer.c:580 __set_page_dirty+0xaf/0xd0
kernel: Modules linked in: loop(E) nfsv3(E) rpcsec_gss_krb5(E) nfsv4(E) dns_resolver(E) nfs(E) fscache(E) nfsd(E) auth_rpcgss(E) nfs_acl(E) lockd(E) grace(E) fuse(E) tun(E) ip6t_rpfilter(E) ipt_REJECT(E) nf_
kernel:  snd_seq(E) snd_seq_device(E) snd_pcm(E) video(E) snd_timer(E) snd(E) soundcore(E) ip_tables(E) xfs(E) libcrc32c(E) sd_mod(E) sr_mod(E) cdrom(E) ata_generic(E) pata_acpi(E) crc32c_intel(E) ahci(E) li
kernel: CPU: 0 PID: 8067 Comm: kworker/0:2 Tainted: G            E     4.20.0-rc1.master.20181111.ol7.x86_64 #1
kernel: Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006
kernel: Workqueue: nfsiod rpc_async_release [sunrpc]
kernel: RIP: 0010:__set_page_dirty+0xaf/0xd0
kernel: Code: c3 48 8b 02 f6 c4 04 74 d4 48 89 df e8 ba 05 f7 ff 48 89 c6 eb cb 48 8b 43 08 a8 01 75 1f 48 89 d8 48 8b 00 a8 04 74 02 eb 87 <0f> 0b eb 83 48 83 e8 01 eb 9f 48 83 ea 01 0f 1f 00 eb 8b 48 83 e8
kernel: RSP: 0000:ffffc1c8825b7d78 EFLAGS: 00013046
kernel: RAX: 000fffffc0020089 RBX: fffff2b603308b80 RCX: 0000000000000001
kernel: RDX: 0000000000000001 RSI: ffff9d11478115c8 RDI: ffff9d11478115d0
kernel: RBP: ffffc1c8825b7da0 R08: 0000646f6973666e R09: 8080808080808080
kernel: R10: 0000000000000001 R11: 0000000000000000 R12: ffff9d11478115d0
kernel: R13: ffff9d11478115c8 R14: 0000000000003246 R15: 0000000000000001
kernel: FS:  0000000000000000(0000) GS:ffff9d115ba00000(0000) knlGS:0000000000000000
kernel: CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
kernel: CR2: 00007f408686f640 CR3: 0000000104d8e004 CR4: 00000000000606f0
kernel: DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
kernel: DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
kernel: Call Trace:
kernel:  __set_page_dirty_buffers+0xb6/0x110
kernel:  set_page_dirty+0x52/0xb0
kernel:  nfs_direct_read_completion+0xc4/0x120 [nfs]
kernel:  nfs_pgio_release+0x10/0x20 [nfs]
kernel:  rpc_free_task+0x30/0x70 [sunrpc]
kernel:  rpc_async_release+0x12/0x20 [sunrpc]
kernel:  process_one_work+0x174/0x390
kernel:  worker_thread+0x4f/0x3e0
kernel:  kthread+0x102/0x140
kernel:  ? drain_workqueue+0x130/0x130
kernel:  ? kthread_stop+0x110/0x110
kernel:  ret_from_fork+0x35/0x40
kernel: ---[ end trace 01341980905412c9 ]---

Signed-off-by: Dave Kleikamp <dave.kleikamp@oracle.com>
Signed-off-by: Santosh Shilimkar <santosh.shilimkar@oracle.com>

[forward-ported to v4.20]
Signed-off-by: Calum Mackay <calum.mackay@oracle.com>
Reviewed-by: Dave Kleikamp <dave.kleikamp@oracle.com>
Reviewed-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 fs/nfs/direct.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c
index aa12c3063bae..33824a0a57bf 100644
--- a/fs/nfs/direct.c
+++ b/fs/nfs/direct.c
@@ -98,8 +98,11 @@ struct nfs_direct_req {
 	struct pnfs_ds_commit_info ds_cinfo;	/* Storage for cinfo */
 	struct work_struct	work;
 	int			flags;
+	/* for write */
 #define NFS_ODIRECT_DO_COMMIT		(1)	/* an unstable reply was received */
 #define NFS_ODIRECT_RESCHED_WRITES	(2)	/* write verification failed */
+	/* for read */
+#define NFS_ODIRECT_SHOULD_DIRTY	(3)	/* dirty user-space page after read */
 	struct nfs_writeverf	verf;		/* unstable write verifier */
 };
 
@@ -412,7 +415,8 @@ static void nfs_direct_read_completion(struct nfs_pgio_header *hdr)
 		struct nfs_page *req = nfs_list_entry(hdr->pages.next);
 		struct page *page = req->wb_page;
 
-		if (!PageCompound(page) && bytes < hdr->good_bytes)
+		if (!PageCompound(page) && bytes < hdr->good_bytes &&
+		    (dreq->flags == NFS_ODIRECT_SHOULD_DIRTY))
 			set_page_dirty(page);
 		bytes += req->wb_bytes;
 		nfs_list_remove_request(req);
@@ -587,6 +591,9 @@ ssize_t nfs_file_direct_read(struct kiocb *iocb, struct iov_iter *iter)
 	if (!is_sync_kiocb(iocb))
 		dreq->iocb = iocb;
 
+	if (iter_is_iovec(iter))
+		dreq->flags = NFS_ODIRECT_SHOULD_DIRTY;
+
 	nfs_start_io_direct(inode);
 
 	NFS_I(inode)->read_io += count;
-- 
2.19.1


  parent reply	other threads:[~2018-12-13  4:50 UTC|newest]

Thread overview: 109+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-12-13  4:27 [PATCH AUTOSEL 4.19 01/73] mac80211_hwsim: fix module init error paths for netlink Sasha Levin
2018-12-13  4:27 ` [PATCH AUTOSEL 4.19 02/73] Input: hyper-v - fix wakeup from suspend-to-idle Sasha Levin
2018-12-13  4:27   ` Sasha Levin
2018-12-13  4:27 ` [PATCH AUTOSEL 4.19 03/73] i2c: rcar: check bus state before reinitializing Sasha Levin
2018-12-13  4:27 ` [PATCH AUTOSEL 4.19 04/73] scsi: libiscsi: Fix NULL pointer dereference in iscsi_eh_session_reset Sasha Levin
2018-12-13  4:27 ` [PATCH AUTOSEL 4.19 05/73] scsi: vmw_pscsi: Rearrange code to avoid multiple calls to free_irq during unload Sasha Levin
2018-12-13  4:27 ` [PATCH AUTOSEL 4.19 06/73] tools/bpf: fix two test_btf unit test cases sashal
2018-12-13  4:27   ` Sasha Levin
2018-12-13  4:27   ` Sasha Levin
2018-12-13  4:27 ` [PATCH AUTOSEL 4.19 07/73] tools/bpf: add addition type tests to test_btf sashal
2018-12-13  4:27   ` Sasha Levin
2018-12-13  4:27   ` Sasha Levin
2018-12-13  4:27 ` [PATCH AUTOSEL 4.19 08/73] net: ethernet: ave: Replace NET_IP_ALIGN with AVE_FRAME_HEADROOM Sasha Levin
2018-12-13  4:27 ` [PATCH AUTOSEL 4.19 09/73] net: phy: sfp: correct store of detected link modes Sasha Levin
2018-12-13  4:27 ` [PATCH AUTOSEL 4.19 11/73] x86/earlyprintk/efi: Fix infinite loop on some screen widths Sasha Levin
2018-12-13  4:27   ` Sasha Levin
2018-12-13  4:27 ` [PATCH AUTOSEL 4.19 12/73] drm/msm: Fix task dump in gpu recovery Sasha Levin
2018-12-13  4:27   ` Sasha Levin
2018-12-13  4:27 ` [PATCH AUTOSEL 4.19 13/73] drm/msm/gpu: Fix a couple memory leaks in debugfs Sasha Levin
2018-12-13  4:27   ` Sasha Levin
2018-12-13  4:27 ` [PATCH AUTOSEL 4.19 14/73] drm/msm: fix handling of cmdstream offset Sasha Levin
2018-12-13  4:27   ` Sasha Levin
2018-12-13  4:27 ` [PATCH AUTOSEL 4.19 15/73] drm/msm/dsi: configure VCO rate for 10nm PLL driver Sasha Levin
2018-12-13  4:27   ` Sasha Levin
2018-12-13  4:27 ` [PATCH AUTOSEL 4.19 16/73] drm/msm: Grab a vblank reference when waiting for commit_done Sasha Levin
2018-12-13  4:27   ` Sasha Levin
2018-12-13  4:27 ` [PATCH AUTOSEL 4.19 17/73] drm/ttm: fix LRU handling in ttm_buffer_object_transfer Sasha Levin
2018-12-13  4:27   ` Sasha Levin
2018-12-13  4:27 ` [PATCH AUTOSEL 4.19 19/73] ARC: io.h: Implement reads{x}()/writes{x}() Sasha Levin
2018-12-13  4:27   ` Sasha Levin
2018-12-13  4:27 ` [PATCH AUTOSEL 4.19 20/73] net: stmmac: Move debugfs init/exit to ->probe()/->remove() Sasha Levin
2018-12-13  4:27 ` [PATCH AUTOSEL 4.19 21/73] net: aquantia: fix rx checksum offload bits Sasha Levin
2018-12-13  4:27 ` [PATCH AUTOSEL 4.19 22/73] bonding: fix 802.3ad state sent to partner when unbinding slave Sasha Levin
2018-12-13  4:27 ` [PATCH AUTOSEL 4.19 23/73] bpf: Fix verifier log string check for bad alignment sashal
2018-12-13  4:27   ` Sasha Levin
2018-12-13  4:27   ` Sasha Levin
2018-12-13  4:27 ` [PATCH AUTOSEL 4.19 24/73] liquidio: read sc->iq_no before release sc Sasha Levin
2018-12-13  4:27 ` Sasha Levin [this message]
2018-12-13  4:27 ` [PATCH AUTOSEL 4.19 26/73] SUNRPC: Fix leak of krb5p encode pages Sasha Levin
2018-12-13  4:27 ` [PATCH AUTOSEL 4.19 27/73] SUNRPC: Fix a potential race in xprt_connect() Sasha Levin
2018-12-13  4:27 ` [PATCH AUTOSEL 4.19 28/73] sbus: char: add of_node_put() Sasha Levin
2018-12-13  4:27   ` Sasha Levin
2018-12-13  4:27 ` [PATCH AUTOSEL 4.19 29/73] drivers/sbus/char: " Sasha Levin
2018-12-13  4:27   ` Sasha Levin
2018-12-13  4:27 ` [PATCH AUTOSEL 4.19 30/73] drivers/tty: add missing of_node_put() Sasha Levin
2018-12-13  4:27   ` Sasha Levin
2018-12-13  4:27 ` [PATCH AUTOSEL 4.19 31/73] ide: pmac: add of_node_put() Sasha Levin
2018-12-13  4:27   ` Sasha Levin
2018-12-13  4:27 ` [PATCH AUTOSEL 4.19 32/73] drm/msm/hdmi: Enable HPD after HDMI IRQ is set up Sasha Levin
2018-12-13  4:27   ` Sasha Levin
2018-12-13  4:27 ` [PATCH AUTOSEL 4.19 33/73] drm/msm: dpu: Don't set legacy plane->crtc pointer Sasha Levin
2018-12-13  4:27   ` Sasha Levin
2018-12-13  4:27 ` [PATCH AUTOSEL 4.19 34/73] drm/msm: dpu: Fix "WARNING: invalid free of devm_ allocated data" Sasha Levin
2018-12-13  4:28 ` [PATCH AUTOSEL 4.19 35/73] drm/msm: Fix error return checking Sasha Levin
2018-12-13  4:28   ` Sasha Levin
     [not found] ` <20181213042838.75160-1-sashal-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2018-12-13  4:27   ` [PATCH AUTOSEL 4.19 10/73] drm/amd/display: Fix 6x4K displays light-up on Vega20 (v2) Sasha Levin
2018-12-13  4:27     ` Sasha Levin
2018-12-13  4:27   ` [PATCH AUTOSEL 4.19 18/73] drm/amdgpu: wait for IB test on first device open Sasha Levin
2018-12-13  4:27     ` Sasha Levin
2018-12-13  4:28   ` [PATCH AUTOSEL 4.19 36/73] drm/amd/powerplay: issue pre-display settings for display change event Sasha Levin
2018-12-13  4:28     ` Sasha Levin
2018-12-13  4:28 ` [PATCH AUTOSEL 4.19 37/73] clk: mvebu: Off by one bugs in cp110_of_clk_get() Sasha Levin
2018-12-13  4:28 ` [PATCH AUTOSEL 4.19 38/73] clk: mmp: Off by one in mmp_clk_add() Sasha Levin
2018-12-13  4:28 ` [PATCH AUTOSEL 4.19 39/73] Input: synaptics - enable SMBus for HP 15-ay000 Sasha Levin
2018-12-13  4:28 ` [PATCH AUTOSEL 4.19 40/73] Input: omap-keypad - fix keyboard debounce configuration Sasha Levin
2018-12-13  4:28 ` [PATCH AUTOSEL 4.19 41/73] libata: whitelist all SAMSUNG MZ7KM* solid-state disks Sasha Levin
2018-12-13  4:28 ` [PATCH AUTOSEL 4.19 42/73] net: phy: don't allow __set_phy_supported to add unsupported modes Sasha Levin
2018-12-13  4:28 ` [PATCH AUTOSEL 4.19 43/73] net: 8139cp: fix a BUG triggered by changing mtu with network traffic Sasha Levin
2018-12-13  4:28 ` [PATCH AUTOSEL 4.19 44/73] net: phy: Fix not to call phy_resume() if PHY is not attached Sasha Levin
2018-12-13  4:48   ` Yoshihiro Shimoda
2018-12-19 13:43     ` Sasha Levin
2018-12-19 13:43       ` Sasha Levin
2018-12-13  4:28 ` [PATCH AUTOSEL 4.19 45/73] net: phy: micrel: add toggling phy reset " Sasha Levin
2018-12-13  4:44   ` Yoshihiro Shimoda
2018-12-19 13:43     ` Sasha Levin
2018-12-19 13:43       ` Sasha Levin
2018-12-13  4:28 ` [PATCH AUTOSEL 4.19 46/73] macvlan: return correct error value Sasha Levin
2018-12-13  4:28 ` [PATCH AUTOSEL 4.19 47/73] mv88e6060: disable hardware level MAC learning Sasha Levin
2018-12-13  4:28 ` [PATCH AUTOSEL 4.19 48/73] net/mlx4_en: Change min MTU size to ETH_MIN_MTU Sasha Levin
2018-12-13  4:28 ` [PATCH AUTOSEL 4.19 49/73] net/mlx4_en: Fix build break when CONFIG_INET is off Sasha Levin
2018-12-13  4:28 ` [PATCH AUTOSEL 4.19 50/73] bpf: check pending signals while verifying programs Sasha Levin
2018-12-13  4:28 ` [PATCH AUTOSEL 4.19 51/73] ARM: 8814/1: mm: improve/fix ARM v7_dma_inv_range() unaligned address handling Sasha Levin
2018-12-13  4:28 ` [PATCH AUTOSEL 4.19 52/73] ARM: 8815/1: V7M: align v7m_dma_inv_range() with v7 counterpart Sasha Levin
2018-12-13  4:28 ` [PATCH AUTOSEL 4.19 53/73] ARM: 8816/1: dma-mapping: fix potential uninitialized return Sasha Levin
2018-12-13  4:28 ` [PATCH AUTOSEL 4.19 54/73] ethernet: fman: fix wrong of_node_put() in probe function Sasha Levin
2018-12-13  4:28 ` [PATCH AUTOSEL 4.19 55/73] thermal: armada: fix legacy validity test sense Sasha Levin
2018-12-13  4:28 ` [PATCH AUTOSEL 4.19 56/73] net: mvpp2: fix detection of 10G SFP modules Sasha Levin
2018-12-13  4:28 ` [PATCH AUTOSEL 4.19 57/73] net: mvpp2: fix phylink handling of invalid PHY modes Sasha Levin
2018-12-13  4:28 ` [PATCH AUTOSEL 4.19 58/73] x86/build: Fix compiler support check for CONFIG_RETPOLINE Sasha Levin
2018-12-18 13:26   ` Gi-Oh Kim
2018-12-18 15:50     ` Greg KH
2018-12-13  4:28 ` [PATCH AUTOSEL 4.19 59/73] drm/amdgpu/vcn: Update vcn.cur_state during suspend Sasha Levin
2018-12-13  4:28 ` [PATCH AUTOSEL 4.19 60/73] tools/testing/nvdimm: Align test resources to 128M Sasha Levin
2018-12-13  4:28 ` [PATCH AUTOSEL 4.19 61/73] acpi/nfit: Fix user-initiated ARS to be "ARS-long" rather than "ARS-short" Sasha Levin
2018-12-13  4:28   ` Sasha Levin
2018-12-13  4:28 ` [PATCH AUTOSEL 4.19 62/73] drm/ast: Fix connector leak during driver unload Sasha Levin
2018-12-13  4:28 ` [PATCH AUTOSEL 4.19 63/73] cifs: In Kconfig CONFIG_CIFS_POSIX needs depends on legacy (insecure cifs) Sasha Levin
2018-12-13  4:28 ` [PATCH AUTOSEL 4.19 64/73] vhost/vsock: fix reset orphans race with close timeout Sasha Levin
2018-12-13  4:28 ` [PATCH AUTOSEL 4.19 65/73] mlxsw: spectrum_switchdev: Fix VLAN device deletion via ioctl Sasha Levin
2018-12-13  4:28 ` [PATCH AUTOSEL 4.19 66/73] i2c: axxia: properly handle master timeout Sasha Levin
2018-12-13  4:28 ` [PATCH AUTOSEL 4.19 67/73] i2c: scmi: Fix probe error on devices with an empty SMB0001 ACPI device node Sasha Levin
2018-12-13  4:28 ` [PATCH AUTOSEL 4.19 68/73] i2c: uniphier: fix violation of tLOW requirement for Fast-mode Sasha Levin
2018-12-13  4:28 ` [PATCH AUTOSEL 4.19 69/73] i2c: uniphier-f: " Sasha Levin
2018-12-13  4:28 ` [PATCH AUTOSEL 4.19 70/73] nvme: validate controller state before rescheduling keep alive Sasha Levin
2018-12-13  4:28   ` Sasha Levin
2018-12-13  4:28 ` [PATCH AUTOSEL 4.19 71/73] nvmet-rdma: fix response use after free Sasha Levin
2018-12-13  4:28   ` Sasha Levin
2018-12-13  4:28 ` [PATCH AUTOSEL 4.19 72/73] Revert "net/ibm/emac: wrong bit is used for STA control" Sasha Levin
2018-12-13  4:28 ` [PATCH AUTOSEL 4.19 73/73] net/mlx4_core: Correctly set PFC param if global pause is turned off 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=20181213042838.75160-25-sashal@kernel.org \
    --to=sashal@kernel.org \
    --cc=calum.mackay@oracle.com \
    --cc=dave.kleikamp@oracle.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-nfs@vger.kernel.org \
    --cc=santosh.shilimkar@oracle.com \
    --cc=stable@vger.kernel.org \
    --cc=trond.myklebust@hammerspace.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.