LINUX.ORG.RU

История изменений

Исправление cumvillain, (текущая версия) :

С другой стороны, у него в тестах есть явный нюанс: fio пишет/читает с O_DIRECT. Большой вопрос в том оптимизировали ли под такое bcachefs.

Собственно, вот его direct write:

ssize_t bch2_direct_write(struct kiocb *req, struct iov_iter *iter)
{
	struct file *file = req->ki_filp;
	struct address_space *mapping = file->f_mapping;
	struct bch_inode_info *inode = file_bch_inode(file);
	struct bch_fs *c = inode->v.i_sb->s_fs_info;
	struct dio_write *dio;
	struct bio *bio;
	bool locked = true, extending;
	ssize_t ret;

	prefetch(&c->opts);
	prefetch((void *) &c->opts + 64);
	prefetch(&inode->ei_inode);
	prefetch((void *) &inode->ei_inode + 64);

	inode_lock(&inode->v);

	ret = generic_write_checks(req, iter);
	if (unlikely(ret <= 0))
		goto err;
[...]

Здесь inode_lock() это семафор. То есть fio с O_DIRECT как минимум натыкается на семафор (который в отличии от спинлока может спать) в параллельных запросах в один файл. Хз насколько сильно это влияет в данном случае (я мало что смыслю в fs/), но это может добавлять проблем.

Исправление cumvillain, :

С другой стороны, у него в тестах есть явный нюанс: fio пишет/читает с O_DIRECT. Большой вопрос в том оптимизировали ли под такое bcachefs.

Собственно, вот его direct write:

ssize_t bch2_direct_write(struct kiocb *req, struct iov_iter *iter)
{
	struct file *file = req->ki_filp;
	struct address_space *mapping = file->f_mapping;
	struct bch_inode_info *inode = file_bch_inode(file);
	struct bch_fs *c = inode->v.i_sb->s_fs_info;
	struct dio_write *dio;
	struct bio *bio;
	bool locked = true, extending;
	ssize_t ret;

	prefetch(&c->opts);
	prefetch((void *) &c->opts + 64);
	prefetch(&inode->ei_inode);
	prefetch((void *) &inode->ei_inode + 64);

	inode_lock(&inode->v);

	ret = generic_write_checks(req, iter);
	if (unlikely(ret <= 0))
		goto err;
[...]

Здесь inode_lock() это семафор. То есть fio с O_DIRECT как минимум натыкается на семафор в параллельных запросах в один файл. Хз насколько сильно это влияет в данном случае (я мало что смыслю в fs/), но это может добавлять проблем.

Исправление cumvillain, :

С другой стороны, у него в тестах есть явный нюанс: fio пишет/читает с O_DIRECT. Большой вопрос в том оптимизировали ли под такое bcachefs.

Собственно, вот его direct write:

ssize_t bch2_direct_write(struct kiocb *req, struct iov_iter *iter)
{
	struct file *file = req->ki_filp;
	struct address_space *mapping = file->f_mapping;
	struct bch_inode_info *inode = file_bch_inode(file);
	struct bch_fs *c = inode->v.i_sb->s_fs_info;
	struct dio_write *dio;
	struct bio *bio;
	bool locked = true, extending;
	ssize_t ret;

	prefetch(&c->opts);
	prefetch((void *) &c->opts + 64);
	prefetch(&inode->ei_inode);
	prefetch((void *) &inode->ei_inode + 64);

	inode_lock(&inode->v);

	ret = generic_write_checks(req, iter);
	if (unlikely(ret <= 0))
		goto err;
[...]

Здесь inode_lock() это семафор. По сути fio с O_DIRECT в данном случае пишет с глубиной 1.

Исправление cumvillain, :

С другой стороны, у него в тестах есть явный нюанс: fio пишет/читает с O_DIRECT. Большой вопрос в том оптимизировали ли под такое bcachefs.

Собственно, вот его direct write:

ssize_t bch2_direct_write(struct kiocb *req, struct iov_iter *iter)
{
	struct file *file = req->ki_filp;
	struct address_space *mapping = file->f_mapping;
	struct bch_inode_info *inode = file_bch_inode(file);
	struct bch_fs *c = inode->v.i_sb->s_fs_info;
	struct dio_write *dio;
	struct bio *bio;
	bool locked = true, extending;
	ssize_t ret;

	prefetch(&c->opts);
	prefetch((void *) &c->opts + 64);
	prefetch(&inode->ei_inode);
	prefetch((void *) &inode->ei_inode + 64);

	inode_lock(&inode->v);

	ret = generic_write_checks(req, iter);
	if (unlikely(ret <= 0))
		goto err;
[...]

Здесь inode_lock() это семафор. Поэтому, по сути fio с O_DIRECT в данном случае пишет с глубиной 1.

Исходная версия cumvillain, :

С другой стороны, у него в тестах есть явный нюанс: fio пишет/читает с O_DIRECT. Большой вопрос в том оптимизировали ли под такое bcachefs.