diff --git a/config.yaml b/config.yaml index 1b9e687..e173998 100644 --- a/config.yaml +++ b/config.yaml @@ -21,6 +21,12 @@ actions: - type: "patch" name: "0007-Bring-back-deprecated-pci-ids-to-be2iscsi-driver.patch" number: 2007 + - type: "patch" + name: "0001-Make-KVM-PMU-symbols-global-for-ppc64le-module-build.patch" + number: 2008 + - type: "patch" + name: "0001-proc-fix-a-dentry-lock-race-between-release_task-and-lookup.patch" + number: 2009 - type: "source" name: "almalinuxdup1.x509" number: 100 @@ -35,7 +41,7 @@ actions: number: 103 - type: "source" name: "almalinuxnvidia1.x509" - number: 106 + number: 108 - type: "patch" name: "ppc64le-kvm-support.patch" number: "Latest" @@ -103,12 +109,12 @@ actions: count: 1 - target: "spec" find: | - openssl x509 -inform der -in %{SOURCE105} -out nvidiagpuoot001.pem - cat rheldup3.pem rhelkpatch1.pem rhelimaca1.pem nvidiagpuoot001.pem > ../certs/rhel.pem + openssl x509 -inform der -in %{SOURCE107} -out nvidiabfdpu.pem + cat rheldup3.pem rhelkpatch1.pem rhelimaca1.pem nvidiagpuoot001.pem nvidiajetsonsoc.pem nvidiabfdpu.pem > ../certs/rhel.pem replace: | - openssl x509 -inform der -in %{SOURCE105} -out nvidiagpuoot001.pem - openssl x509 -inform der -in %{SOURCE106} -out almalinuxnvidia.pem - cat rheldup3.pem rhelkpatch1.pem rhelimaca1.pem nvidiagpuoot001.pem almalinuxnvidia.pem > ../certs/rhel.pem + openssl x509 -inform der -in %{SOURCE107} -out nvidiabfdpu.pem + openssl x509 -inform der -in %{SOURCE108} -out almalinuxnvidia.pem + cat rheldup3.pem rhelkpatch1.pem rhelimaca1.pem nvidiagpuoot001.pem nvidiajetsonsoc.pem nvidiabfdpu.pem almalinuxnvidia.pem > ../certs/rhel.pem count: 1 - target: "spec" find: "Summary: Various documentation bits found in the kernel source" @@ -157,29 +163,35 @@ actions: replace: " sed -i 's/CONFIG_CRYPTO_FIPS_NAME=.*/CONFIG_CRYPTO_FIPS_NAME=\"AlmaLinux %{rhel} - Kernel Cryptographic API\"/' $i" count: 1 - target: "spec" - find: "SBATsuffix=\"centos\"" - replace: "SBATsuffix=\"rhel\"" + find: "%global sbat_suffix centos" + replace: "%global sbat_suffix rhel" count: 1 - target: "spec" find: | linux,1,Red Hat,linux,$KernelVer,mailto:secalert@redhat.com - linux.$SBATsuffix,1,Red Hat,linux,$KernelVer,mailto:secalert@redhat.com - kernel-uki-virt.$SBATsuffix,1,Red Hat,kernel-uki-virt,$KernelVer,mailto:secalert@redhat.com + linux.%{sbat_suffix},1,Red Hat,linux,$KernelVer,mailto:secalert@redhat.com + kernel-uki-virt.%{sbat_suffix},1,Red Hat,kernel-uki-virt,$KernelVer,mailto:secalert@redhat.com replace: | linux,1,Red Hat,linux,$KernelVer,mailto:secalert@redhat.com linux,1,AlmaLinux,linux,$KernelVer,mailto:security@almalinux.org - linux.$SBATsuffix,1,Red Hat,linux,$KernelVer,mailto:secalert@redhat.com + linux.%{sbat_suffix},1,Red Hat,linux,$KernelVer,mailto:secalert@redhat.com linux.almalinux,1,AlmaLinux,linux,$KernelVer,mailto:security@almalinux.org - kernel-uki-virt.$SBATsuffix,1,Red Hat,kernel-uki-virt,$KernelVer,mailto:secalert@redhat.com + kernel-uki-virt.%{sbat_suffix},1,Red Hat,kernel-uki-virt,$KernelVer,mailto:secalert@redhat.com kernel-uki-virt.almalinux,1,AlmaLinux,kernel-uki-virt,$KernelVer,mailto:security@almalinux.org count: 1 + - target: "kernel.sbat.template" + find: "kernel.@SBAT_SUFFIX,1,Red Hat,kernel-core,@KVER,mailto:secalert@redhat.com" + replace: | + kernel.@SBAT_SUFFIX,1,Red Hat,kernel-core,@KVER,mailto:secalert@redhat.com + kernel.almalinux,1,AlmaLinux,kernel-core,@KVER,mailto:security@almalinux.org + count: 1 - target: "spec" find: "UKI_secureboot_name=centossecureboot204" - replace: "UKI_secureboot_name=%{pesign_name_0}" + replace: "UKI_secureboot_name=almalinuxsecureboot0" count: 1 - target: "spec" find: "UKI_secureboot_name=redhatsecureboot504" - replace: "UKI_secureboot_name=%{pesign_name_0}" + replace: "UKI_secureboot_name=almalinuxsecureboot0" count: 1 - target: "spec" find: "UKI_secureboot_cert=%{SOURCE153}" @@ -316,9 +328,9 @@ actions: count: 1 - target: "spec" find: | - %if !%{with_debug} && !%{with_zfcpdump} && !%{with_pae} && !%{with_up} && !%{with_arm64_64k} && !%{with_realtime} + %if !%{with_debug} && !%{with_zfcpdump} && !%{with_pae} && !%{with_up} && !%{with_arm64_64k} && !%{with_realtime} && !%{with_realtime_arm64_64k} replace: | - %if !%{with_debug} && !%{with_zfcpdump} && !%{with_pae} && !%{with_up} && !%{with_arm64_64k} && !%{with_realtime} && !%{with_ppc_kvm} + %if !%{with_debug} && !%{with_zfcpdump} && !%{with_pae} && !%{with_up} && !%{with_arm64_64k} && !%{with_realtime} && !%{with_realtime_arm64_64k} && !%{with_ppc_kvm} count: 1 - target: "spec" find: | @@ -450,6 +462,7 @@ actions: - name: "Andrew Lukoshko" email: "alukoshko@almalinux.org" line: + - "proc: fix a dentry lock race between release_task and lookup" - "hpsa: bring back deprecated PCI ids #CFHack #CFHack2024" - "mptsas: bring back deprecated PCI ids #CFHack #CFHack2024" - "megaraid_sas: bring back deprecated PCI ids #CFHack #CFHack2024" @@ -464,3 +477,4 @@ actions: - "Use AlmaLinux OS secure boot cert" - "Debrand for AlmaLinux OS" - "Add KVM support for ppc64le" + - "KVM: PPC: Book3S HV: Make PMU save/restore symbols global for module builds" diff --git a/files/0001-Make-KVM-PMU-symbols-global-for-ppc64le-module-build.patch b/files/0001-Make-KVM-PMU-symbols-global-for-ppc64le-module-build.patch new file mode 100644 index 0000000..9896d82 --- /dev/null +++ b/files/0001-Make-KVM-PMU-symbols-global-for-ppc64le-module-build.patch @@ -0,0 +1,53 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Eduard Abdullin +Date: Sun, 6 Apr 2026 00:00:00 +0000 +Subject: [PATCH] KVM: PPC: Book3S HV: Make PMU save/restore symbols global for + module builds + +--- + arch/powerpc/kvm/book3s_hv_interrupts.S | 2 +- + arch/powerpc/kvm/book3s_hv_rmhandlers.S | 6 +++--- + 2 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S +--- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S ++++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S +@@ -2788,7 +2788,7 @@ + /* + * Load up guest PMU state. R3 points to the vcpu struct. + */ +-SYM_FUNC_START_LOCAL(kvmhv_load_guest_pmu) ++SYM_FUNC_START(kvmhv_load_guest_pmu) + EXPORT_SYMBOL_GPL(kvmhv_load_guest_pmu) + mr r4, r3 + mflr r0 +@@ -2854,7 +2854,7 @@ + /* + * Reload host PMU state saved in the PACA by kvmhv_save_host_pmu. + */ +-SYM_FUNC_START_LOCAL(kvmhv_load_host_pmu) ++SYM_FUNC_START(kvmhv_load_host_pmu) + EXPORT_SYMBOL_GPL(kvmhv_load_host_pmu) + mflr r0 + lbz r4, PACA_PMCINUSE(r13) /* is the host using the PMU? */ +@@ -2911,7 +2911,7 @@ + * Save guest PMU state into the vcpu struct. + * r3 = vcpu, r4 = full save flag (PMU in use flag set in VPA) + */ +-SYM_FUNC_START_LOCAL(kvmhv_save_guest_pmu) ++SYM_FUNC_START(kvmhv_save_guest_pmu) + EXPORT_SYMBOL_GPL(kvmhv_save_guest_pmu) + mr r9, r3 + mr r8, r4 +diff --git a/arch/powerpc/kvm/book3s_hv_interrupts.S b/arch/powerpc/kvm/book3s_hv_interrupts.S +--- a/arch/powerpc/kvm/book3s_hv_interrupts.S ++++ b/arch/powerpc/kvm/book3s_hv_interrupts.S +@@ -105,7 +105,7 @@ + mtlr r0 + blr + +-SYM_FUNC_START_LOCAL(kvmhv_save_host_pmu) ++SYM_FUNC_START(kvmhv_save_host_pmu) + BEGIN_FTR_SECTION + /* Work around P8 PMAE bug */ + li r3, -1 diff --git a/files/0001-proc-fix-a-dentry-lock-race-between-release_task-and-lookup.patch b/files/0001-proc-fix-a-dentry-lock-race-between-release_task-and-lookup.patch new file mode 100644 index 0000000..231334b --- /dev/null +++ b/files/0001-proc-fix-a-dentry-lock-race-between-release_task-and-lookup.patch @@ -0,0 +1,172 @@ +From 9f855caf390cf2b760c65a60649c88a7d7d60b01 Mon Sep 17 00:00:00 2001 +From: Andrew Lukoshko +Date: Fri, 9 Jan 2026 10:09:48 +0000 +Subject: [PATCH] proc: fix a dentry lock race between release_task and lookup +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +JIRA: https://issues.redhat.com/browse/RHEL-124568 + +commit d919a1e79bac890421537cf02ae773007bf55e6b +Author: Zhihao Cheng +Date: Wed Jul 13 21:00:29 2022 +0800 + + proc: fix a dentry lock race between release_task and lookup + + Commit 7bc3e6e55acf06 ("proc: Use a list of inodes to flush from proc") + moved proc_flush_task() behind __exit_signal(). Then, process systemd can + take long period high cpu usage during releasing task in following + concurrent processes: + + systemd ps + kernel_waitid stat(/proc/tgid) + do_wait filename_lookup + wait_consider_task lookup_fast + release_task + __exit_signal + __unhash_process + detach_pid + __change_pid // remove task->pid_links + d_revalidate -> pid_revalidate // 0 + d_invalidate(/proc/tgid) + shrink_dcache_parent(/proc/tgid) + d_walk(/proc/tgid) + spin_lock_nested(/proc/tgid/fd) + // iterating opened fd + proc_flush_pid | + d_invalidate (/proc/tgid/fd) | + shrink_dcache_parent(/proc/tgid/fd) | + shrink_dentry_list(subdirs) ↓ + shrink_lock_dentry(/proc/tgid/fd) --> race on dentry lock + + Function d_invalidate() will remove dentry from hash firstly, but why does + proc_flush_pid() process dentry '/proc/tgid/fd' before dentry + '/proc/tgid'? That's because proc_pid_make_inode() adds proc inode in + reverse order by invoking hlist_add_head_rcu(). But proc should not add + any inodes under '/proc/tgid' except '/proc/tgid/task/pid', fix it by + adding inode into 'pid->inodes' only if the inode is /proc/tgid or + /proc/tgid/task/pid. + + Performance regression: + Create 200 tasks, each task open one file for 50,000 times. Kill all + tasks when opened files exceed 10,000,000 (cat /proc/sys/fs/file-nr). + + Before fix: + $ time killall -wq aa + real 4m40.946s # During this period, we can see 'ps' and 'systemd' + taking high cpu usage. + + After fix: + $ time killall -wq aa + real 1m20.732s # During this period, we can see 'systemd' taking + high cpu usage. + + Link: https://lkml.kernel.org/r/20220713130029.4133533-1-chengzhihao1@huawei.com + Fixes: 7bc3e6e55acf06 ("proc: Use a list of inodes to flush from proc") + Link: https://bugzilla.kernel.org/show_bug.cgi?id=216054 + Signed-off-by: Zhihao Cheng + Signed-off-by: Zhang Yi + Suggested-by: Brian Foster + Reviewed-by: Brian Foster + Cc: Al Viro + Cc: Alexey Dobriyan + Cc: Eric Biederman + Cc: Matthew Wilcox + Cc: Baoquan He + Cc: Kalesh Singh + Cc: Yu Kuai + Signed-off-by: Andrew Morton + +Signed-off-by: Andrew Lukoshko +--- + fs/proc/base.c | 46 ++++++++++++++++++++++++++++++++++++++-------- + 1 file changed, 38 insertions(+), 8 deletions(-) + +diff --git a/fs/proc/base.c b/fs/proc/base.c +index dbb251465954..67d1afedaa47 100644 +--- a/fs/proc/base.c ++++ b/fs/proc/base.c +@@ -1887,7 +1887,7 @@ void proc_pid_evict_inode(struct proc_inode *ei) + put_pid(pid); + } + +-struct inode *proc_pid_make_inode(struct super_block * sb, ++struct inode *proc_pid_make_inode(struct super_block *sb, + struct task_struct *task, umode_t mode) + { + struct inode * inode; +@@ -1916,11 +1916,6 @@ struct inode *proc_pid_make_inode(struct super_block * sb, + + /* Let the pid remember us for quick removal */ + ei->pid = pid; +- if (S_ISDIR(mode)) { +- spin_lock(&pid->lock); +- hlist_add_head_rcu(&ei->sibling_inodes, &pid->inodes); +- spin_unlock(&pid->lock); +- } + + task_dump_owner(task, 0, &inode->i_uid, &inode->i_gid); + security_task_to_inode(task, inode); +@@ -1933,6 +1928,39 @@ struct inode *proc_pid_make_inode(struct super_block * sb, + return NULL; + } + ++/* ++ * Generating an inode and adding it into @pid->inodes, so that task will ++ * invalidate inode's dentry before being released. ++ * ++ * This helper is used for creating dir-type entries under '/proc' and ++ * '/proc//task'. Other entries(eg. fd, stat) under '/proc/' ++ * can be released by invalidating '/proc/' dentry. ++ * In theory, dentries under '/proc//task' can also be released by ++ * invalidating '/proc/' dentry, we reserve it to handle single ++ * thread exiting situation: Any one of threads should invalidate its ++ * '/proc//task/' dentry before released. ++ */ ++static struct inode *proc_pid_make_base_inode(struct super_block *sb, ++ struct task_struct *task, umode_t mode) ++{ ++ struct inode *inode; ++ struct proc_inode *ei; ++ struct pid *pid; ++ ++ inode = proc_pid_make_inode(sb, task, mode); ++ if (!inode) ++ return NULL; ++ ++ /* Let proc_flush_pid find this directory inode */ ++ ei = PROC_I(inode); ++ pid = ei->pid; ++ spin_lock(&pid->lock); ++ hlist_add_head_rcu(&ei->sibling_inodes, &pid->inodes); ++ spin_unlock(&pid->lock); ++ ++ return inode; ++} ++ + int pid_getattr(struct mnt_idmap *idmap, const struct path *path, + struct kstat *stat, u32 request_mask, unsigned int query_flags) + { +@@ -3401,7 +3429,8 @@ static struct dentry *proc_pid_instantiate(struct dentry * dentry, + { + struct inode *inode; + +- inode = proc_pid_make_inode(dentry->d_sb, task, S_IFDIR | S_IRUGO | S_IXUGO); ++ inode = proc_pid_make_base_inode(dentry->d_sb, task, ++ S_IFDIR | S_IRUGO | S_IXUGO); + if (!inode) + return ERR_PTR(-ENOENT); + +@@ -3705,7 +3734,8 @@ static struct dentry *proc_task_instantiate(struct dentry *dentry, + struct task_struct *task, const void *ptr) + { + struct inode *inode; +- inode = proc_pid_make_inode(dentry->d_sb, task, S_IFDIR | S_IRUGO | S_IXUGO); ++ inode = proc_pid_make_base_inode(dentry->d_sb, task, ++ S_IFDIR | S_IRUGO | S_IXUGO); + if (!inode) + return ERR_PTR(-ENOENT); + +-- +2.43.5