cf36f4f64c
After quicksort picks a pivot item for a particular subsort, it walks the records in that subset from the outside in, rearranging them so that every record less than the pivot comes before it, and every record greater than the pivot comes after it. This scan has a lot of locality, so we can speed it up quite a bit by grabbing the xfile backing page and holding onto it as long as we possibly can. Doing so reduces the runtime by another 5% on the author's computer. Signed-off-by: Darrick J. Wong <djwong@kernel.org> Reviewed-by: Kent Overstreet <kent.overstreet@linux.dev> Reviewed-by: Dave Chinner <dchinner@redhat.com>
78 lines
1.9 KiB
C
78 lines
1.9 KiB
C
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
/*
|
|
* Copyright (C) 2018-2023 Oracle. All Rights Reserved.
|
|
* Author: Darrick J. Wong <djwong@kernel.org>
|
|
*/
|
|
#ifndef __XFS_SCRUB_XFILE_H__
|
|
#define __XFS_SCRUB_XFILE_H__
|
|
|
|
struct xfile_page {
|
|
struct page *page;
|
|
void *fsdata;
|
|
loff_t pos;
|
|
};
|
|
|
|
static inline bool xfile_page_cached(const struct xfile_page *xfpage)
|
|
{
|
|
return xfpage->page != NULL;
|
|
}
|
|
|
|
static inline pgoff_t xfile_page_index(const struct xfile_page *xfpage)
|
|
{
|
|
return xfpage->page->index;
|
|
}
|
|
|
|
struct xfile {
|
|
struct file *file;
|
|
};
|
|
|
|
int xfile_create(const char *description, loff_t isize, struct xfile **xfilep);
|
|
void xfile_destroy(struct xfile *xf);
|
|
|
|
ssize_t xfile_pread(struct xfile *xf, void *buf, size_t count, loff_t pos);
|
|
ssize_t xfile_pwrite(struct xfile *xf, const void *buf, size_t count,
|
|
loff_t pos);
|
|
|
|
/*
|
|
* Load an object. Since we're treating this file as "memory", any error or
|
|
* short IO is treated as a failure to allocate memory.
|
|
*/
|
|
static inline int
|
|
xfile_obj_load(struct xfile *xf, void *buf, size_t count, loff_t pos)
|
|
{
|
|
ssize_t ret = xfile_pread(xf, buf, count, pos);
|
|
|
|
if (ret < 0 || ret != count)
|
|
return -ENOMEM;
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
* Store an object. Since we're treating this file as "memory", any error or
|
|
* short IO is treated as a failure to allocate memory.
|
|
*/
|
|
static inline int
|
|
xfile_obj_store(struct xfile *xf, const void *buf, size_t count, loff_t pos)
|
|
{
|
|
ssize_t ret = xfile_pwrite(xf, buf, count, pos);
|
|
|
|
if (ret < 0 || ret != count)
|
|
return -ENOMEM;
|
|
return 0;
|
|
}
|
|
|
|
loff_t xfile_seek_data(struct xfile *xf, loff_t pos);
|
|
|
|
struct xfile_stat {
|
|
loff_t size;
|
|
unsigned long long bytes;
|
|
};
|
|
|
|
int xfile_stat(struct xfile *xf, struct xfile_stat *statbuf);
|
|
|
|
int xfile_get_page(struct xfile *xf, loff_t offset, unsigned int len,
|
|
struct xfile_page *xbuf);
|
|
int xfile_put_page(struct xfile *xf, struct xfile_page *xbuf);
|
|
|
|
#endif /* __XFS_SCRUB_XFILE_H__ */
|