From: kernel test robot <lkp@intel.com>
To: fdmanana@kernel.org, linux-btrfs@vger.kernel.org
Cc: oe-kbuild-all@lists.linux.dev
Subject: Re: [PATCH 2/2] btrfs: correctly calculate delayed ref bytes when starting transaction
Date: Fri, 31 Mar 2023 02:51:09 +0800 [thread overview]
Message-ID: <202303310221.Zjv7RAZT-lkp@intel.com> (raw)
In-Reply-To: <93c382a002210831e1051456cdc5c44dbcef4562.1680185833.git.fdmanana@suse.com>
Hi,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on kdave/for-next]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/fdmanana-kernel-org/btrfs-make-btrfs_block_rsv_full-check-more-boolean-when-starting-transaction/20230330-224056
base: https://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux.git for-next
patch link: https://lore.kernel.org/r/93c382a002210831e1051456cdc5c44dbcef4562.1680185833.git.fdmanana%40suse.com
patch subject: [PATCH 2/2] btrfs: correctly calculate delayed ref bytes when starting transaction
config: riscv-allmodconfig (https://download.01.org/0day-ci/archive/20230331/202303310221.Zjv7RAZT-lkp@intel.com/config)
compiler: riscv64-linux-gcc (GCC) 12.1.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/intel-lab-lkp/linux/commit/7f30c221a11d9dc6fad3f763b3df7ecd0b6d966c
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review fdmanana-kernel-org/btrfs-make-btrfs_block_rsv_full-check-more-boolean-when-starting-transaction/20230330-224056
git checkout 7f30c221a11d9dc6fad3f763b3df7ecd0b6d966c
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=riscv olddefconfig
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=riscv SHELL=/bin/bash fs/
If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <lkp@intel.com>
| Link: https://lore.kernel.org/oe-kbuild-all/202303310221.Zjv7RAZT-lkp@intel.com/
All errors (new ones prefixed by >>):
fs/btrfs/transaction.c: In function 'start_transaction':
>> fs/btrfs/transaction.c:611:46: error: implicit declaration of function 'btrfs_calc_delayed_ref_bytes'; did you mean 'btrfs_run_delayed_refs'? [-Werror=implicit-function-declaration]
611 | delayed_refs_bytes = btrfs_calc_delayed_ref_bytes(fs_info,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
| btrfs_run_delayed_refs
cc1: some warnings being treated as errors
vim +611 fs/btrfs/transaction.c
558
559 static struct btrfs_trans_handle *
560 start_transaction(struct btrfs_root *root, unsigned int num_items,
561 unsigned int type, enum btrfs_reserve_flush_enum flush,
562 bool enforce_qgroups)
563 {
564 struct btrfs_fs_info *fs_info = root->fs_info;
565 struct btrfs_block_rsv *delayed_refs_rsv = &fs_info->delayed_refs_rsv;
566 struct btrfs_trans_handle *h;
567 struct btrfs_transaction *cur_trans;
568 u64 num_bytes = 0;
569 u64 qgroup_reserved = 0;
570 bool reloc_reserved = false;
571 bool do_chunk_alloc = false;
572 int ret;
573
574 if (BTRFS_FS_ERROR(fs_info))
575 return ERR_PTR(-EROFS);
576
577 if (current->journal_info) {
578 WARN_ON(type & TRANS_EXTWRITERS);
579 h = current->journal_info;
580 refcount_inc(&h->use_count);
581 WARN_ON(refcount_read(&h->use_count) > 2);
582 h->orig_rsv = h->block_rsv;
583 h->block_rsv = NULL;
584 goto got_it;
585 }
586
587 /*
588 * Do the reservation before we join the transaction so we can do all
589 * the appropriate flushing if need be.
590 */
591 if (num_items && root != fs_info->chunk_root) {
592 struct btrfs_block_rsv *rsv = &fs_info->trans_block_rsv;
593 u64 delayed_refs_bytes = 0;
594
595 qgroup_reserved = num_items * fs_info->nodesize;
596 ret = btrfs_qgroup_reserve_meta_pertrans(root, qgroup_reserved,
597 enforce_qgroups);
598 if (ret)
599 return ERR_PTR(ret);
600
601 /*
602 * We want to reserve all the bytes we may need all at once, so
603 * we only do 1 enospc flushing cycle per transaction start. We
604 * accomplish this by simply assuming we'll do num_items worth
605 * of delayed refs updates in this trans handle, and refill that
606 * amount for whatever is missing in the reserve.
607 */
608 num_bytes = btrfs_calc_insert_metadata_size(fs_info, num_items);
609 if (flush == BTRFS_RESERVE_FLUSH_ALL &&
610 !btrfs_block_rsv_full(delayed_refs_rsv)) {
> 611 delayed_refs_bytes = btrfs_calc_delayed_ref_bytes(fs_info,
612 num_items);
613 num_bytes += delayed_refs_bytes;
614 }
615
616 /*
617 * Do the reservation for the relocation root creation
618 */
619 if (need_reserve_reloc_root(root)) {
620 num_bytes += fs_info->nodesize;
621 reloc_reserved = true;
622 }
623
624 ret = btrfs_block_rsv_add(fs_info, rsv, num_bytes, flush);
625 if (ret)
626 goto reserve_fail;
627 if (delayed_refs_bytes) {
628 btrfs_migrate_to_delayed_refs_rsv(fs_info, rsv,
629 delayed_refs_bytes);
630 num_bytes -= delayed_refs_bytes;
631 }
632
633 if (rsv->space_info->force_alloc)
634 do_chunk_alloc = true;
635 } else if (num_items == 0 && flush == BTRFS_RESERVE_FLUSH_ALL &&
636 !btrfs_block_rsv_full(delayed_refs_rsv)) {
637 /*
638 * Some people call with btrfs_start_transaction(root, 0)
639 * because they can be throttled, but have some other mechanism
640 * for reserving space. We still want these guys to refill the
641 * delayed block_rsv so just add 1 items worth of reservation
642 * here.
643 */
644 ret = btrfs_delayed_refs_rsv_refill(fs_info, flush);
645 if (ret)
646 goto reserve_fail;
647 }
648 again:
649 h = kmem_cache_zalloc(btrfs_trans_handle_cachep, GFP_NOFS);
650 if (!h) {
651 ret = -ENOMEM;
652 goto alloc_fail;
653 }
654
655 /*
656 * If we are JOIN_NOLOCK we're already committing a transaction and
657 * waiting on this guy, so we don't need to do the sb_start_intwrite
658 * because we're already holding a ref. We need this because we could
659 * have raced in and did an fsync() on a file which can kick a commit
660 * and then we deadlock with somebody doing a freeze.
661 *
662 * If we are ATTACH, it means we just want to catch the current
663 * transaction and commit it, so we needn't do sb_start_intwrite().
664 */
665 if (type & __TRANS_FREEZABLE)
666 sb_start_intwrite(fs_info->sb);
667
668 if (may_wait_transaction(fs_info, type))
669 wait_current_trans(fs_info);
670
671 do {
672 ret = join_transaction(fs_info, type);
673 if (ret == -EBUSY) {
674 wait_current_trans(fs_info);
675 if (unlikely(type == TRANS_ATTACH ||
676 type == TRANS_JOIN_NOSTART))
677 ret = -ENOENT;
678 }
679 } while (ret == -EBUSY);
680
681 if (ret < 0)
682 goto join_fail;
683
684 cur_trans = fs_info->running_transaction;
685
686 h->transid = cur_trans->transid;
687 h->transaction = cur_trans;
688 refcount_set(&h->use_count, 1);
689 h->fs_info = root->fs_info;
690
691 h->type = type;
692 INIT_LIST_HEAD(&h->new_bgs);
693
694 smp_mb();
695 if (cur_trans->state >= TRANS_STATE_COMMIT_START &&
696 may_wait_transaction(fs_info, type)) {
697 current->journal_info = h;
698 btrfs_commit_transaction(h);
699 goto again;
700 }
701
702 if (num_bytes) {
703 trace_btrfs_space_reservation(fs_info, "transaction",
704 h->transid, num_bytes, 1);
705 h->block_rsv = &fs_info->trans_block_rsv;
706 h->bytes_reserved = num_bytes;
707 h->reloc_reserved = reloc_reserved;
708 }
709
710 got_it:
711 if (!current->journal_info)
712 current->journal_info = h;
713
714 /*
715 * If the space_info is marked ALLOC_FORCE then we'll get upgraded to
716 * ALLOC_FORCE the first run through, and then we won't allocate for
717 * anybody else who races in later. We don't care about the return
718 * value here.
719 */
720 if (do_chunk_alloc && num_bytes) {
721 u64 flags = h->block_rsv->space_info->flags;
722
723 btrfs_chunk_alloc(h, btrfs_get_alloc_profile(fs_info, flags),
724 CHUNK_ALLOC_NO_FORCE);
725 }
726
727 /*
728 * btrfs_record_root_in_trans() needs to alloc new extents, and may
729 * call btrfs_join_transaction() while we're also starting a
730 * transaction.
731 *
732 * Thus it need to be called after current->journal_info initialized,
733 * or we can deadlock.
734 */
735 ret = btrfs_record_root_in_trans(h, root);
736 if (ret) {
737 /*
738 * The transaction handle is fully initialized and linked with
739 * other structures so it needs to be ended in case of errors,
740 * not just freed.
741 */
742 btrfs_end_transaction(h);
743 return ERR_PTR(ret);
744 }
745
746 return h;
747
748 join_fail:
749 if (type & __TRANS_FREEZABLE)
750 sb_end_intwrite(fs_info->sb);
751 kmem_cache_free(btrfs_trans_handle_cachep, h);
752 alloc_fail:
753 if (num_bytes)
754 btrfs_block_rsv_release(fs_info, &fs_info->trans_block_rsv,
755 num_bytes, NULL);
756 reserve_fail:
757 btrfs_qgroup_free_meta_pertrans(root, qgroup_reserved);
758 return ERR_PTR(ret);
759 }
760
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests
next prev parent reply other threads:[~2023-03-30 18:52 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-30 14:39 [PATCH 0/2] btrfs: some trivial updates for delayed ref space reservation fdmanana
2023-03-30 14:39 ` [PATCH 1/2] btrfs: make btrfs_block_rsv_full() check more boolean when starting transaction fdmanana
2023-03-30 14:39 ` [PATCH 2/2] btrfs: correctly calculate delayed ref bytes " fdmanana
2023-03-30 18:51 ` kernel test robot [this message]
2023-03-30 20:05 ` [PATCH 0/2] btrfs: some trivial updates for delayed ref space reservation David Sterba
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202303310221.Zjv7RAZT-lkp@intel.com \
--to=lkp@intel.com \
--cc=fdmanana@kernel.org \
--cc=linux-btrfs@vger.kernel.org \
--cc=oe-kbuild-all@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.