mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-27 04:47:05 +00:00
38ced43bb0
The sort in the btree write buffer flush path is a very hot path, and it's particularly performance sensitive since it's single threaded and can block every other thread on a multithreaded write workload. It's well worth doing a sort with inlined cmp and swap functions. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
57 lines
1.2 KiB
C
57 lines
1.2 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef _BCACHEFS_BTREE_WRITE_BUFFER_TYPES_H
|
|
#define _BCACHEFS_BTREE_WRITE_BUFFER_TYPES_H
|
|
|
|
#include "darray.h"
|
|
#include "journal_types.h"
|
|
|
|
#define BTREE_WRITE_BUFERED_VAL_U64s_MAX 4
|
|
#define BTREE_WRITE_BUFERED_U64s_MAX (BKEY_U64s + BTREE_WRITE_BUFERED_VAL_U64s_MAX)
|
|
|
|
struct wb_key_ref {
|
|
union {
|
|
struct {
|
|
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
|
|
unsigned idx:24;
|
|
u8 pos[sizeof(struct bpos)];
|
|
enum btree_id btree:8;
|
|
#else
|
|
enum btree_id btree:8;
|
|
u8 pos[sizeof(struct bpos)];
|
|
unsigned idx:24;
|
|
#endif
|
|
} __packed;
|
|
struct {
|
|
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
|
|
u64 lo;
|
|
u64 mi;
|
|
u64 hi;
|
|
#else
|
|
u64 hi;
|
|
u64 mi;
|
|
u64 lo;
|
|
#endif
|
|
};
|
|
};
|
|
};
|
|
|
|
struct btree_write_buffered_key {
|
|
enum btree_id btree:8;
|
|
u64 journal_seq:56;
|
|
__BKEY_PADDED(k, BTREE_WRITE_BUFERED_VAL_U64s_MAX);
|
|
};
|
|
|
|
struct btree_write_buffer_keys {
|
|
DARRAY(struct btree_write_buffered_key) keys;
|
|
struct journal_entry_pin pin;
|
|
struct mutex lock;
|
|
};
|
|
|
|
struct btree_write_buffer {
|
|
DARRAY(struct wb_key_ref) sorted;
|
|
struct btree_write_buffer_keys inc;
|
|
struct btree_write_buffer_keys flushing;
|
|
struct work_struct flush_work;
|
|
};
|
|
|
|
#endif /* _BCACHEFS_BTREE_WRITE_BUFFER_TYPES_H */
|