fs/f2fs/gc.c:744:5: warning: stack frame size (3024) exceeds limit (2048) in 'f2fs_get_victim'

From: kernel test robot
Date: Thu Jun 29 2023 - 10:30:36 EST


Hi Yangtao,

FYI, the error/warning still remains.

tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: 3a8a670eeeaa40d87bd38a587438952741980c18
commit: 19e0e21a51183d4e0784602f27e4db7b965077be f2fs: remove struct victim_selection default_v_ops
date: 3 months ago
config: riscv-randconfig-r026-20230629 (https://download.01.org/0day-ci/archive/20230629/202306292200.SGaQImUq-lkp@xxxxxxxxx/config)
compiler: clang version 17.0.0 (https://github.com/llvm/llvm-project.git 4a5ac14ee968ff0ad5d2cc1ffa0299048db4c88a)
reproduce: (https://download.01.org/0day-ci/archive/20230629/202306292200.SGaQImUq-lkp@xxxxxxxxx/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@xxxxxxxxx>
| Closes: https://lore.kernel.org/oe-kbuild-all/202306292200.SGaQImUq-lkp@xxxxxxxxx/

All warnings (new ones prefixed by >>):

>> fs/f2fs/gc.c:744:5: warning: stack frame size (3024) exceeds limit (2048) in 'f2fs_get_victim' [-Wframe-larger-than]
744 | int f2fs_get_victim(struct f2fs_sb_info *sbi, unsigned int *result,
| ^
1 warning generated.


vim +/f2fs_get_victim +744 fs/f2fs/gc.c

735
736 /*
737 * This function is called from two paths.
738 * One is garbage collection and the other is SSR segment selection.
739 * When it is called during GC, it just gets a victim segment
740 * and it does not remove it from dirty seglist.
741 * When it is called from SSR segment selection, it finds a segment
742 * which has minimum valid blocks and removes it from dirty seglist.
743 */
> 744 int f2fs_get_victim(struct f2fs_sb_info *sbi, unsigned int *result,
745 int gc_type, int type, char alloc_mode,
746 unsigned long long age)
747 {
748 struct dirty_seglist_info *dirty_i = DIRTY_I(sbi);
749 struct sit_info *sm = SIT_I(sbi);
750 struct victim_sel_policy p;
751 unsigned int secno, last_victim;
752 unsigned int last_segment;
753 unsigned int nsearched;
754 bool is_atgc;
755 int ret = 0;
756
757 mutex_lock(&dirty_i->seglist_lock);
758 last_segment = MAIN_SECS(sbi) * sbi->segs_per_sec;
759
760 p.alloc_mode = alloc_mode;
761 p.age = age;
762 p.age_threshold = sbi->am.age_threshold;
763
764 retry:
765 select_policy(sbi, gc_type, type, &p);
766 p.min_segno = NULL_SEGNO;
767 p.oldest_age = 0;
768 p.min_cost = get_max_cost(sbi, &p);
769
770 is_atgc = (p.gc_mode == GC_AT || p.alloc_mode == AT_SSR);
771 nsearched = 0;
772
773 if (is_atgc)
774 SIT_I(sbi)->dirty_min_mtime = ULLONG_MAX;
775
776 if (*result != NULL_SEGNO) {
777 if (!get_valid_blocks(sbi, *result, false)) {
778 ret = -ENODATA;
779 goto out;
780 }
781
782 if (sec_usage_check(sbi, GET_SEC_FROM_SEG(sbi, *result)))
783 ret = -EBUSY;
784 else
785 p.min_segno = *result;
786 goto out;
787 }
788
789 ret = -ENODATA;
790 if (p.max_search == 0)
791 goto out;
792
793 if (__is_large_section(sbi) && p.alloc_mode == LFS) {
794 if (sbi->next_victim_seg[BG_GC] != NULL_SEGNO) {
795 p.min_segno = sbi->next_victim_seg[BG_GC];
796 *result = p.min_segno;
797 sbi->next_victim_seg[BG_GC] = NULL_SEGNO;
798 goto got_result;
799 }
800 if (gc_type == FG_GC &&
801 sbi->next_victim_seg[FG_GC] != NULL_SEGNO) {
802 p.min_segno = sbi->next_victim_seg[FG_GC];
803 *result = p.min_segno;
804 sbi->next_victim_seg[FG_GC] = NULL_SEGNO;
805 goto got_result;
806 }
807 }
808
809 last_victim = sm->last_victim[p.gc_mode];
810 if (p.alloc_mode == LFS && gc_type == FG_GC) {
811 p.min_segno = check_bg_victims(sbi);
812 if (p.min_segno != NULL_SEGNO)
813 goto got_it;
814 }
815
816 while (1) {
817 unsigned long cost, *dirty_bitmap;
818 unsigned int unit_no, segno;
819
820 dirty_bitmap = p.dirty_bitmap;
821 unit_no = find_next_bit(dirty_bitmap,
822 last_segment / p.ofs_unit,
823 p.offset / p.ofs_unit);
824 segno = unit_no * p.ofs_unit;
825 if (segno >= last_segment) {
826 if (sm->last_victim[p.gc_mode]) {
827 last_segment =
828 sm->last_victim[p.gc_mode];
829 sm->last_victim[p.gc_mode] = 0;
830 p.offset = 0;
831 continue;
832 }
833 break;
834 }
835
836 p.offset = segno + p.ofs_unit;
837 nsearched++;
838

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki