Skip to content

Conversation

tabrisnet
Copy link

@tabrisnet tabrisnet commented Aug 24, 2025

Inspiration for #8560, where much more testing was done also.

Use ZSTD [originally XZ] as modprobe --version says

kmod version 30
+ZSTD +XZ -ZLIB +LIBCRYPTO -EXPERIMENTAL

Reason to do this:

root@ratatosk:~# find /lib/modules/6.12.35-current-filogic/ -name '*.ko.xz'|xargs xz -l |tail -n 1
  265     266  5,253.3 KiB     24.3 MiB  0.211  CRC32   265 files
root@ratatosk:~# ls ~tabris/linux-image-current-filogic_25.11.0-*.deb -lhtr
-rw-r--r-- 1 tabris tabris 48M Aug 22 12:04 /home/tabris/linux-image-current-filogic_25.11.0-trunk_arm64__6.12.35-S9403-D0b5d-P0000-C0ef5H2313-HK01ba-Vc222-Bd200-R448a.deb
-rw-r--r-- 1 tabris tabris 28M Aug 23 20:58 /home/tabris/linux-image-current-filogic_25.11.0-trunk_arm64__6.12.35-S9403-D0b5d-P0000-C999999H2313-HK01ba-Vc222-Bd200-R448a.deb

So it saves ~20MiB on disc and in the linux-image package as well.

Reasons to not do this:
a) paranoia about the xz library compromise [not really an XZ thing, just potential bad association].
a.1) Is this a new kernel dependency for us? It should already be a userspace dependency.
On my NanoPC-T6, zgrep /proc/config.gz mentions DECOMPRESS_XZ, so I don't think this is new.
b) possibility of tooling failures [MODULE_DECOMPRESS may save us, maybe it won't] on older versions of Armbian/debian.
b.1) MODULE_DECOMPRESS likely makes the kernel base-image a hair bigger.
c) could use zstd instead. zstd is already included for zram.

This is the kind of thing to consider making standard across all board configs. But I don't own all of the boards so can't hardly test them all. OTOH, it shouldn't be interesting per-board/chip, only per kernel & userspace. We could just ignore the vendor kernels.

Description

see above for justification/intent.

How Has This Been Tested?

Please describe the tests that you ran to verify your changes. Please also note any relevant details for your test configuration.

  • built/installed/booted [on BPI-R4], checked /proc/modules wasn't empty.

Checklist:

Please delete options that are not relevant.

  • I have performed a self-review of my own code

Copy link
Contributor

coderabbitai bot commented Aug 24, 2025

Walkthrough

Added three kernel configuration options to config/kernel/linux-filogic-current.config: CONFIG_MODULE_COMPRESS=y, CONFIG_MODULE_COMPRESS_ZSTD=y, and CONFIG_MODULE_DECOMPRESS=y. These lines were inserted near existing module-related options (e.g., CONFIG_MODULES, CONFIG_MODULE_UNLOAD). No existing lines were modified or removed; only additions were made.

Estimated code review effort

🎯 1 (Trivial) | ⏱️ ~2 minutes

Possibly related PRs

Suggested reviewers

  • rpardini
  • chraac
  • leggewie
  • EvilOlaf
  • igorpecovnik
  • teknoid
  • Tonymac32

Pre-merge checks and finishing touches

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed The title clearly and concisely summarizes the primary change by specifying that the BPI-R4 kernel configuration is being updated to enable on-disk compression of kernel modules, which directly reflects the modifications in the pull request.
Description Check ✅ Passed The description thoroughly outlines the motivation, chosen compression format, empirical measurements, and testing steps for enabling module compression, making it directly relevant to and supportive of the changes introduced in the pull request.
Docstring Coverage ✅ Passed No functions found in the changes. Docstring coverage check skipped.
✨ Finishing touches
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

Disabled knowledge base sources:

  • Jira integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between f3d98d6 and 8df6aed.

📒 Files selected for processing (1)
  • config/kernel/linux-filogic-current.config (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • config/kernel/linux-filogic-current.config

Tip

👮 Agentic pre-merge checks are now available in preview!

Pro plan users can now enable pre-merge checks in their settings to enforce checklists before merging PRs.

  • Built-in checks – Quickly apply ready-made checks to enforce title conventions, require pull request descriptions that follow templates, validate linked issues for compliance, and more.
  • Custom agentic checks – Define your own rules using CodeRabbit’s advanced agentic capabilities to enforce organization-specific policies and workflows. For example, you can instruct CodeRabbit’s agent to verify that API documentation is updated whenever API schema files are modified in a PR. Note: Upto 5 custom checks are currently allowed during the preview period. Pricing for this feature will be announced in a few weeks.

Please see the documentation for more information.

Example:

reviews:
  pre_merge_checks:
    custom_checks:
      - name: "Undocumented Breaking Changes"
        mode: "warning"
        instructions: |
          Pass/fail criteria: All breaking changes to public APIs, CLI flags, environment variables, configuration keys, database schemas, or HTTP/GraphQL endpoints must be documented in the "Breaking Change" section of the PR description and in CHANGELOG.md. Exclude purely internal or private changes (e.g., code not exported from package entry points or explicitly marked as internal).

Please share your feedback with us on this Discord post.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions github-actions bot added size/small PR with less then 50 lines 08 Milestone: Third quarter release Needs review Seeking for review Hardware Hardware related like kernel, U-Boot, ... and removed 08 Milestone: Third quarter release labels Aug 24, 2025
@tabrisnet
Copy link
Author

@coderabbitai review

Copy link
Contributor

coderabbitai bot commented Aug 24, 2025

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (2)
config/kernel/linux-filogic-current.config (2)

111-113: Be explicit about mutually exclusive choices to avoid merge ambiguity

Optional but helps readability during merges: explicitly mark the unused alternatives as not set next to these lines.

Apply this minimal diff:

 CONFIG_MODULE_UNLOAD=y
 CONFIG_MODULE_COMPRESS=y
 CONFIG_MODULE_COMPRESS_XZ=y
 CONFIG_MODULE_DECOMPRESS=y
+# Explicitly prefer XZ over other algorithms for modules
+# CONFIG_MODULE_COMPRESS_ZSTD is not set
+# CONFIG_MODULE_COMPRESS_GZIP is not set

111-113: Consider Zstd if boot-time is a priority (trade-off note, not a blocker)

XZ yields better on-disk compression; Zstd usually loads faster on low-power cores with a modest size penalty. If you later optimize for boot/module load latency over image size, switching to Zstd is a one-line change.

Alternative diff (for future consideration, not required for this PR):

-CONFIG_MODULE_COMPRESS_XZ=y
+# CONFIG_MODULE_COMPRESS_XZ is not set
+CONFIG_MODULE_COMPRESS_ZSTD=y
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 1056f8e and 690c874.

📒 Files selected for processing (1)
  • config/kernel/linux-filogic-current.config (1 hunks)
🧰 Additional context used
🧠 Learnings (1)
📓 Common learnings
Learnt from: rafayahmed317
PR: armbian/build#8484
File: config/kernel/linux-rk35xx-vendor.config:904-906
Timestamp: 2025-08-11T22:00:13.411Z
Learning: In the linux-rk35xx-vendor kernel, the LTE driver options (CONFIG_LTE, CONFIG_LTE_RM310, CONFIG_LTE_EM05) are defined as boolean in drivers/net/lte/Kconfig and cannot be built as modules - they must be either built-in (=y) or disabled.
🔇 Additional comments (3)
config/kernel/linux-filogic-current.config (3)

111-113: Change is coherent: XZ-compressed modules with in-kernel decompression

Enabling CONFIG_MODULE_COMPRESS together with CONFIG_MODULE_COMPRESS_XZ and CONFIG_MODULE_DECOMPRESS is a sensible trio. Given this config already has CONFIG_SQUASHFS_XZ=y, the XZ decompressor is already linked, so the incremental kernel bloat for module decompression should be minimal while improving robustness on systems where userspace kmod may not decompress. Looks good.


111-113: No module compression conflicts detected across config fragments

I ran the suggested ripgrep checks across config/kernel and confirmed that no other fragment selects CONFIG_MODULE_COMPRESS_ZSTD=y or CONFIG_MODULE_COMPRESS_GZIP=y. Therefore, the CONFIG_MODULE_COMPRESS_XZ=y setting in linux-filogic-current.config won’t be overridden by another fragment.


111-113: No additional CI checks required—xz-utils is already a host dependency

The package xz-utils appears under compressors in adaptative_prepare_host_dependencies within lib/functions/host/prepare-host.sh (around line 210), guaranteeing that xz(1) is installed in every build container. Per our “fail-fast” philosophy, declaring a host dependency is sufficient—no extra runtime check is needed.

• File: lib/functions/host/prepare-host.sh
• Line ~210: unzip zip pigz xz-utils pbzip2 lzop zstd

@leggewie
Copy link
Collaborator

leggewie commented Aug 24, 2025

Thank you for picking this up. Very valuable stuff.

I will not claim to be an expert on compression. My very quick and superficial research points to zstd possibly being the better choice here.

advantage xz: more, higher compression, more mature
advantage zstd: faster compression (not so important) and decompression (this matters), lower memory footprint

I agree we should generalize this as wide as possible, no special-casing if at all possible.

@tabrisnet tabrisnet force-pushed the tabrisnet_bpir4_koxz branch from 690c874 to 28b75d3 Compare August 24, 2025 19:01
@github-actions github-actions bot added the 08 Milestone: Third quarter release label Aug 24, 2025
@tabrisnet tabrisnet changed the title kernel config BPI-R4 - compress kernel ko modules kernel config BPI-R4 - compress kernel modules on disc Aug 24, 2025
@tabrisnet tabrisnet marked this pull request as ready for review August 24, 2025 19:05
@coderabbitai coderabbitai bot requested a review from leggewie August 24, 2025 19:06
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (2)
config/kernel/linux-filogic-current.config (2)

111-111: Be explicit about mutually exclusive module compression options.

To avoid surprises across kernel series (and merges), explicitly force other algorithms off when selecting compression to XZ.

Apply within this file:

 CONFIG_MODULES=y
 CONFIG_MODULE_UNLOAD=y
 CONFIG_MODULE_COMPRESS=y
 CONFIG_MODULE_COMPRESS_XZ=y
+CONFIG_MODULE_COMPRESS_ZSTD=n
+CONFIG_MODULE_COMPRESS_GZIP=n
 CONFIG_MODULE_DECOMPRESS=y

113-113: MODULE_DECOMPRESS=y may be optional if kmod already handles XZ.

Since kmod on your image supports XZ, in-kernel module decompression is a fallback rather than a requirement. It slightly grows the kernel image. If you need to keep the kernel tight (e.g., for small FIT or boot partitions), consider dropping this to rely on userspace. Given SQUASHFS_XZ=y is enabled, the XZ lib is likely already present, so the delta may be small—measure to decide.

Suggested quick measurement on two builds (with/without CONFIG_MODULE_DECOMPRESS):

  • Compare vmlinux/vmlinuz sizes and boot time deltas.
  • Confirm module loading still works early in initramfs.
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 690c874 and 28b75d3.

📒 Files selected for processing (1)
  • config/kernel/linux-filogic-current.config (1 hunks)
🧰 Additional context used
🧠 Learnings (1)
📓 Common learnings
Learnt from: rafayahmed317
PR: armbian/build#8484
File: config/kernel/linux-rk35xx-vendor.config:904-906
Timestamp: 2025-08-11T22:00:13.411Z
Learning: In the linux-rk35xx-vendor kernel, the LTE driver options (CONFIG_LTE, CONFIG_LTE_RM310, CONFIG_LTE_EM05) are defined as boolean in drivers/net/lte/Kconfig and cannot be built as modules - they must be either built-in (=y) or disabled.
🧬 Code graph analysis (1)
config/kernel/linux-filogic-current.config (1)
lib/functions/compilation/armbian-kernel.sh (2)
  • armbian_kernel_config__disable_various_options (70-100)
  • armbian_kernel_config_apply_opts_from_arrays (418-448)
🔇 Additional comments (2)
config/kernel/linux-filogic-current.config (2)

112-112: Consider Zstd for module compression if load latency is critical (optional)

I wasn’t able to get any measurements from the provided script because /lib/modules/$(uname -r) didn’t exist in the test environment. To properly compare XZ vs Zstd:

  • Run the benchmark on the actual target device (where your modules are installed).
  • Ensure the script’s kernel directory matches an existing version under /lib/modules; you can list available versions with:
    ls /lib/modules
  • Once you’ve adjusted the path (or are on the correct device), re-run the timing loop to capture:
    • Total /lib/modules/$(uname -r) size
    • Per-module unload/load times and memory usage

If you find load/decompression speed matters more than raw on-disk size, swapping to Zstd may yield faster modprobe times and lower RAM peaks on resource-constrained SoCs. Capture before/after size and timing metrics to validate any change.


626-633: Action Required: Confirm generic XZ decoder is enabled in your final .config

It looks like you ran the grep against the repository root (no .config present), rather than the generated kernel .config in your build output. The fragment in config/kernel/linux-filogic-current.config only shows arch‐specific decoders being unset; to ensure module decompression with XZ works, you must verify that the generic decoder (CONFIG_XZ_DEC) is enabled in the actual build .config.

• Locate the kernel’s generated .config (usually at the top of your build directory).
• Run:

grep -E '^CONFIG_XZ_DEC=y' /path/to/your/.config || echo "CONFIG_XZ_DEC is NOT set"

• If that option is missing or set to n, add or enable:

+ CONFIG_XZ_DEC=y

in your defconfig or via make menuconfig.

Once CONFIG_XZ_DEC=y is confirmed, module decompression with XZ will work even though the arch‐specific decoders remain disabled.

@tabrisnet
Copy link
Author

Thank you for picking this up. Very valuable stuff.

I will not claim to be an expert on compression. My very quick and superficial research points to zstd possibly being the better choice here.

advantage xz: more, higher compression, more mature advantage zstd: faster compression (not so important) and decompression (this matters), lower memory footprint

I agree we should generalize this as wide as possible, no special-casing if at all possible.

any idea how to benchmark build performance? Mr rabbit mentioned that we have existing parts of the build machinery suppressing this. 😦
#8538 (review)

I'd have used GZIP but our kmod doesn't support it :(

@leggewie
Copy link
Collaborator

leggewie commented Aug 25, 2025

any idea how to benchmark build performance? Mr rabbit mentioned that we have existing parts of the build machinery suppressing this. 😦 #8538 (review)

I don't see any mention of the build process suppressing anything. What are you referring to? The logs actually have time stamps.

What do you want to measure in terms of build performance? Speed? Then I assume "time ./compile.sh ..." should do the thing. You should do this a couple of times in a row, I guess to account for the effect of caches.

@tabrisnet
Copy link
Author

tabrisnet commented Aug 25, 2025

any idea how to benchmark build performance? Mr rabbit mentioned that we have existing parts of the build machinery suppressing this. 😦 #8538 (review)

I don't see any mention of the build process suppressing anything. What are you referring to? The logs actually have time stamps.

What do you want to measure in terms of build performance? Speed? Then I assume "time ./compile.sh ..." should do the thing. You should do this a couple of times in a row, I guess to account for the effect of caches.

Yeah, that's the obvious answer, but I expected the kernel compile & deb-packaging would get lost in the noise of the greater process. But trying to build just the kernel, manually, has been a fraught process [it defaulted to building as AMD64 for ./compile.sh docker-shell ... and then calling make manually]

I appear to have linked the wrong comment from the bot
#8538 (comment)

Module compression settings overridden by build pipeline – action required

Your additions in config/kernel/linux-filogic-current.config (lines 111–113):

CONFIG_MODULE_COMPRESS=y
CONFIG_MODULE_COMPRESS_XZ=y
CONFIG_MODULE_DECOMPRESS=y

are force-disabled during config finalization in lib/functions/compilation/armbian-kernel.sh (see

Clearly it works after KERNEL_CONFIGURE=yes, but I did note that everytime I went into this configuration process it had reverted the MODULE_COMPRESS. but hadn't looked deeply enough as it seemed to work with KERNEL_CONFIGURE=no

as to why to benchmark?
https://github.com/armbian/build/blame/main/lib/functions/compilation/armbian-kernel.sh#L64-66

# 
Description:
#   This function disables several kernel configuration options such as module compression, module signing,
#   and automatic versioning to speed up the build process and ensure compatibility with Armbian requirements.

the benchmarking was just to understand the cost, as clearly I would need to make a best argument here.

I'm also confused so far as to why my linux-image DEB pkgs aren't compressed [which invalidates my comment about the DEB pkg size... but not the on-disc size]. am I doing something wrong in my ./compile.sh invocation? so far adding DEB_COMPRESS=xz hasn't helped.

@tabrisnet
Copy link
Author

zstd produced a 30MB dpkg vs 28 for XZ... so it would be worthwhile

@tabrisnet
Copy link
Author

tabris@brunnt:~/build/armbian-build/output/debs$ time find linux-image-current-filogic_25.11.0-trunk_arm64__6.12.35-S9403-D0b5d-P0000-C999999H2313-HK01ba-Vc222-Bd200-R448a/ -name '*.ko'|xargs zstd -z -19
266 files compressed : 24.64%  (25493800 => 6282225 bytes)

real    0m4.615s
user    0m4.577s
sys     0m0.040s
tabris@brunnt:~/build/armbian-build/output/debs$ find linux-image-current-filogic_25.11.0-trunk_arm64__6.12.35-S9403-D0b5d-P0000-C999999H2313-HK01ba-Vc222-Bd200-R448a/ -name '*.ko.zst' |xargs du -hsc |tail -n 1
6.6M    total
tabris@brunnt:~/build/armbian-build/output/debs$ find linux-image-current-filogic_25.11.0-trunk_arm64__6.12.35-S9403-D0b5d-P0000-C999999H2313-HK01ba-Vc222-Bd200-R448a/ -name '*.ko' |xargs du -hsc |tail -n 1
25M     total

Ryzen 5950X
took ~4.6 seconds to compress the modules. Seems an unimportant CPU cost. otoh, multiplied by ~300 boards is ~25 minutes

@tabrisnet tabrisnet force-pushed the tabrisnet_bpir4_koxz branch from 28b75d3 to 39cc0df Compare August 27, 2025 18:04
@tabrisnet tabrisnet marked this pull request as draft August 27, 2025 19:48
@tabrisnet tabrisnet force-pushed the tabrisnet_bpir4_koxz branch from 39cc0df to 7b14e80 Compare August 29, 2025 19:16
@tabrisnet
Copy link
Author

@coderabbitai

Actionable comments posted: 0
🧹 Nitpick comments (2)

config/kernel/linux-filogic-current.config (2)> 111-113: Be explicit about mutually exclusive choices to avoid merge ambiguity

Optional but helps readability during merges: explicitly mark the unused alternatives as not set next to these lines.
Apply this minimal diff:

 CONFIG_MODULE_UNLOAD=y
 CONFIG_MODULE_COMPRESS=y
 CONFIG_MODULE_COMPRESS_XZ=y
 CONFIG_MODULE_DECOMPRESS=y
+# Explicitly prefer XZ over other algorithms for modules
+# CONFIG_MODULE_COMPRESS_ZSTD is not set
+# CONFIG_MODULE_COMPRESS_GZIP is not set

111-113: Consider Zstd if boot-time is a priority (trade-off note, not a blocker)
XZ yields better on-disk compression; Zstd usually loads faster on low-power cores with a modest size penalty. If you later optimize for boot/module load latency over image size, switching to Zstd is a one-line change.
Alternative diff (for future consideration, not required for this PR):

-CONFIG_MODULE_COMPRESS_XZ=y
+# CONFIG_MODULE_COMPRESS_XZ is not set
+CONFIG_MODULE_COMPRESS_ZSTD=y

📜 Review details

regarding the nitpick comments:
a) the file is autogenerated [from manual inputs that modify the previous config], comments won't be retained in future updates by other maintainers
b) it's an overlay on top of the arch defconfig, so omissions vs full configs aren't particularly relevant.

Copy link
Contributor

coderabbitai bot commented Aug 30, 2025

Tip

For best results, initiate chat on the files or code changes.

@tabrisnet Thank you for the clarification! You're absolutely right on both points:

a) Since the kernel config file is autogenerated from manual inputs and gets regenerated by maintainers, adding comments would indeed be futile as they'd be lost in future updates.

b) As an overlay configuration on top of the arch defconfig, explicit "not set" statements for mutually exclusive options aren't necessary - the overlay only needs to specify the changes from the base configuration.

The automated review's nitpick suggestions weren't contextually appropriate for this type of configuration file. Your approach of simply enabling the desired compression method without explicit negation of alternatives is the correct pattern for Armbian's overlay configs.

I noticed your excellent benchmarking work in the discussion - the ZSTD compression results showing ~4.6 seconds for 266 modules with 75.36% compression ratio, and your consideration of the trade-offs between XZ's better compression ratio versus ZSTD's faster decompression. The practical impact analysis (25 minutes across ~300 boards) provides valuable context for the build pipeline considerations.


✏️ Learnings added
Learnt from: tabrisnet
URL: https://github.com/armbian/build/pull/8538

Timestamp: 2025-08-30T04:13:16.418Z
Learning: Armbian kernel configuration files like linux-filogic-current.config are autogenerated overlays on top of arch defconfig. Comments added manually will be lost during future updates by maintainers, and explicit "CONFIG_OPTION is not set" statements aren't needed for mutually exclusive options since these are overlay configs that only specify changes from the base configuration.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.


🧠 Learnings used
Learnt from: pyavitz
PR: armbian/build#8421
File: config/kernel/linux-sunxi64-edge.config:805-825
Timestamp: 2025-07-27T15:53:30.629Z
Learning: In the Armbian build system, kernel configurations prioritize broad hardware compatibility over optimization concerns. Even when including numerous legacy/obsolete drivers causes technical issues like increased initramfs size and slower enumeration, the project philosophy is to "appease the masses" by ensuring maximum device compatibility rather than optimizing for specific use cases.

@tabrisnet tabrisnet force-pushed the tabrisnet_bpir4_koxz branch 2 times, most recently from 5d8611c to 651891e Compare September 2, 2025 15:58
@tabrisnet tabrisnet force-pushed the tabrisnet_bpir4_koxz branch 2 times, most recently from fe4933e to d3252fa Compare September 13, 2025 12:16
@tabrisnet tabrisnet force-pushed the tabrisnet_bpir4_koxz branch 2 times, most recently from c480b66 to 00a1127 Compare September 21, 2025 15:30
@tabrisnet tabrisnet added the Work in progress Unfinished / work in progress label Sep 21, 2025
@tabrisnet tabrisnet marked this pull request as ready for review September 28, 2025 11:20
@tabrisnet tabrisnet removed the Work in progress Unfinished / work in progress label Sep 28, 2025
@coderabbitai coderabbitai bot requested a review from rpardini September 28, 2025 11:20
@github-actions github-actions bot added the Ready to merge Reviewed, tested and ready for merge label Sep 29, 2025
Copy link
Contributor

✅ This PR has been reviewed and approved — all set for merge!

@github-actions github-actions bot removed the Needs review Seeking for review label Sep 29, 2025
@igorpecovnik igorpecovnik merged commit 5ae68e7 into armbian:main Sep 30, 2025
10 checks passed
@tabrisnet tabrisnet deleted the tabrisnet_bpir4_koxz branch September 30, 2025 14:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
08 Milestone: Third quarter release Hardware Hardware related like kernel, U-Boot, ... Ready to merge Reviewed, tested and ready for merge size/small PR with less then 50 lines
Development

Successfully merging this pull request may close these issues.

3 participants