mail archive of the barebox mailing list
 help / color / mirror / Atom feed
* [PATCH 1/4] fs: Introduce discard_range()
@ 2020-02-14 11:16 Sascha Hauer
  2020-02-14 11:16 ` [PATCH 2/4] cdev: Add discard_range hook Sascha Hauer
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Sascha Hauer @ 2020-02-14 11:16 UTC (permalink / raw)
  To: Barebox List

discard_range() is a way to tell the lower layers that we are no longer
interested in a data range of a file, so that the lower layers can
discard the underlying data if desired.

This is mainly designed to bypass the deficiencies of our block layer.
We cache the block data in chunks of multiple KiB (16 currently) if
we fall into the block layer with write requests smaller than that
we have to read/modify/write a chunk. With the help of discard_range()
code writing files to a raw block device can now discard the range the
file will be written to. The block layer then no longer has to read
the chunks first that are inside the discard range.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
 fs/fs.c      | 25 +++++++++++++++++++++++++
 include/fs.h |  3 +++
 2 files changed, 28 insertions(+)

diff --git a/fs/fs.c b/fs/fs.c
index 12faaebc27..e00bbcd223 100644
--- a/fs/fs.c
+++ b/fs/fs.c
@@ -497,6 +497,31 @@ int protect(int fd, size_t count, loff_t offset, int prot)
 }
 EXPORT_SYMBOL(protect);
 
+int discard_range(int fd, loff_t count, loff_t offset)
+{
+	struct fs_driver_d *fsdrv;
+	FILE *f = fd_to_file(fd);
+	int ret;
+
+	if (IS_ERR(f))
+		return -errno;
+	if (offset >= f->size)
+		return 0;
+	if (count > f->size - offset)
+		count = f->size - offset;
+
+	fsdrv = f->fsdev->driver;
+	if (fsdrv->discard_range)
+		ret = fsdrv->discard_range(&f->fsdev->dev, f, count, offset);
+	else
+		ret = -ENOSYS;
+
+	if (ret)
+		errno = -ret;
+
+	return ret;
+}
+
 int protect_file(const char *file, int prot)
 {
 	int fd, ret;
diff --git a/include/fs.h b/include/fs.h
index 38debfc41b..d9684c82b1 100644
--- a/include/fs.h
+++ b/include/fs.h
@@ -60,6 +60,8 @@ struct fs_driver_d {
 			loff_t offset);
 	int (*protect)(struct device_d *dev, FILE *f, size_t count,
 			loff_t offset, int prot);
+	int (*discard_range)(struct device_d *dev, FILE *f, loff_t count,
+			loff_t offset);
 
 	int (*memmap)(struct device_d *dev, FILE *f, void **map, int flags);
 
@@ -127,6 +129,7 @@ int umount_by_cdev(struct cdev *cdev);
 #define ERASE_SIZE_ALL	((loff_t) - 1)
 int erase(int fd, loff_t count, loff_t offset);
 int protect(int fd, size_t count, loff_t offset, int prot);
+int discard_range(int fd, loff_t count, loff_t offset);
 int protect_file(const char *file, int prot);
 void *memmap(int fd, int flags);
 
-- 
2.25.0


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 5+ messages in thread
* [PATCH 0/4] add discard_range to improve write speed on block devices
@ 2019-12-13 13:20 Sascha Hauer
  2019-12-13 13:20 ` [PATCH 2/4] cdev: Add discard_range hook Sascha Hauer
  0 siblings, 1 reply; 5+ messages in thread
From: Sascha Hauer @ 2019-12-13 13:20 UTC (permalink / raw)
  To: Barebox List

This implements an idea Lucas came up with: Our block layer is quite
stupid. It works on chunks from which one is currently 16KiB in size.
Whenever such a chunk is written to we must write the whole chunk which
also means we have to read it from the device first in order to keep
unaffected data. This series adds a discard_range() function which
can be used to tell the block layer that a certain range of the device
will be overwritten and the current content is no longer needed and
thus doesn't have to be read. With this I saw a speed gain of around
30% when writing to a SD card.

This series still needs a closer look before I want to merge it, but
it's already worth being looked at ;)

Sascha

Sascha Hauer (4):
  fs: Introduce discard_range()
  cdev: Add discard_range hook
  block: Implement discard_range
  copy_file: call discard_range on destination file

 common/block.c   | 21 +++++++++++++++++++++
 fs/devfs.c       | 21 +++++++++++++++++++++
 fs/fs.c          | 25 +++++++++++++++++++++++++
 include/block.h  |  3 +++
 include/driver.h |  1 +
 include/fs.h     |  3 +++
 lib/libfile.c    |  2 ++
 7 files changed, 76 insertions(+)

-- 
2.24.0


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2020-02-14 11:16 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-02-14 11:16 [PATCH 1/4] fs: Introduce discard_range() Sascha Hauer
2020-02-14 11:16 ` [PATCH 2/4] cdev: Add discard_range hook Sascha Hauer
2020-02-14 11:16 ` [PATCH 3/4] block: Implement discard_range Sascha Hauer
2020-02-14 11:16 ` [PATCH 4/4] copy_file: call discard_range on destination file Sascha Hauer
  -- strict thread matches above, loose matches on Subject: below --
2019-12-13 13:20 [PATCH 0/4] add discard_range to improve write speed on block devices Sascha Hauer
2019-12-13 13:20 ` [PATCH 2/4] cdev: Add discard_range hook Sascha Hauer

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox