Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
fdb8a1a
s390/pci: Fix stale function handles in error handling
PlaidCat Sep 4, 2025
adfc73e
s390/pci: Do not try re-enabling load/store if device is disabled
PlaidCat Sep 4, 2025
1123e46
drm/vkms: Fix use after free and double free on init error
PlaidCat Sep 4, 2025
6bc15ba
sch_ets: make est_qlen_notify() idempotent
PlaidCat Sep 4, 2025
93fe6a9
net_sched: ets: Fix double list add in class with netem as child qdisc
PlaidCat Sep 4, 2025
0e948c6
Bluetooth: hci_core: Fix use-after-free in vhci_flush()
PlaidCat Sep 4, 2025
8a6878f
i2c/designware: Fix an initialization issue
PlaidCat Sep 4, 2025
69d7f21
gfs2: Fix withdraw race
PlaidCat Sep 4, 2025
8c522e0
gfs2: Get rid of gfs2_glock_queue_put in signal_our_withdraw
PlaidCat Sep 4, 2025
f1f22be
gfs2: No more self recovery
PlaidCat Sep 4, 2025
5bbea70
writeback: fix false warning in inode_to_wb()
PlaidCat Sep 4, 2025
fc3a49f
gfs2: replace sd_aspace with sd_inode
PlaidCat Sep 4, 2025
0d2c5dd
gfs2: Remove unnecessary NULL check before free_percpu()
PlaidCat Sep 4, 2025
8246668
gfs2: Don't clear sb->s_fs_info in gfs2_sys_fs_add
PlaidCat Sep 4, 2025
fd87dfe
i40e: fix MMIO write access to an invalid page in i40e_clear_hw
PlaidCat Sep 4, 2025
d01f8a8
udp: Fix memory accounting leak.
PlaidCat Sep 4, 2025
f1128d1
blk-mq: fix tag_get wait task can't be awakened
PlaidCat Sep 4, 2025
c6b6838
blk-mq: Fix wrong wakeup batch configuration which will cause hang
PlaidCat Sep 4, 2025
907b4b8
sbitmap: Use single per-bitmap counting to wake up queued tags
PlaidCat Sep 4, 2025
3d0fe8c
sbitmap: Advance the queue index before waking up a queue
PlaidCat Sep 4, 2025
59a62f0
sched/wait: Deduplicate code with do-while
PlaidCat Sep 4, 2025
622a985
wait: Return number of exclusive waiters awaken
PlaidCat Sep 4, 2025
236f97d
sbitmap: Try each queue to wake up at least one waiter
PlaidCat Sep 4, 2025
2cec149
sbitmap: add __sbitmap_queue_get_batch()
PlaidCat Sep 4, 2025
279a256
lib/sbitmap: kill 'depth' from sbitmap_word
PlaidCat Sep 4, 2025
a42ee5e
lib/sbitmap: Fix invalid loop in __sbitmap_queue_get_batch()
PlaidCat Sep 4, 2025
2b02c21
sbitmap: remove unnecessary code in __sbitmap_queue_get_batch
PlaidCat Sep 4, 2025
3265cdc
sbitmap: Use atomic_long_try_cmpxchg in __sbitmap_queue_get_batch
PlaidCat Sep 4, 2025
6a76dfd
sbitmap: remove unnecessary calculation of alloc_hint in __sbitmap_ge…
PlaidCat Sep 4, 2025
f3b461b
sbitmap: remove redundant check in __sbitmap_queue_get_batch
PlaidCat Sep 4, 2025
cadcdd7
sbitmap: rewrite sbitmap_find_bit_in_index to reduce repeat code
PlaidCat Sep 4, 2025
846661b
sbitmap: add sbitmap_find_bit to remove repeat code in __sbitmap_get/…
PlaidCat Sep 4, 2025
d7c83dc
sbitmap: correct wake_batch recalculation to avoid potential IO hung
PlaidCat Sep 4, 2025
816620b
sbitmap: fix batching wakeup
PlaidCat Sep 4, 2025
5a7fde5
sbitmap: use READ_ONCE to access map->word
PlaidCat Sep 4, 2025
8eea495
sbitmap: fix io hung due to race on sbitmap_word::cleared
PlaidCat Sep 4, 2025
02f3fa1
lib/sbitmap: define swap_lock as raw_spinlock_t
PlaidCat Sep 4, 2025
91713fb
blk-mq: fix potential io hang by wrong 'wake_batch'
PlaidCat Sep 4, 2025
916bcc5
block: Fix lockdep warning in blk_mq_mark_tag_wait
PlaidCat Sep 4, 2025
d927f7c
sbitmap: remove stale comment in sbq_calc_wake_batch
PlaidCat Sep 4, 2025
b0715e0
tipc: Fix use-after-free in tipc_conn_close().
PlaidCat Sep 4, 2025
0479072
efi/x86: Support builtin command line
PlaidCat Sep 4, 2025
8493040
efi/libstub: Check return value of efi_parse_options
PlaidCat Sep 4, 2025
aaf3e1d
x86/efistub: Omit physical KASLR when memory reservations exist
PlaidCat Sep 4, 2025
0fda28f
filemap: remove use of wait bookmarks
PlaidCat Sep 4, 2025
838fdc2
net/sched: Abort __tc_modify_qdisc if parent class does not exist
PlaidCat Sep 4, 2025
e5be373
cxgb4: use port number to set mac addr
PlaidCat Sep 4, 2025
74693e7
net/sched: sch_qfq: Fix race condition on qfq_aggregate
PlaidCat Sep 4, 2025
50034aa
net/sched: sch_qfq: Avoid triggering might_sleep in atomic context in…
PlaidCat Sep 4, 2025
13fa887
RDMA/iwcm: Fix a use-after-free related to destroying CM IDs
PlaidCat Sep 4, 2025
bd8aeab
RDMA/iwcm: Fix WARNING:at_kernel/workqueue.c:#check_flush_dependency
PlaidCat Sep 4, 2025
445bada
RDMA/iwcm: Fix use-after-free of work objects after cm_id destruction
PlaidCat Sep 4, 2025
c51bac8
watchdog/perf: properly initialize the turbo mode timestamp and rearm…
PlaidCat Sep 4, 2025
6653155
scsi: lpfc: Use memcpy() for BIOS version
PlaidCat Sep 4, 2025
06a1b8b
Rebuild rocky8_10 with kernel-4.18.0-553.72.1.el8_10
PlaidCat Sep 4, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Makefile.rhelver
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ RHEL_MINOR = 10
#
# Use this spot to avoid future merge conflicts.
# Do not trim this comment.
RHEL_RELEASE = 553.69.1
RHEL_RELEASE = 553.72.1

#
# ZSTREAM
Expand Down
15 changes: 15 additions & 0 deletions arch/s390/pci/pci_event.c
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,10 @@ static pci_ers_result_t zpci_event_do_error_state_clear(struct pci_dev *pdev,
struct zpci_dev *zdev = to_zpci(pdev);
int rc;

/* The underlying device may have been disabled by the event */
if (!zdev_enabled(zdev))
return PCI_ERS_RESULT_NEED_RESET;

pr_info("%s: Unblocking device access for examination\n", pci_name(pdev));
rc = zpci_reset_load_store_blocked(zdev);
if (rc) {
Expand Down Expand Up @@ -253,6 +257,8 @@ static void __zpci_event_error(struct zpci_ccdf_err *ccdf)
struct zpci_dev *zdev = get_zdev_by_fid(ccdf->fid);
struct pci_dev *pdev = NULL;
pci_ers_result_t ers_res;
u32 fh = 0;
int rc;

zpci_dbg(3, "err fid:%x, fh:%x, pec:%x\n",
ccdf->fid, ccdf->fh, ccdf->pec);
Expand All @@ -261,6 +267,15 @@ static void __zpci_event_error(struct zpci_ccdf_err *ccdf)

if (zdev) {
mutex_lock(&zdev->state_lock);
rc = clp_refresh_fh(zdev->fid, &fh);
if (rc)
goto no_pdev;
if (!fh || ccdf->fh != fh) {
/* Ignore events with stale handles */
zpci_dbg(3, "err fid:%x, fh:%x (stale %x)\n",
ccdf->fid, fh, ccdf->fh);
goto no_pdev;
}
zpci_update_fh(zdev, ccdf->fh);
if (zdev->zbus->bus)
pdev = pci_get_slot(zdev->zbus->bus, zdev->devfn);
Expand Down
45 changes: 41 additions & 4 deletions arch/x86/boot/compressed/eboot.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

#include <linux/efi.h>
#include <linux/pci.h>
#include <linux/ctype.h>

#include <asm/efi.h>
#include <asm/e820/types.h>
Expand Down Expand Up @@ -863,6 +864,26 @@ static void error(char *str)
efi_printk(sys_table, "\n");
}

static const char *cmdline_memmap_override;

static efi_status_t parse_options(const char *cmdline)
{
static const char opts[][14] = {
"mem=", "memmap=", "efi_fake_mem=", "hugepages="
};

for (int i = 0; i < ARRAY_SIZE(opts); i++) {
const char *p = strstr(cmdline, opts[i]);

if (p == cmdline || (p > cmdline && isspace(p[-1]))) {
cmdline_memmap_override = opts[i];
break;
}
}

return efi_parse_options(cmdline);
}

static efi_status_t efi_decompress_kernel(unsigned long *kernel_entry)
{
unsigned long virt_addr = LOAD_PHYSICAL_ADDR;
Expand Down Expand Up @@ -893,6 +914,10 @@ static efi_status_t efi_decompress_kernel(unsigned long *kernel_entry)
if (sys_table->hdr.revision <= EFI_2_00_SYSTEM_TABLE_REVISION &&
!memcmp(efistub_fw_vendor(), ami, sizeof(ami))) {
seed[0] = 0;
} else if (cmdline_memmap_override) {
efi_printk(sys_table,
"cmdline memmap override detected on the kernel command line - disabling physical KASLR\n");
seed[0] = 0;
}

boot_params_ptr->hdr.loadflags |= KASLR_FLAG;
Expand Down Expand Up @@ -942,7 +967,6 @@ void __noreturn efi_main(struct efi_config *c,
void *handle;
efi_system_table_t *_table;
bool is64;
unsigned long cmdline_paddr;
extern char _bss[], _ebss[];

/*
Expand Down Expand Up @@ -997,9 +1021,22 @@ void __noreturn efi_main(struct efi_config *c,
* case this is the second time we parse the cmdline. This is ok,
* parsing the cmdline multiple times does not have side-effects.
*/
cmdline_paddr = ((u64)hdr->cmd_line_ptr |
((u64)boot_params->ext_cmd_line_ptr << 32));
efi_parse_options((char *)cmdline_paddr);
#ifdef CONFIG_CMDLINE_BOOL
status = parse_options(CONFIG_CMDLINE);
if (status != EFI_SUCCESS) {
efi_printk(sys_table, "Failed to parse options\n");
goto fail;
}
#endif
if (!IS_ENABLED(CONFIG_CMDLINE_OVERRIDE)) {
unsigned long cmdline_paddr = ((u64)hdr->cmd_line_ptr |
((u64)boot_params->ext_cmd_line_ptr << 32));
status = parse_options((char *)cmdline_paddr);
if (status != EFI_SUCCESS) {
efi_printk(sys_table, "Failed to parse options\n");
goto fail;
}
}

status = efi_decompress_kernel(&kernel_entry);
if (status != EFI_SUCCESS) {
Expand Down
2 changes: 1 addition & 1 deletion block/blk-mq-debugfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -461,7 +461,7 @@ static void blk_mq_debugfs_tags_show(struct seq_file *m,
seq_printf(m, "nr_tags=%u\n", tags->nr_tags);
seq_printf(m, "nr_reserved_tags=%u\n", tags->nr_reserved_tags);
seq_printf(m, "active_queues=%d\n",
atomic_read(&tags->active_queues));
READ_ONCE(tags->active_queues));

seq_puts(m, "\nbitmap_tags:\n");
sbitmap_queue_show(tags->bitmap_tags, m);
Expand Down
56 changes: 48 additions & 8 deletions block/blk-mq-tag.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,21 @@
#include "blk-mq-sched.h"
#include "blk-mq-tag.h"

/*
* Recalculate wakeup batch when tag is shared by hctx.
*/
static void blk_mq_update_wake_batch(struct blk_mq_tags *tags,
unsigned int users)
{
if (!users)
return;

sbitmap_queue_recalculate_wake_batch(tags->bitmap_tags,
users);
sbitmap_queue_recalculate_wake_batch(tags->breserved_tags,
users);
}

/*
* If a previously inactive queue goes active, bump the active user count.
* We need to do this before try to allocate driver tag, then even if fail
Expand All @@ -23,17 +38,33 @@
*/
bool __blk_mq_tag_busy(struct blk_mq_hw_ctx *hctx)
{
unsigned int users;
unsigned long flags;
struct blk_mq_tags *tags = hctx->tags;

if (blk_mq_is_sbitmap_shared(hctx->flags)) {
struct request_queue *q = hctx->queue;
struct blk_mq_tag_set *set = q->tag_set;

if (!test_bit(QUEUE_FLAG_HCTX_ACTIVE, &q->queue_flags) &&
!test_and_set_bit(QUEUE_FLAG_HCTX_ACTIVE, &q->queue_flags))
atomic_inc(&set->active_queues_shared_sbitmap);
if (test_bit(QUEUE_FLAG_HCTX_ACTIVE, &q->queue_flags) ||
test_and_set_bit(QUEUE_FLAG_HCTX_ACTIVE, &q->queue_flags)) {
return true;
}
spin_lock_irqsave(&set->active_queues_lock, flags);
users = set->active_queues_shared_sbitmap + 1;
WRITE_ONCE(set->active_queues_shared_sbitmap, users);
blk_mq_update_wake_batch(hctx->tags, users);
spin_unlock_irqrestore(&set->active_queues_lock, flags);
} else {
if (!test_bit(BLK_MQ_S_TAG_ACTIVE, &hctx->state) &&
!test_and_set_bit(BLK_MQ_S_TAG_ACTIVE, &hctx->state))
atomic_inc(&hctx->tags->active_queues);
if (test_bit(BLK_MQ_S_TAG_ACTIVE, &hctx->state) ||
test_and_set_bit(BLK_MQ_S_TAG_ACTIVE, &hctx->state)) {
return true;
}
spin_lock_irqsave(&tags->lock, flags);
users = hctx->tags->active_queues + 1;
WRITE_ONCE(tags->active_queues, users);
blk_mq_update_wake_batch(tags, users);
spin_unlock_irqrestore(&tags->lock, flags);
}

return true;
Expand All @@ -58,16 +89,25 @@ void __blk_mq_tag_idle(struct blk_mq_hw_ctx *hctx)
struct blk_mq_tags *tags = hctx->tags;
struct request_queue *q = hctx->queue;
struct blk_mq_tag_set *set = q->tag_set;
unsigned int users;

if (blk_mq_is_sbitmap_shared(hctx->flags)) {
if (!test_and_clear_bit(QUEUE_FLAG_HCTX_ACTIVE,
&q->queue_flags))
return;
atomic_dec(&set->active_queues_shared_sbitmap);
spin_lock_irq(&set->active_queues_lock);
users = set->active_queues_shared_sbitmap - 1;
WRITE_ONCE(set->active_queues_shared_sbitmap, users);
blk_mq_update_wake_batch(tags, users);
spin_unlock_irq(&set->active_queues_lock);
} else {
if (!test_and_clear_bit(BLK_MQ_S_TAG_ACTIVE, &hctx->state))
return;
atomic_dec(&tags->active_queues);
spin_lock_irq(&tags->lock);
users = tags->active_queues - 1;
WRITE_ONCE(tags->active_queues, users);
blk_mq_update_wake_batch(tags, users);
spin_unlock_irq(&tags->lock);
}

blk_mq_tag_wakeup_all(tags, false);
Expand Down
4 changes: 4 additions & 0 deletions block/blk-mq-tag.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,11 @@ struct blk_mq_tags {
unsigned int nr_tags;
unsigned int nr_reserved_tags;

#ifdef __GENKSYMS__
atomic_t active_queues;
#else
unsigned int active_queues;
#endif

struct sbitmap_queue RH_KABI_RENAME(bitmap_tags, __bitmap_tags);
struct sbitmap_queue RH_KABI_RENAME(breserved_tags, __breserved_tags);
Expand Down
3 changes: 1 addition & 2 deletions block/blk-mq.c
Original file line number Diff line number Diff line change
Expand Up @@ -3666,8 +3666,6 @@ int blk_mq_alloc_tag_set(struct blk_mq_tag_set *set)
goto out_free_mq_map;

if (blk_mq_is_sbitmap_shared(set->flags)) {
atomic_set(&set->active_queues_shared_sbitmap, 0);

if (blk_mq_init_shared_sbitmap(set)) {
ret = -ENOMEM;
goto out_free_mq_rq_maps;
Expand All @@ -3676,6 +3674,7 @@ int blk_mq_alloc_tag_set(struct blk_mq_tag_set *set)

mutex_init(&set->tag_list_lock);
INIT_LIST_HEAD(&set->tag_list);
spin_lock_init(&set->active_queues_lock);

return 0;

Expand Down
4 changes: 2 additions & 2 deletions block/blk-mq.h
Original file line number Diff line number Diff line change
Expand Up @@ -343,11 +343,11 @@ static inline bool hctx_may_queue(struct blk_mq_hw_ctx *hctx,

if (!test_bit(QUEUE_FLAG_HCTX_ACTIVE, &q->queue_flags))
return true;
users = atomic_read(&set->active_queues_shared_sbitmap);
users = READ_ONCE(set->active_queues_shared_sbitmap);
} else {
if (!test_bit(BLK_MQ_S_TAG_ACTIVE, &hctx->state))
return true;
users = atomic_read(&hctx->tags->active_queues);
users = READ_ONCE(hctx->tags->active_queues);
}

if (!users)
Expand Down
Loading