Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ffecfd1a authored by Darrick J. Wong's avatar Darrick J. Wong Committed by Linus Torvalds
Browse files

block: optionally snapshot page contents to provide stable pages during write



This provides a band-aid to provide stable page writes on jbd without
needing to backport the fixed locking and page writeback bit handling
schemes of jbd2.  The band-aid works by using bounce buffers to snapshot
page contents instead of waiting.

For those wondering about the ext3 bandage -- fixing the jbd locking
(which was done as part of ext4dev years ago) is a lot of surgery, and
setting PG_writeback on data pages when we actually hold the page lock
dropped ext3 performance by nearly an order of magnitude.  If we're
going to migrate iscsi and raid to use stable page writes, the
complaints about high latency will likely return.  We might as well
centralize their page snapshotting thing to one place.

Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Tested-by: default avatarAndy Lutomirski <luto@amacapital.net>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Artem Bityutskiy <dedekind1@gmail.com>
Reviewed-by: default avatarJan Kara <jack@suse.cz>
Cc: Joel Becker <jlbec@evilplan.org>
Cc: Mark Fasheh <mfasheh@suse.com>
Cc: Steven Whitehouse <swhiteho@redhat.com>
Cc: Jens Axboe <axboe@kernel.dk>
Cc: Eric Van Hensbergen <ericvh@gmail.com>
Cc: Ron Minnich <rminnich@sandia.gov>
Cc: Latchesar Ionkov <lucho@ionkov.net>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 13575ca1
Loading
Loading
Loading
Loading
+0 −6
Original line number Diff line number Diff line
@@ -412,12 +412,6 @@ config TILE_USB
	  Provides USB host adapter support for the built-in EHCI and OHCI
	  interfaces on TILE-Gx chips.

# USB OHCI needs the bounce pool since tilegx will often have more
# than 4GB of memory, but we don't currently use the IOTLB to present
# a 32-bit address to OHCI.  So we need to use a bounce pool instead.
config NEED_BOUNCE_POOL
	def_bool USB_OHCI_HCD

source "drivers/pci/hotplug/Kconfig"

endmenu
+5 −3
Original line number Diff line number Diff line
@@ -1474,6 +1474,11 @@ void blk_queue_bio(struct request_queue *q, struct bio *bio)
	 */
	blk_queue_bounce(q, &bio);

	if (bio_integrity_enabled(bio) && bio_integrity_prep(bio)) {
		bio_endio(bio, -EIO);
		return;
	}

	if (bio->bi_rw & (REQ_FLUSH | REQ_FUA)) {
		spin_lock_irq(q->queue_lock);
		where = ELEVATOR_INSERT_FLUSH;
@@ -1714,9 +1719,6 @@ generic_make_request_checks(struct bio *bio)
	 */
	blk_partition_remap(bio);

	if (bio_integrity_enabled(bio) && bio_integrity_prep(bio))
		goto end_io;

	if (bio_check_eod(bio, nr_sectors))
		goto end_io;

+1 −0
Original line number Diff line number Diff line
@@ -2065,6 +2065,7 @@ static int ext3_fill_super (struct super_block *sb, void *data, int silent)
		test_opt(sb,DATA_FLAGS) == EXT3_MOUNT_JOURNAL_DATA ? "journal":
		test_opt(sb,DATA_FLAGS) == EXT3_MOUNT_ORDERED_DATA ? "ordered":
		"writeback");
	sb->s_flags |= MS_SNAP_STABLE;

	return 0;

+3 −0
Original line number Diff line number Diff line
@@ -86,6 +86,9 @@ struct inodes_stat_t {
#define MS_KERNMOUNT	(1<<22) /* this is a kern_mount call */
#define MS_I_VERSION	(1<<23) /* Update inode I_version field */
#define MS_STRICTATIME	(1<<24) /* Always perform atime updates */

/* These sb flags are internal to the kernel */
#define MS_SNAP_STABLE	(1<<27) /* Snapshot pages during writeback, if needed */
#define MS_NOSEC	(1<<28)
#define MS_BORN		(1<<29)
#define MS_ACTIVE	(1<<30)
+13 −0
Original line number Diff line number Diff line
@@ -258,6 +258,19 @@ config BOUNCE
	def_bool y
	depends on BLOCK && MMU && (ZONE_DMA || HIGHMEM)

# On the 'tile' arch, USB OHCI needs the bounce pool since tilegx will often
# have more than 4GB of memory, but we don't currently use the IOTLB to present
# a 32-bit address to OHCI.  So we need to use a bounce pool instead.
#
# We also use the bounce pool to provide stable page writes for jbd.  jbd
# initiates buffer writeback without locking the page or setting PG_writeback,
# and fixing that behavior (a second time; jbd2 doesn't have this problem) is
# a major rework effort.  Instead, use the bounce buffer to snapshot pages
# (until jbd goes away).  The only jbd user is ext3.
config NEED_BOUNCE_POOL
	bool
	default y if (TILE && USB_OHCI_HCD) || (BLK_DEV_INTEGRITY && JBD)

config NR_QUICK
	int
	depends on QUICKLIST
Loading