FireAsf 🔥
Find a file
Seiji Nishikawa 01bc6312f9 mm: vmscan: account for free pages to prevent infinite Loop in throttle_direct_reclaim()
commit 6aaced5abd32e2a57cd94fd64f824514d0361da8 upstream.

The task sometimes continues looping in throttle_direct_reclaim() because
allow_direct_reclaim(pgdat) keeps returning false.

 #0 [ffff80002cb6f8d0] __switch_to at ffff8000080095ac
 #1 [ffff80002cb6f900] __schedule at ffff800008abbd1c
 #2 [ffff80002cb6f990] schedule at ffff800008abc50c
 #3 [ffff80002cb6f9b0] throttle_direct_reclaim at ffff800008273550
 #4 [ffff80002cb6fa20] try_to_free_pages at ffff800008277b68
 #5 [ffff80002cb6fae0] __alloc_pages_nodemask at ffff8000082c4660
 #6 [ffff80002cb6fc50] alloc_pages_vma at ffff8000082e4a98
 #7 [ffff80002cb6fca0] do_anonymous_page at ffff80000829f5a8
 #8 [ffff80002cb6fce0] __handle_mm_fault at ffff8000082a5974
 #9 [ffff80002cb6fd90] handle_mm_fault at ffff8000082a5bd4

At this point, the pgdat contains the following two zones:

        NODE: 4  ZONE: 0  ADDR: ffff00817fffe540  NAME: "DMA32"
          SIZE: 20480  MIN/LOW/HIGH: 11/28/45
          VM_STAT:
                NR_FREE_PAGES: 359
        NR_ZONE_INACTIVE_ANON: 18813
          NR_ZONE_ACTIVE_ANON: 0
        NR_ZONE_INACTIVE_FILE: 50
          NR_ZONE_ACTIVE_FILE: 0
          NR_ZONE_UNEVICTABLE: 0
        NR_ZONE_WRITE_PENDING: 0
                     NR_MLOCK: 0
                    NR_BOUNCE: 0
                   NR_ZSPAGES: 0
            NR_FREE_CMA_PAGES: 0

        NODE: 4  ZONE: 1  ADDR: ffff00817fffec00  NAME: "Normal"
          SIZE: 8454144  PRESENT: 98304  MIN/LOW/HIGH: 68/166/264
          VM_STAT:
                NR_FREE_PAGES: 146
        NR_ZONE_INACTIVE_ANON: 94668
          NR_ZONE_ACTIVE_ANON: 3
        NR_ZONE_INACTIVE_FILE: 735
          NR_ZONE_ACTIVE_FILE: 78
          NR_ZONE_UNEVICTABLE: 0
        NR_ZONE_WRITE_PENDING: 0
                     NR_MLOCK: 0
                    NR_BOUNCE: 0
                   NR_ZSPAGES: 0
            NR_FREE_CMA_PAGES: 0

In allow_direct_reclaim(), while processing ZONE_DMA32, the sum of
inactive/active file-backed pages calculated in zone_reclaimable_pages()
based on the result of zone_page_state_snapshot() is zero.

Additionally, since this system lacks swap, the calculation of inactive/
active anonymous pages is skipped.

        crash> p nr_swap_pages
        nr_swap_pages = $1937 = {
          counter = 0
        }

As a result, ZONE_DMA32 is deemed unreclaimable and skipped, moving on to
the processing of the next zone, ZONE_NORMAL, despite ZONE_DMA32 having
free pages significantly exceeding the high watermark.

The problem is that the pgdat->kswapd_failures hasn't been incremented.

        crash> px ((struct pglist_data *) 0xffff00817fffe540)->kswapd_failures
        $1935 = 0x0

This is because the node deemed balanced.  The node balancing logic in
balance_pgdat() evaluates all zones collectively.  If one or more zones
(e.g., ZONE_DMA32) have enough free pages to meet their watermarks, the
entire node is deemed balanced.  This causes balance_pgdat() to exit early
before incrementing the kswapd_failures, as it considers the overall
memory state acceptable, even though some zones (like ZONE_NORMAL) remain
under significant pressure.


The patch ensures that zone_reclaimable_pages() includes free pages
(NR_FREE_PAGES) in its calculation when no other reclaimable pages are
available (e.g., file-backed or anonymous pages).  This change prevents
zones like ZONE_DMA32, which have sufficient free pages, from being
mistakenly deemed unreclaimable.  By doing so, the patch ensures proper
node balancing, avoids masking pressure on other zones like ZONE_NORMAL,
and prevents infinite loops in throttle_direct_reclaim() caused by
allow_direct_reclaim(pgdat) repeatedly returning false.


The kernel hangs due to a task stuck in throttle_direct_reclaim(), caused
by a node being incorrectly deemed balanced despite pressure in certain
zones, such as ZONE_NORMAL.  This issue arises from
zone_reclaimable_pages() returning 0 for zones without reclaimable file-
backed or anonymous pages, causing zones like ZONE_DMA32 with sufficient
free pages to be skipped.

The lack of swap or reclaimable pages results in ZONE_DMA32 being ignored
during reclaim, masking pressure in other zones.  Consequently,
pgdat->kswapd_failures remains 0 in balance_pgdat(), preventing fallback
mechanisms in allow_direct_reclaim() from being triggered, leading to an
infinite loop in throttle_direct_reclaim().

This patch modifies zone_reclaimable_pages() to account for free pages
(NR_FREE_PAGES) when no other reclaimable pages exist.  This ensures zones
with sufficient free pages are not skipped, enabling proper balancing and
reclaim behavior.

[akpm@linux-foundation.org: coding-style cleanups]
Link: https://lkml.kernel.org/r/20241130164346.436469-1-snishika@redhat.com
Link: https://lkml.kernel.org/r/20241130161236.433747-2-snishika@redhat.com
Fixes: 5a1c84b404a7 ("mm: remove reclaim and compaction retry approximations")
Signed-off-by: Seiji Nishikawa <snishika@redhat.com>
Cc: Mel Gorman <mgorman@techsingularity.net>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2025-01-15 16:29:56 +01:00
.github/workflows Add build stuff 2024-06-15 16:48:05 -03:00
android Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
arch ARC: build: Try to guess GCC variant of cross compiler 2025-01-15 16:29:56 +01:00
block blk-iocost: Avoid using clamp() on inuse in __propagate_weights() 2025-01-02 17:01:17 +01:00
certs Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
crypto crypto: pcrypt - Call crypto layer directly when padata_do_parallel() return -EBUSY 2024-12-17 13:23:59 +01:00
Documentation tcp: add sysctls for TCP PLB parameters 2024-12-18 15:08:12 +01:00
drivers drm: adv7511: Drop dsi single lane support 2025-01-15 16:29:56 +01:00
firmware/tsp_goodix Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
fs btrfs: don't set lock_owner when locking extent buffer for reading 2025-01-15 16:29:56 +01:00
gki Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
include af_packet: fix vlan_get_protocol_dgram() vs MSG_PEEK 2025-01-15 16:29:54 +01:00
init sched: linux5.4.y-bore5.1.0 2024-12-18 15:09:41 +01:00
io_uring io_uring: fix possible deadlock in io_register_iowq_max_workers() 2024-11-30 02:33:28 +01:00
ipc Revert "Make more sysctl constants read-only" 2024-12-03 19:56:17 +01:00
kernel bpf: fix potential error return 2025-01-15 16:29:56 +01:00
kernel_build FireAsf 4.5 Testing232 2025-01-02 22:18:54 +01:00
KernelSU@b766b98513 Revert "Welcome KernelSU-Next with SusFs" 2025-01-06 22:38:10 +01:00
kunitconfigs Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
lib Revert "lib/Kconfig.debug: Remove DEBUG_KERNEL depend on DEBUG_KMEMLEAK|SCHED_DEBUG|SCHEDSTATS" 2024-12-18 11:09:39 +01:00
LICENSES Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
mm mm: vmscan: account for free pages to prevent infinite Loop in throttle_direct_reclaim() 2025-01-15 16:29:56 +01:00
net net/sctp: Prevent autoclose integer overflow in sctp_association_init() 2025-01-15 16:29:56 +01:00
samples samples/bpf: Fix a resource leak 2024-12-17 13:24:30 +01:00
scripts modpost: fix the missed iteration for the max bit in do_input() 2025-01-15 16:29:56 +01:00
security selinux: ignore unknown extended permissions 2025-01-15 16:29:52 +01:00
sound sound: usb: format: don't warn that raw DSD is unsupported 2025-01-15 16:29:56 +01:00
test Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
tools objtool/x86: allow syscall instruction 2025-01-02 17:01:18 +01:00
usr Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
virt Revert "KVM: Fix a data race on last_boosted_vcpu in kvm_vcpu_on_spin()" 2024-11-24 00:22:53 +01:00
build.config.aarch64 Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
build.config.allmodconfig Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
build.config.allmodconfig.aarch64 Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
build.config.allmodconfig.arm Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
build.config.allmodconfig.x86_64 Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
build.config.amlogic Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
build.config.arm Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
build.config.common Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
build.config.db845c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
build.config.erd8825_a25_s Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
build.config.erd8825_s Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
build.config.erd9925_evt0_s Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
build.config.erd9925_evt0_s5300_s Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
build.config.erd9925_s Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
build.config.gki Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
build.config.gki-debug.aarch64 Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
build.config.gki-debug.x86_64 Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
build.config.gki.aarch64 Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
build.config.gki.aarch64.fips140 Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
build.config.gki.aarch64.fips140_eval_testing Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
build.config.gki.x86_64 Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
build.config.gki_kasan Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
build.config.gki_kasan.aarch64 Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
build.config.gki_kasan.x86_64 Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
build.config.gki_kprobes Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
build.config.gki_kprobes.aarch64 Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
build.config.gki_kprobes.x86_64 Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
build.config.hikey960 Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
build.config.khwasan Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
build.config.mcd Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
build.config.rockchip Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
build.config.universal2100_s Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
build.config.universal8825_s Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
build.config.universal9925_evt0_s Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
build.config.universal9925_s Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
build.config.x86_64 Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
build.sh build.sh: Fixup 2024-12-03 18:20:43 +01:00
COPYING Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
CREDITS Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
Kbuild Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
Kconfig Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
linux-stable.sh linux-stable.sh: Added for upstream 2024-11-08 11:11:32 +01:00
MAINTAINERS Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
Makefile Linux 5.10.232 2025-01-02 17:01:19 +01:00
OWNERS Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
README Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
README.md Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
regenerate.sh regenerate.sh: Commit after defconfigs regeneration 2025-01-06 22:11:53 +01:00
vendor_boot_module_order_exynos2100.cfg Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
vendor_boot_module_order_s5e8825.cfg Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
vendor_boot_module_order_s5e9925.cfg Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
vendor_module_list_s5e8825.cfg Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
vendor_module_list_s5e9925.cfg Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
vendor_module_list_s5e9925_b0s.cfg Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
vendor_module_list_s5e9925_g0s.cfg Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
vendor_module_list_s5e9925_r0s.cfg Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00

How do I submit patches to Android Common Kernels

  1. BEST: Make all of your changes to upstream Linux. If appropriate, backport to the stable releases. These patches will be merged automatically in the corresponding common kernels. If the patch is already in upstream Linux, post a backport of the patch that conforms to the patch requirements below.

    • Do not send patches upstream that contain only symbol exports. To be considered for upstream Linux, additions of EXPORT_SYMBOL_GPL() require an in-tree modular driver that uses the symbol -- so include the new driver or changes to an existing driver in the same patchset as the export.
    • When sending patches upstream, the commit message must contain a clear case for why the patch is needed and beneficial to the community. Enabling out-of-tree drivers or functionality is not not a persuasive case.
  2. LESS GOOD: Develop your patches out-of-tree (from an upstream Linux point-of-view). Unless these are fixing an Android-specific bug, these are very unlikely to be accepted unless they have been coordinated with kernel-team@android.com. If you want to proceed, post a patch that conforms to the patch requirements below.

Common Kernel patch requirements

  • All patches must conform to the Linux kernel coding standards and pass script/checkpatch.pl
  • Patches shall not break gki_defconfig or allmodconfig builds for arm, arm64, x86, x86_64 architectures (see https://source.android.com/setup/build/building-kernels)
  • If the patch is not merged from an upstream branch, the subject must be tagged with the type of patch: UPSTREAM:, BACKPORT:, FROMGIT:, FROMLIST:, or ANDROID:.
  • All patches must have a Change-Id: tag (see https://gerrit-review.googlesource.com/Documentation/user-changeid.html)
  • If an Android bug has been assigned, there must be a Bug: tag.
  • All patches must have a Signed-off-by: tag by the author and the submitter

Additional requirements are listed below based on patch type

Requirements for backports from mainline Linux: UPSTREAM:, BACKPORT:

  • If the patch is a cherry-pick from Linux mainline with no changes at all
    • tag the patch subject with UPSTREAM:.
    • add upstream commit information with a (cherry picked from commit ...) line
    • Example:
      • if the upstream commit message is
        important patch from upstream

        This is the detailed description of the important patch

        Signed-off-by: Fred Jones <fred.jones@foo.org>
  • then Joe Smith would upload the patch for the common kernel as
        UPSTREAM: important patch from upstream

        This is the detailed description of the important patch

        Signed-off-by: Fred Jones <fred.jones@foo.org>

        Bug: 135791357
        Change-Id: I4caaaa566ea080fa148c5e768bb1a0b6f7201c01
        (cherry picked from commit c31e73121f4c1ec41143423ac6ce3ce6dafdcec1)
        Signed-off-by: Joe Smith <joe.smith@foo.org>
  • If the patch requires any changes from the upstream version, tag the patch with BACKPORT: instead of UPSTREAM:.
    • use the same tags as UPSTREAM:
    • add comments about the changes under the (cherry picked from commit ...) line
    • Example:
        BACKPORT: important patch from upstream

        This is the detailed description of the important patch

        Signed-off-by: Fred Jones <fred.jones@foo.org>

        Bug: 135791357
        Change-Id: I4caaaa566ea080fa148c5e768bb1a0b6f7201c01
        (cherry picked from commit c31e73121f4c1ec41143423ac6ce3ce6dafdcec1)
        [joe: Resolved minor conflict in drivers/foo/bar.c ]
        Signed-off-by: Joe Smith <joe.smith@foo.org>

Requirements for other backports: FROMGIT:, FROMLIST:,

  • If the patch has been merged into an upstream maintainer tree, but has not yet been merged into Linux mainline
    • tag the patch subject with FROMGIT:
    • add info on where the patch came from as (cherry picked from commit <sha1> <repo> <branch>). This must be a stable maintainer branch (not rebased, so don't use linux-next for example).
    • if changes were required, use BACKPORT: FROMGIT:
    • Example:
      • if the commit message in the maintainer tree is
        important patch from upstream

        This is the detailed description of the important patch

        Signed-off-by: Fred Jones <fred.jones@foo.org>
  • then Joe Smith would upload the patch for the common kernel as
        FROMGIT: important patch from upstream

        This is the detailed description of the important patch

        Signed-off-by: Fred Jones <fred.jones@foo.org>

        Bug: 135791357
        (cherry picked from commit 878a2fd9de10b03d11d2f622250285c7e63deace
         https://git.kernel.org/pub/scm/linux/kernel/git/foo/bar.git test-branch)
        Change-Id: I4caaaa566ea080fa148c5e768bb1a0b6f7201c01
        Signed-off-by: Joe Smith <joe.smith@foo.org>
  • If the patch has been submitted to LKML, but not accepted into any maintainer tree
    • tag the patch subject with FROMLIST:
    • add a Link: tag with a link to the submittal on lore.kernel.org
    • add a Bug: tag with the Android bug (required for patches not accepted into a maintainer tree)
    • if changes were required, use BACKPORT: FROMLIST:
    • Example:
        FROMLIST: important patch from upstream

        This is the detailed description of the important patch

        Signed-off-by: Fred Jones <fred.jones@foo.org>

        Bug: 135791357
        Link: https://lore.kernel.org/lkml/20190619171517.GA17557@someone.com/
        Change-Id: I4caaaa566ea080fa148c5e768bb1a0b6f7201c01
        Signed-off-by: Joe Smith <joe.smith@foo.org>

Requirements for Android-specific patches: ANDROID:

  • If the patch is fixing a bug to Android-specific code
    • tag the patch subject with ANDROID:
    • add a Fixes: tag that cites the patch with the bug
    • Example:
        ANDROID: fix android-specific bug in foobar.c

        This is the detailed description of the important fix

        Fixes: 1234abcd2468 ("foobar: add cool feature")
        Change-Id: I4caaaa566ea080fa148c5e768bb1a0b6f7201c01
        Signed-off-by: Joe Smith <joe.smith@foo.org>
  • If the patch is a new feature
    • tag the patch subject with ANDROID:
    • add a Bug: tag with the Android bug (required for android-specific features)