5.4.149-rc1 review
Subsystems (2)
Greg Kroah-Hartman
maintainerPATCH 1/50 PCI: pci-bridge-emul: Fix big-endian support
In reply to Greg Kroah-HartmanFrom: Grzegorz Jaszczyk <[email protected]>
commit e0d9d30b73548fbfe5c024ed630169bdc9a08aee upstream.
Perform conversion to little-endian before every write to configuration space and convert it back to CPU endianness on reads.
Additionally, initialise every multiple byte field of config space with the cpu_to_le* macro, which is required since the structure describing config space of emulated bridge assumes little-endian convention.
--- drivers/pci/pci-bridge-emul.c | 25 +++++++------ drivers/pci/pci-bridge-emul.h | 78 +++++++++++++++++++++--------------------- 2 files changed, 52 insertions(+), 51 deletions(-)
drivers/pci/pci-bridge-emul.c +13 -12
@@ -270,10 +270,10 @@ static const struct pci_bridge_reg_behavint pci_bridge_emul_init (struct pci_bridge_emul *bridge,unsigned int flags) { - bridge->conf.class_revision |=PCI_CLASS_BRIDGE_PCI <<16 ; + bridge->conf.class_revision |=cpu_to_le32 (PCI_CLASS_BRIDGE_PCI <<16 ); bridge->conf.header_type =PCI_HEADER_TYPE_BRIDGE ; bridge->conf.cache_line_size =0x10 ; - bridge->conf.status =PCI_STATUS_CAP_LIST ; + bridge->conf.status =cpu_to_le16 (PCI_STATUS_CAP_LIST ); bridge->pci_regs_behavior =kmemdup (pci_regs_behavior,sizeof (pci_regs_behavior),GFP_KERNEL );
@@ -284,8 +284,9 @@ int pci_bridge_emul_init(struct pci_brid bridge->conf.capabilities_pointer =PCI_CAP_PCIE_START ; bridge->pcie_conf.cap_id =PCI_CAP_ID_EXP ;/* Set PCIe v2, root port, slot support */ - bridge->pcie_conf.cap =PCI_EXP_TYPE_ROOT_PORT <<4 |2 | -PCI_EXP_FLAGS_SLOT ; + bridge->pcie_conf.cap = +cpu_to_le16 (PCI_EXP_TYPE_ROOT_PORT <<4 |2 | +PCI_EXP_FLAGS_SLOT ); bridge->pcie_cap_regs_behavior = kmemdup(pcie_cap_regs_behavior, sizeof(pcie_cap_regs_behavior),
@@ -327,7 +328,7 @@ int pci_bridge_emul_conf_read(struct pciint reg = where & ~3 ;pci_bridge_emul_read_status_t (*read_op)(struct pci_bridge_emul *bridge,int reg,u32 *value); -u32 *cfgspace; +__le32 *cfgspace;const struct pci_bridge_reg_behavior *behavior;if (bridge->has_pcie && reg >=PCI_CAP_PCIE_END ) {
@@ -343,11 +344,11 @@ int pci_bridge_emul_conf_read(struct pciif (bridge->has_pcie && reg >=PCI_CAP_PCIE_START ) { reg -=PCI_CAP_PCIE_START ; read_op = bridge->ops->read_pcie; - cfgspace = (u32 *) &bridge->pcie_conf; + cfgspace = (__le32 *) &bridge->pcie_conf; behavior = bridge->pcie_cap_regs_behavior; }else { read_op = bridge->ops->read_base; - cfgspace = (u32 *) &bridge->conf; + cfgspace = (__le32 *) &bridge->conf; behavior = bridge->pci_regs_behavior; }
@@ -357,7 +358,7 @@ int pci_bridge_emul_conf_read(struct pci ret =PCI_BRIDGE_EMUL_NOT_HANDLED ;if (ret ==PCI_BRIDGE_EMUL_NOT_HANDLED ) - *value = cfgspace[reg /4 ]; + *value =le32_to_cpu (cfgspace[reg /4 ]);/* * Make sure we never return any reserved bit with a value
@@ -387,7 +388,7 @@ int pci_bridge_emul_conf_write(struct pcint mask, ret, old, new, shift;void (*write_op)(struct pci_bridge_emul *bridge,int reg,u32 old,u32 new,u32 mask); -u32 *cfgspace; +__le32 *cfgspace;const struct pci_bridge_reg_behavior *behavior;if (bridge->has_pcie && reg >=PCI_CAP_PCIE_END )
@@ -414,11 +415,11 @@ int pci_bridge_emul_conf_write(struct pcif (bridge->has_pcie && reg >=PCI_CAP_PCIE_START ) { reg -=PCI_CAP_PCIE_START ; write_op = bridge->ops->write_pcie; - cfgspace = (u32 *) &bridge->pcie_conf; + cfgspace = (__le32 *) &bridge->pcie_conf; behavior = bridge->pcie_cap_regs_behavior; }else { write_op = bridge->ops->write_base; - cfgspace = (u32 *) &bridge->conf; + cfgspace = (__le32 *) &bridge->conf; behavior = bridge->pci_regs_behavior; }
@@ -431,7 +432,7 @@ int pci_bridge_emul_conf_write(struct pc/* Clear the W1C bits */ new &= ~((value << shift) & (behavior[reg /4 ].w1c & mask)); - cfgspace[reg /4 ] = new; + cfgspace[reg /4 ] =cpu_to_le32 (new);if (write_op)write_op (bridge, reg, old, new, mask);
drivers/pci/pci-bridge-emul.h +39 -39
104 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 10/50 apparmor: remove duplicate macro list_entry_is_head()
In reply to Greg Kroah-HartmanFrom: Andy Shevchenko <[email protected]>
commit 9801ca279ad37f72f71234fa81722afd95a3f997 upstream.
Strangely I hadn't had noticed the existence of the list_entry_is_head() in apparmor code when added the same one in the list.h. Luckily it's fully identical and didn't break builds. In any case we don't need a duplicate anymore, thus remove it from apparmor code.
--- security/apparmor/apparmorfs.c | 3 --- 1 file changed, 3 deletions(-)
security/apparmor/apparmorfs.c +0 -3
@@ -1960,9 +1960,6 @@ fail2:return error; } - -#define list_entry_is_head (pos, head, member) (&pos->member == (head)) -/** * __next_ns - find the next namespace to list * @root: root namespace to stop search at (NOT NULL)
Greg Kroah-Hartman
maintainerPATCH 11/50 ARM: 9077/1: PLT: Move struct plt_entries definition to header
In reply to Greg Kroah-HartmanFrom: Alex Sverdlin <[email protected]>
commit 4e271701c17dee70c6e1351c4d7d42e70405c6a9 upstream
No functional change, later it will be re-used in several files.
--- arch/arm/include/asm/module.h | 9 +++++++++ arch/arm/kernel/module-plts.c | 9 --------- 2 files changed, 9 insertions(+), 9 deletions(-)
arch/arm/include/asm/module.h +9 -0
@@ -19,6 +19,15 @@ enum { };#endif +#define PLT_ENT_STRIDE L1_CACHE_BYTES +#define PLT_ENT_COUNT (PLT_ENT_STRIDE / sizeof(u32)) +#define PLT_ENT_SIZE (sizeof(struct plt_entries) / PLT_ENT_COUNT) + +struct plt_entries { +u32 ldr[PLT_ENT_COUNT ]; +u32 lit[PLT_ENT_COUNT ]; +}; +struct mod_plt_sec {struct elf32_shdr *plt;int plt_count;
arch/arm/kernel/module-plts.c +0 -9
@@ -11,10 +11,6 @@#include <asm/cache.h> #include <asm/opcodes.h> -#define PLT_ENT_STRIDE L1_CACHE_BYTES -#define PLT_ENT_COUNT (PLT_ENT_STRIDE / sizeof(u32)) -#define PLT_ENT_SIZE (sizeof(struct plt_entries) / PLT_ENT_COUNT) -#ifdef CONFIG_THUMB2_KERNEL #define PLT_ENT_LDR __opcode_to_mem_thumb32(0xf8dff000 | \ (PLT_ENT_STRIDE - 4))
@@ -23,11 +19,6 @@ (PLT_ENT_STRIDE - 8))#endif -struct plt_entries { -u32 ldr[PLT_ENT_COUNT ]; -u32 lit[PLT_ENT_COUNT ]; -}; -static bool in_init (const struct module *mod,unsigned long loc) {return loc - (u32 )mod->init_layout.base < mod->init_layout.size;
Greg Kroah-Hartman
maintainerPATCH 12/50 ARM: 9078/1: Add warn suppress parameter to arm_gen_branch_link()
In reply to Greg Kroah-HartmanFrom: Alex Sverdlin <[email protected]>
commit 890cb057a46d323fd8c77ebecb6485476614cd21 upstream
Will be used in the following patch. No functional change.
--- arch/arm/include/asm/insn.h | 8 ++++---- arch/arm/kernel/ftrace.c | 2 +- arch/arm/kernel/insn.c | 19 ++++++++++--------- 3 files changed, 15 insertions(+), 14 deletions(-)
arch/arm/include/asm/insn.h +4 -4
@@ -13,18 +13,18 @@ arm_gen_nop(void) }unsigned long -__arm_gen_branch (unsigned long pc,unsigned long addr,bool link); +__arm_gen_branch (unsigned long pc,unsigned long addr,bool link,bool warn);static inline unsigned long arm_gen_branch (unsigned long pc,unsigned long addr) { -return __arm_gen_branch (pc, addr, false); +return __arm_gen_branch (pc, addr, false, true); }static inline unsigned long -arm_gen_branch_link (unsigned long pc,unsigned long addr) +arm_gen_branch_link (unsigned long pc,unsigned long addr,bool warn) { -return __arm_gen_branch (pc, addr, true); +return __arm_gen_branch (pc, addr, true, warn); }#endif
arch/arm/kernel/ftrace.c +1 -1
@@ -73,7 +73,7 @@ int ftrace_arch_code_modify_post_processstatic unsigned long ftrace_call_replace (unsigned long pc,unsigned long addr) { -return arm_gen_branch_link (pc, addr); +return arm_gen_branch_link (pc, addr, true); } static int ftrace_modify_code(unsigned long pc, unsigned long old,
arch/arm/kernel/insn.c +10 -9
@@ -3,8 +3,9 @@#include <linux/kernel.h> #include <asm/opcodes.h> -static unsigned long -__arm_gen_branch_thumb2 (unsigned long pc,unsigned long addr,bool link) +static unsigned long __arm_gen_branch_thumb2 (unsigned long pc, +unsigned long addr,bool link, +bool warn) {unsigned long s, j1, j2, i1, i2, imm10, imm11;unsigned long first, second;
@@ -12,7 +13,7 @@ __arm_gen_branch_thumb2(unsigned long pc offset = (long )addr - (long )(pc +4 );if (offset <-16777216 || offset >16777214 ) { -WARN_ON_ONCE (1 ); +WARN_ON_ONCE (warn);return 0 ; }
@@ -33,8 +34,8 @@ __arm_gen_branch_thumb2(unsigned long pcreturn __opcode_thumb32_compose (first, second); } -static unsigned long -__arm_gen_branch_arm (unsigned long pc,unsigned long addr,bool link) +static unsigned long __arm_gen_branch_arm (unsigned long pc,unsigned long addr, +bool link,bool warn) {unsigned long opcode =0xea000000 ;long offset;
@@ -44,7 +45,7 @@ __arm_gen_branch_arm(unsigned long pc, u offset = (long )addr - (long )(pc +8 );if (unlikely (offset <-33554432 || offset >33554428 )) { -WARN_ON_ONCE (1 ); +WARN_ON_ONCE (warn);return 0 ; }
@@ -54,10 +55,10 @@ __arm_gen_branch_arm(unsigned long pc, u }unsigned long -__arm_gen_branch (unsigned long pc,unsigned long addr,bool link) +__arm_gen_branch (unsigned long pc,unsigned long addr,bool link,bool warn) {if (IS_ENABLED (CONFIG_THUMB2_KERNEL )) -return __arm_gen_branch_thumb2 (pc, addr, link); +return __arm_gen_branch_thumb2 (pc, addr, link, warn);else -return __arm_gen_branch_arm (pc, addr, link); +return __arm_gen_branch_arm (pc, addr, link, warn); }
Greg Kroah-Hartman
maintainerPATCH 13/50 ARM: 9079/1: ftrace: Add MODULE_PLTS support
In reply to Greg Kroah-HartmanFrom: Alex Sverdlin <[email protected]>
commit 79f32b221b18c15a98507b101ef4beb52444cc6f upstream
Teach ftrace_make_call() and ftrace_make_nop() about PLTs. Teach PLT code about FTRACE and all its callbacks. Otherwise the following might happen:
------------[ cut here ]------------ WARNING: CPU: 14 PID: 2265 at .../arch/arm/kernel/insn.c:14 __arm_gen_branch+0x83/0x8c() ... Hardware name: LSI Axxia AXM55XX [<c0314a49>] (unwind_backtrace) from [<c03115e9>] (show_stack+0x11/0x14) [<c03115e9>] (show_stack) from [<c0519f51>] (dump_stack+0x81/0xa8) [<c0519f51>] (dump_stack) from [<c032185d>] (warn_slowpath_common+0x69/0x90) [<c032185d>] (warn_slowpath_common) from [<c03218f3>] (warn_slowpath_null+0x17/0x1c) [<c03218f3>] (warn_slowpath_null) from [<c03143cf>] (__arm_gen_branch+0x83/0x8c) [<c03143cf>] (__arm_gen_branch) from [<c0314337>] (ftrace_make_nop+0xf/0x24) [<c0314337>] (ftrace_make_nop) from [<c038ebcb>] (ftrace_process_locs+0x27b/0x3e8) [<c038ebcb>] (ftrace_process_locs) from [<c0378d79>] (load_module+0x11e9/0x1a44) [<c0378d79>] (load_module) from [<c037974d>] (SyS_finit_module+0x59/0x84) [<c037974d>] (SyS_finit_module) from [<c030e981>] (ret_fast_syscall+0x1/0x18) ---[ end trace e1b64ced7a89adcc ]--- ------------[ cut here ]------------ WARNING: CPU: 14 PID: 2265 at .../kernel/trace/ftrace.c:1979 ftrace_bug+0x1b1/0x234() ... Hardware name: LSI Axxia AXM55XX [<c0314a49>] (unwind_backtrace) from [<c03115e9>] (show_stack+0x11/0x14) [<c03115e9>] (show_stack) from [<c0519f51>] (dump_stack+0x81/0xa8) [<c0519f51>] (dump_stack) from [<c032185d>] (warn_slowpath_common+0x69/0x90) [<c032185d>] (warn_slowpath_common) from [<c03218f3>] (warn_slowpath_null+0x17/0x1c) [<c03218f3>] (warn_slowpath_null) from [<c038e87d>] (ftrace_bug+0x1b1/0x234) [<c038e87d>] (ftrace_bug) from [<c038ebd5>] (ftrace_process_locs+0x285/0x3e8) [<c038ebd5>] (ftrace_process_locs) from [<c0378d79>] (load_module+0x11e9/0x1a44) [<c0378d79>] (load_module) from [<c037974d>] (SyS_finit_module+0x59/0x84) [<c037974d>] (SyS_finit_module) from [<c030e981>] (ret_fast_syscall+0x1/0x18) ---[ end trace e1b64ced7a89adcd ]---
ftrace failed to modify [<e9ef7006>] 0xe9ef7006
actual: 02:f0:3b:fa
ftrace record flags: 0
(0) expected tramp: c0314265
--- arch/arm/include/asm/ftrace.h | 3 ++ arch/arm/include/asm/module.h | 1 arch/arm/kernel/ftrace.c | 46 ++++++++++++++++++++++++++++++++++-------- arch/arm/kernel/module-plts.c | 44 ++++++++++++++++++++++++++++++++++++---- 4 files changed, 82 insertions(+), 12 deletions(-)
arch/arm/include/asm/ftrace.h +3 -0
@@ -16,6 +16,9 @@ extern void __gnu_mcount_nc(void);#ifdef CONFIG_DYNAMIC_FTRACE struct dyn_arch_ftrace { +#ifdef CONFIG_ARM_MODULE_PLTS +struct module *mod; +#endif };static inline unsigned long ftrace_call_adjust (unsigned long addr)
arch/arm/include/asm/module.h +1 -0
@@ -30,6 +30,7 @@ struct plt_entries {struct mod_plt_sec {struct elf32_shdr *plt; +struct plt_entries *plt_ent;int plt_count; };
arch/arm/kernel/ftrace.c +38 -8
92 lines not on this page · raw message
arch/arm/kernel/module-plts.c +40 -4
85 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 14/50 ARM: 9098/1: ftrace: MODULE_PLT: Fix build problem without DYNAMIC_FTRACE
In reply to Greg Kroah-HartmanFrom: Alex Sverdlin <[email protected]>
commit 6fa630bf473827aee48cbf0efbbdf6f03134e890 upstream
FTRACE_ADDR is only defined when CONFIG_DYNAMIC_FTRACE is defined, the latter is even stronger requirement than CONFIG_FUNCTION_TRACER (which is enough for MCOUNT_ADDR).
--- arch/arm/kernel/module-plts.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/kernel/module-plts.c +1 -1
@@ -21,7 +21,7 @@#endif static const u32 fixed_plts[] = { -#ifdef CONFIG_FUNCTION_TRACER +#ifdef CONFIG_DYNAMIC_FTRACEFTRACE_ADDR ,MCOUNT_ADDR , #endif
Greg Kroah-Hartman
maintainerPATCH 15/50 sctp: validate chunk size in __rcv_asconf_lookup
In reply to Greg Kroah-HartmanFrom: Marcelo Ricardo Leitner <[email protected]>
commit b6ffe7671b24689c09faa5675dd58f93758a97ae upstream.
In one of the fallbacks that SCTP has for identifying an association for an incoming packet, it looks for AddIp chunk (from ASCONF) and take a peek. Thing is, at this stage nothing was validating that the chunk actually had enough content for that, allowing the peek to happen over uninitialized memory.
Similar check already exists in actual asconf handling in sctp_verify_asconf().
--- net/sctp/input.c | 3 +++ 1 file changed, 3 insertions(+)
net/sctp/input.c +3 -0
@@ -1168,6 +1168,9 @@ static struct sctp_association *__sctp_runion sctp_addr_param *param;union sctp_addr paddr; +if (ntohs (ch->length) <sizeof (*asconf) +sizeof (struct sctp_paramhdr )) +return NULL ; +/* Skip over the ADDIP header and find the Address parameter */ param = (union sctp_addr_param *)(asconf +1 );
Greg Kroah-Hartman
maintainerPATCH 16/50 sctp: add param size validation for SCTP_PARAM_SET_PRIMARY
In reply to Greg Kroah-HartmanFrom: Marcelo Ricardo Leitner <[email protected]>
commit ef6c8d6ccf0c1dccdda092ebe8782777cd7803c9 upstream.
When SCTP handles an INIT chunk, it calls for example:sctp_sf_do_5_1B_init
sctp_verify_init
sctp_verify_param
sctp_process_init
sctp_process_param
handling of SCTP_PARAM_SET_PRIMARY
sctp_verify_init() wasn't doing proper size validation and neither the later handling, allowing it to work over the chunk itself, possibly being uninitialized memory.
--- net/sctp/sm_make_chunk.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-)
net/sctp/sm_make_chunk.c +10 -3
@@ -2157,9 +2157,16 @@ static enum sctp_ierror sctp_verify_parabreak ;case SCTP_PARAM_SET_PRIMARY : -if (ep->asconf_enable) -break ; - goto unhandled; +if (!ep->asconf_enable) + goto unhandled; + +if (ntohs (param.p->length) <sizeof (struct sctp_addip_param ) + +sizeof (struct sctp_paramhdr )) { +sctp_process_inv_paramlength (asoc, param.p, + chunk, err_chunk); + retval =SCTP_IERROR_ABORT ; + } +break ;case SCTP_PARAM_HOST_NAME_ADDRESS :/* Tell the peer, we won't support this param. */
Greg Kroah-Hartman
maintainerPATCH 17/50 staging: rtl8192u: Fix bitwise vs logical operator in TranslateRxSignalStuff819xUsb()
In reply to Greg Kroah-HartmanFrom: Nathan Chancellor <[email protected]>
commit 099ec97ac92911abfb102bb5c68ed270fc12e0dd upstream.
clang warns:
drivers/staging/rtl8192u/r8192U_core.c:4268:20: warning: bitwise and of boolean expressions; did you mean logical and? [-Wbool-operation-and]
bpacket_toself = bpacket_match_bssid &
^~~~~~~~~~~~~~~~~~~~~
&&1 warning generated.
Replace the bitwise AND with a logical one to clear up the warning, as that is clearly what was intended.
--- drivers/staging/rtl8192u/r8192U_core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/staging/rtl8192u/r8192U_core.c +1 -1
@@ -4338,7 +4338,7 @@ static void TranslateRxSignalStuff819xUs bpacket_match_bssid = (type !=IEEE80211_FTYPE_CTL ) && (ether_addr_equal (priv->ieee80211->current_network.bssid, (fc &IEEE80211_FCTL_TODS ) ? hdr->addr1 : (fc &IEEE80211_FCTL_FROMDS ) ? hdr->addr2 : hdr->addr3)) && (!pstats->bHwError) && (!pstats->bCRC) && (!pstats->bICV); - bpacket_toself = bpacket_match_bssid & + bpacket_toself = bpacket_match_bssid && (ether_addr_equal (praddr, priv->ieee80211->dev->dev_addr));if (WLAN_FC_GET_FRAMETYPE (fc) ==IEEE80211_STYPE_BEACON )
Greg Kroah-Hartman
maintainerPATCH 18/50 um: virtio_uml: fix memory leak on init failures
In reply to Greg Kroah-HartmanFrom: Johannes Berg <[email protected]>
commit 7ad28e0df7ee9dbcb793bb88dd81d4d22bb9a10e upstream.
If initialization fails, e.g. because the connection failed, we leak the 'vu_dev'. Fix that. Reported by smatch.
--- arch/um/drivers/virtio_uml.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
arch/um/drivers/virtio_uml.c +3 -1
@@ -994,7 +994,7 @@ static int virtio_uml_probe(struct platf rc =os_connect_socket (pdata->socket_path); }while (rc == -EINTR );if (rc <0 ) -return rc; + goto error_free; vu_dev->sock = rc; rc =vhost_user_init (vu_dev);
@@ -1010,6 +1010,8 @@ static int virtio_uml_probe(struct platf error_init:os_close_file (vu_dev->sock); +error_free: +kfree (vu_dev);return rc; }
Greg Kroah-Hartman
maintainerPATCH 19/50 dmaengine: acpi: Avoid comparison GSI with Linux vIRQ
In reply to Greg Kroah-HartmanFrom: Andy Shevchenko <[email protected]>
commit 67db87dc8284070adb15b3c02c1c31d5cf51c5d6 upstream.
Currently the CRST parsing relies on the fact that on most of x86 devices the IRQ mapping is 1:1 with Linux vIRQ. However, it may be not true for some. Fix this by converting GSI to Linux vIRQ before checking it.
--- drivers/dma/acpi-dma.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
drivers/dma/acpi-dma.c +7 -3
@@ -70,10 +70,14 @@ static int acpi_dma_parse_resource_group si = (const struct acpi_csrt_shared_info *)&grp[1 ]; -/* Match device by MMIO and IRQ */ +/* Match device by MMIO */ if (si->mmio_base_low !=lower_32_bits (mem) || - si->mmio_base_high !=upper_32_bits (mem) || - si->gsi_interrupt != irq) + si->mmio_base_high !=upper_32_bits (mem)) +return 0 ; + +/* Match device by Linux vIRQ */ + ret =acpi_register_gsi (NULL , si->gsi_interrupt, si->interrupt_mode, si->interrupt_polarity); +if (ret != irq)return 0 ; dev_dbg(&adev->dev, "matches with %.4s%04X (rev %u)\n",
Greg Kroah-Hartman
maintainerPATCH 2/50 PCI: aardvark: Indicate error in val when config read fails
In reply to Greg Kroah-HartmanFrom: Pali Rohár <[email protected]>
commit b1bd5714472cc72e14409f5659b154c765a76c65 upstream.
Most callers of config read do not check for return value. But most of the ones that do, checks for error indication in 'val' variable.
This patch updates error handling in advk_pcie_rd_conf() function. If PIO transfer fails then 'val' variable is set to 0xffffffff which indicates failture.
--- drivers/pci/controller/pci-aardvark.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/pci/controller/pci-aardvark.c +3 -1
@@ -664,8 +664,10 @@ static int advk_pcie_rd_conf(struct pci_advk_writel (pcie,1 ,PIO_START ); ret =advk_pcie_wait_pio (pcie); -if (ret <0 ) +if (ret <0 ) { + *val =0xffffffff ;return PCIBIOS_SET_FAILED ; + }/* Check PIO status and get the read result */ ret =advk_pcie_check_pio_status (pcie, val);
Greg Kroah-Hartman
maintainerPATCH 20/50 thermal/drivers/exynos: Fix an error code in exynos_tmu_probe()
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
commit 02d438f62c05f0d055ceeedf12a2f8796b258c08 upstream.
This error path return success but it should propagate the negative error code from devm_clk_get().
--- drivers/thermal/samsung/exynos_tmu.c | 1 + 1 file changed, 1 insertion(+)
drivers/thermal/samsung/exynos_tmu.c +1 -0
@@ -1070,6 +1070,7 @@ static int exynos_tmu_probe(struct platf data->sclk =devm_clk_get (&pdev->dev,"tmu_sclk" );if (IS_ERR (data->sclk)) {dev_err (&pdev->dev,"Failed to get sclk\n" ); + ret =PTR_ERR (data->sclk); goto err_clk; }else { ret =clk_prepare_enable (data->sclk);
Greg Kroah-Hartman
maintainerPATCH 21/50 9p/trans_virtio: Remove sysfs file on probe failure
In reply to Greg Kroah-HartmanFrom: Xie Yongji <[email protected]>
commit f997ea3b7afc108eb9761f321b57de2d089c7c48 upstream.
This ensures we don't leak the sysfs file if we failed to allocate chan->vc_wq during probe.
--- net/9p/trans_virtio.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
net/9p/trans_virtio.c +3 -1
@@ -605,7 +605,7 @@ static int p9_virtio_probe(struct virtio chan->vc_wq =kmalloc (sizeof (wait_queue_head_t),GFP_KERNEL );if (!chan->vc_wq) { err = -ENOMEM ; - goto out_free_tag; + goto out_remove_file; }init_waitqueue_head (chan->vc_wq); chan->ring_bufs_avail =1 ;
@@ -623,6 +623,8 @@ static int p9_virtio_probe(struct virtioreturn 0 ; +out_remove_file: +sysfs_remove_file (&vdev->dev.kobj, &dev_attr_mount_tag.attr); out_free_tag:kfree (tag); out_free_vq:
Greg Kroah-Hartman
maintainerPATCH 22/50 prctl: allow to setup brk for et_dyn executables
In reply to Greg Kroah-HartmanFrom: Cyrill Gorcunov <[email protected]>
commit e1fbbd073137a9d63279f6bf363151a938347640 upstream.
Keno Fischer reported that when a binray loaded via ld-linux-x the prctl(PR_SET_MM_MAP) doesn't allow to setup brk value because it lays before mm:end_data.
For example a test program shows
| # ~/t | | start_code 401000 | end_code 401a15 | start_stack 7ffce4577dd0 | start_data 403e10 | end_data 40408c | start_brk b5b000 | sbrk(0) b5b000
and when executed via ld-linux
| # /lib64/ld-linux-x86-64.so.2 ~/t | | start_code 7fc25b0a4000 | end_code 7fc25b0c4524 | start_stack 7fffcc6b2400 | start_data 7fc25b0ce4c0 | end_data 7fc25b0cff98 | start_brk 55555710c000 | sbrk(0) 55555710c000
This of course prevent criu from restoring such programs. Looking into how kernel operates with brk/start_brk inside brk() syscall I don't see any problem if we allow to setup brk/start_brk without checking for end_data. Even if someone pass some weird address here on a purpose then the worst possible result will be an unexpected unmapping of existing vma (own vma, since prctl works with the callers memory) but test for RLIMIT_DATA is still valid and a user won't be able to gain more memory in case of expanding VMAs via new values shipped with prctl call.
--- kernel/sys.c | 7 ------- 1 file changed, 7 deletions(-)
kernel/sys.c +0 -7
@@ -1928,13 +1928,6 @@ static int validate_prctl_map_addr(struc error = -EINVAL ;/* -* @brk should be after @end_data in traditional maps. -*/ -if (prctl_map->start_brk <= prctl_map->end_data || - prctl_map->brk <= prctl_map->end_data) - goto out; - -/* * Neither we should allow to override limits if they set. */ if (check_data_rlimit(rlimit(RLIMIT_DATA), prctl_map->brk,
Greg Kroah-Hartman
maintainerPATCH 23/50 nilfs2: use refcount_dec_and_lock() to fix potential UAF
In reply to Greg Kroah-HartmanFrom: Zhen Lei <[email protected]>
commit 98e2e409e76ef7781d8511f997359e9c504a95c1 upstream.
When the refcount is decreased to 0, the resource reclamation branch is entered. Before CPU0 reaches the race point (1), CPU1 may obtain the spinlock and traverse the rbtree to find 'root', see nilfs_lookup_root().
Although CPU1 will call refcount_inc() to increase the refcount, it is obviously too late. CPU0 will release 'root' directly, CPU1 then accesses 'root' and triggers UAF.
Use refcount_dec_and_lock() to ensure that both the operations of decrease refcount to 0 and link deletion are lock protected eliminates this risk.
CPU0 CPU1 nilfs_put_root(): <-------- (1) spin_lock(&nilfs->ns_cptree_lock); rb_erase(&root->rb_node, &nilfs->ns_cptree); spin_unlock(&nilfs->ns_cptree_lock); kfree(root); <-------- use-after-free
refcount_t: underflow; use-after-free.
WARNING: CPU: 2 PID: 9476 at lib/refcount.c:28 \
refcount_warn_saturate+0x1cf/0x210 lib/refcount.c:28
Modules linked in:
CPU: 2 PID: 9476 Comm: syz-executor.0 Not tainted 5.10.45-rc1+ #3
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), ...
RIP: 0010:refcount_warn_saturate+0x1cf/0x210 lib/refcount.c:28
... ...
Call Trace:
__refcount_sub_and_test include/linux/refcount.h:283 [inline]
__refcount_dec_and_test include/linux/refcount.h:315 [inline]
refcount_dec_and_test include/linux/refcount.h:333 [inline]
nilfs_put_root+0xc1/0xd0 fs/nilfs2/the_nilfs.c:795
nilfs_segctor_destroy fs/nilfs2/segment.c:2749 [inline]
nilfs_detach_log_writer+0x3fa/0x570 fs/nilfs2/segment.c:2812
nilfs_put_super+0x2f/0xf0 fs/nilfs2/super.c:467
generic_shutdown_super+0xcd/0x1f0 fs/super.c:464
kill_block_super+0x4a/0x90 fs/super.c:1446
deactivate_locked_super+0x6a/0xb0 fs/super.c:335
deactivate_super+0x85/0x90 fs/super.c:366
cleanup_mnt+0x277/0x2e0 fs/namespace.c:1118
__cleanup_mnt+0x15/0x20 fs/namespace.c:1125
task_work_run+0x8e/0x110 kernel/task_work.c:151
tracehook_notify_resume include/linux/tracehook.h:188 [inline]
exit_to_user_mode_loop kernel/entry/common.c:164 [inline]
exit_to_user_mode_prepare+0x13c/0x170 kernel/entry/common.c:191
syscall_exit_to_user_mode+0x16/0x30 kernel/entry/common.c:266
do_syscall_64+0x45/0x80 arch/x86/entry/common.c:56
entry_SYSCALL_64_after_hwframe+0x44/0xa9There is no reproduction program, and the above is only theoretical analysis.
--- fs/nilfs2/the_nilfs.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)
fs/nilfs2/the_nilfs.c +4 -5
@@ -797,14 +797,13 @@ nilfs_find_or_create_root(struct the_nilvoid nilfs_put_root (struct nilfs_root *root) { -if (refcount_dec_and_test (&root->count)) { -struct the_nilfs *nilfs = root->nilfs; +struct the_nilfs *nilfs = root->nilfs; -nilfs_sysfs_delete_snapshot_group (root); - -spin_lock (&nilfs->ns_cptree_lock); +if (refcount_dec_and_lock (&root->count, &nilfs->ns_cptree_lock)) {rb_erase (&root->rb_node, &nilfs->ns_cptree);spin_unlock (&nilfs->ns_cptree_lock); + +nilfs_sysfs_delete_snapshot_group (root);iput (root->ifile);kfree (root);
Greg Kroah-Hartman
maintainerPATCH 25/50 pwm: lpc32xx: Dont modify HW state in .probe() after the PWM chip was registered
In reply to Greg Kroah-HartmanFrom: Uwe Kleine-König <[email protected]>
commit 3d2813fb17e5fd0d73c1d1442ca0192bde4af10e upstream.
This fixes a race condition: After pwmchip_add() is called there might already be a consumer and then modifying the hardware behind the consumer's back is bad. So set the default before.
(Side-note: I don't know what this register setting actually does, if this modifies the polarity there is an inconsistency because the inversed polarity isn't considered if the PWM is already running during .probe().)
--- drivers/pwm/pwm-lpc32xx.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/pwm/pwm-lpc32xx.c +5 -5
@@ -120,17 +120,17 @@ static int lpc32xx_pwm_probe(struct plat lpc32xx->chip.npwm =1 ; lpc32xx->chip.base =-1 ; +/* If PWM is disabled, configure the output to the default value */ + val =readl (lpc32xx->base + (lpc32xx->chip.pwms[0 ].hwpwm <<2 )); + val &= ~PWM_PIN_LEVEL ; +writel (val, lpc32xx->base + (lpc32xx->chip.pwms[0 ].hwpwm <<2 )); + ret =pwmchip_add (&lpc32xx->chip);if (ret <0 ) {dev_err (&pdev->dev,"failed to add PWM chip, error %d\n" , ret);return ret; } -/* When PWM is disable, configure the output to the default value */ - val =readl (lpc32xx->base + (lpc32xx->chip.pwms[0 ].hwpwm <<2 )); - val &= ~PWM_PIN_LEVEL ; -writel (val, lpc32xx->base + (lpc32xx->chip.pwms[0 ].hwpwm <<2 )); -platform_set_drvdata (pdev, lpc32xx);return 0 ;
Greg Kroah-Hartman
maintainerPATCH 26/50 pwm: mxs: Dont modify HW state in .probe() after the PWM chip was registered
In reply to Greg Kroah-HartmanFrom: Uwe Kleine-König <[email protected]>
commit 020162d6f49f2963062229814a56a89c86cbeaa8 upstream.
This fixes a race condition: After pwmchip_add() is called there might already be a consumer and then modifying the hardware behind the consumer's back is bad. So reset before calling pwmchip_add().
Note that reseting the hardware isn't the right thing to do if the PWM is already running as it might e.g. disable (or even enable) a backlight that is supposed to be on (or off).
--- drivers/pwm/pwm-mxs.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-)
drivers/pwm/pwm-mxs.c +5 -8
@@ -150,6 +150,11 @@ static int mxs_pwm_probe(struct platformreturn ret; } +/* FIXME: Only do this if the PWM isn't already running */ + ret =stmp_reset_block (mxs->base); +if (ret) +return dev_err_probe (&pdev->dev, ret,"failed to reset PWM\n" ); + ret =pwmchip_add (&mxs->chip);if (ret <0 ) {dev_err (&pdev->dev,"failed to add pwm chip %d\n" , ret);
@@ -158,15 +163,7 @@ static int mxs_pwm_probe(struct platformplatform_set_drvdata (pdev, mxs); - ret =stmp_reset_block (mxs->base); -if (ret) - goto pwm_remove; -return 0 ; - -pwm_remove: -pwmchip_remove (&mxs->chip); -return ret; }static int mxs_pwm_remove (struct platform_device *pdev)
Greg Kroah-Hartman
maintainerPATCH 24/50 profiling: fix shift-out-of-bounds bugs
In reply to Greg Kroah-HartmanFrom: Pavel Skripkin <[email protected]>
commit 2d186afd04d669fe9c48b994c41a7405a3c9f16d upstream.
Syzbot reported shift-out-of-bounds bug in profile_init().
The problem was in incorrect prof_shift. Since prof_shift value comes from userspace we need to clamp this value into [0, BITS_PER_LONG -1] boundaries.
Second possible shiht-out-of-bounds was found by Tetsuo:sample_step local variable in read_profile() had "unsigned int" type, but prof_shift allows to make a BITS_PER_LONG shift. So, to prevent possible shiht-out-of-bounds sample_step type was changed to "unsigned long".
Also, "unsigned short int" will be sufficient for storing [0, BITS_PER_LONG] value, that's why there is no need for "unsigned long" prof_shift.
--- kernel/profile.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-)
kernel/profile.c +11 -10
@@ -41,7 +41,8 @@ struct profile_hit {#define NR_PROFILE_GRP (NR_PROFILE_HIT/PROFILE_GRPSZ)static atomic_t *prof_buffer; -static unsigned long prof_len, prof_shift; +static unsigned long prof_len; +static unsigned short int prof_shift;int prof_on__read_mostly ;EXPORT_SYMBOL_GPL (prof_on);
@@ -67,8 +68,8 @@ int profile_setup(char *str)if (str[strlen (sleepstr)] ==',' ) str +=strlen (sleepstr) +1 ;if (get_option (&str, &par)) - prof_shift = par; -pr_info ("kernel sleep profiling enabled (shift: %ld)\n" , + prof_shift =clamp (par,0 ,BITS_PER_LONG -1 ); +pr_info ("kernel sleep profiling enabled (shift: %u)\n" , prof_shift);#else pr_warn ("kernel sleep profiling requires CONFIG_SCHEDSTATS\n" );
@@ -78,21 +79,21 @@ int profile_setup(char *str)if (str[strlen (schedstr)] ==',' ) str +=strlen (schedstr) +1 ;if (get_option (&str, &par)) - prof_shift = par; -pr_info ("kernel schedule profiling enabled (shift: %ld)\n" , + prof_shift =clamp (par,0 ,BITS_PER_LONG -1 ); +pr_info ("kernel schedule profiling enabled (shift: %u)\n" , prof_shift); }else if (!strncmp (str, kvmstr,strlen (kvmstr))) { prof_on =KVM_PROFILING ;if (str[strlen (kvmstr)] ==',' ) str +=strlen (kvmstr) +1 ;if (get_option (&str, &par)) - prof_shift = par; -pr_info ("kernel KVM profiling enabled (shift: %ld)\n" , + prof_shift =clamp (par,0 ,BITS_PER_LONG -1 ); +pr_info ("kernel KVM profiling enabled (shift: %u)\n" , prof_shift); }else if (get_option (&str, &par)) { - prof_shift = par; + prof_shift =clamp (par,0 ,BITS_PER_LONG -1 ); prof_on =CPU_PROFILING ; -pr_info ("kernel profiling enabled (shift: %ld)\n" , +pr_info ("kernel profiling enabled (shift: %u)\n" , prof_shift); }return 1 ;
@@ -468,7 +469,7 @@ read_profile(struct file *file, char __uunsigned long p = *ppos;ssize_t read;char *pnt; -unsigned int sample_step =1 << prof_shift; +unsigned long sample_step =1UL << prof_shift;profile_flip_buffers ();if (p >= (prof_len+1 )*sizeof (unsigned int ))
Greg Kroah-Hartman
maintainerPATCH 27/50 phy: avoid unnecessary link-up delay in polling mode
In reply to Greg Kroah-HartmanFrom: Petr Oros <[email protected]>
commit e96bd2d3b1f83170d1d5c1a99e439b39a22a5b58 upstream.
commit 93c0970493c71f ("net: phy: consider latched link-down status in polling mode") removed double-read of latched link-state register for polling mode from genphy_update_link(). This added extra ~1s delay into sequence link down->up.
Following scenario:
- After boot link goes up
- phy_start() is called triggering an aneg restart, hence link goes down and link-down info is latched.
- After aneg has finished link goes up. In phy_state_machine is checked link state but it is latched "link is down". The state machine is scheduled after one second and there is detected "link is up". This extra delay can be avoided when we keep link-state register double read in case when link was down previously.
With this solution we don't miss a link-down event in polling mode and link-up is faster.
Details about this quirky behavior on Realtek phy:
Without patch:
T0: aneg is started, link goes down, link-down status is latched
T0+3s: state machine runs, up-to-date link-down is read T0+4s: state machine runs, aneg is finished (BMSR_ANEGCOMPLETE==1),
here i read link-down (BMSR_LSTATUS==0),
T0+5s: state machine runs, aneg is finished (BMSR_ANEGCOMPLETE==1),
up-to-date link-up is read (BMSR_LSTATUS==1),
phydev->link goes up, state change PHY_NOLINK to PHY_RUNNINGWith patch:
T0: aneg is started, link goes down, link-down status is latched
T0+3s: state machine runs, up-to-date link-down is read T0+4s: state machine runs, aneg is finished (BMSR_ANEGCOMPLETE==1),
first BMSR read: BMSR_ANEGCOMPLETE==1 and BMSR_LSTATUS==0,
second BMSR read: BMSR_ANEGCOMPLETE==1 and BMSR_LSTATUS==1,
phydev->link goes up, state change PHY_NOLINK to PHY_RUNNING--- drivers/net/phy/phy-c45.c | 5 +++-- drivers/net/phy/phy_device.c | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-)
drivers/net/phy/phy-c45.c +3 -2
@@ -239,9 +239,10 @@ int genphy_c45_read_link(struct phy_devi/* The link state is latched low so that momentary link * drops can be detected. Do not double-read the status -* in polling mode to detect such short link drops. +* in polling mode to detect such short link drops except +* the link was already down. */ -if (!phy_polling_mode (phydev)) { +if (!phy_polling_mode (phydev) || !phydev->link) { val =phy_read_mmd (phydev, devad,MDIO_STAT1 );if (val <0 )return val;
drivers/net/phy/phy_device.c +3 -2
@@ -1766,9 +1766,10 @@ int genphy_update_link(struct phy_device/* The link state is latched low so that momentary link * drops can be detected. Do not double-read the status -* in polling mode to detect such short link drops. +* in polling mode to detect such short link drops except +* the link was already down. */ -if (!phy_polling_mode (phydev)) { +if (!phy_polling_mode (phydev) || !phydev->link) { status =phy_read (phydev,MII_BMSR );if (status <0 )return status;
Greg Kroah-Hartman
maintainerPATCH 28/50 net: stmmac: reset Tx desc base address before restarting Tx
In reply to Greg Kroah-HartmanFrom: Jongsung Kim <[email protected]>
commit f421031e3ff0dd288a6e1bbde9aa41a25bb814e6 upstream.
Refer to the databook of DesignWare Cores Ethernet MAC Universal:
6.2.1.5 Register 4 (Transmit Descriptor List Address Register
If this register is not changed when the ST bit is set to 0, then the DMA takes the descriptor address where it was stopped earlier.
The stmmac_tx_err() does zero indices to Tx descriptors, but does not reset HW current Tx descriptor address. To fix inconsistency, the base address of the Tx descriptors should be rewritten before restarting Tx.
--- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +2 -0
@@ -1987,6 +1987,8 @@ static void stmmac_tx_err(struct stmmac_ tx_q->cur_tx =0 ; tx_q->mss =0 ;netdev_tx_reset_queue (netdev_get_tx_queue (priv->dev, chan)); +stmmac_init_tx_chan (priv, priv->ioaddr, priv->plat->dma_cfg, + tx_q->dma_tx_phy, chan);stmmac_start_tx_dma (priv, chan); priv->dev->stats.tx_errors++;
Greg Kroah-Hartman
maintainerPATCH 29/50 Kconfig.debug: drop selecting non-existing HARDLOCKUP_DETECTOR_ARCH
In reply to Greg Kroah-HartmanFrom: Lukas Bulwahn <[email protected]>
[ Upstream commit 6fe26259b4884b657cbc233fb9cdade9d704976e ]
Commit 05a4a9527931 ("kernel/watchdog: split up config options") adds a new config HARDLOCKUP_DETECTOR, which selects the non-existing config HARDLOCKUP_DETECTOR_ARCH.
Hence, ./scripts/checkkconfigsymbols.py warns:
HARDLOCKUP_DETECTOR_ARCH Referencing files: lib/Kconfig.debug
Simply drop selecting the non-existing HARDLOCKUP_DETECTOR_ARCH.
--- lib/Kconfig.debug | 1 - 1 file changed, 1 deletion(-)
lib/Kconfig.debug +0 -1
@@ -868,7 +868,6 @@ config HARDLOCKUP_DETECTOR depends on HAVE_HARDLOCKUP_DETECTOR_PERF || HAVE_HARDLOCKUP_DETECTOR_ARCH select LOCKUP_DETECTOR select HARDLOCKUP_DETECTOR_PERF if HAVE_HARDLOCKUP_DETECTOR_PERF - select HARDLOCKUP_DETECTOR_ARCH if HAVE_HARDLOCKUP_DETECTOR_ARCH help Say Y here to enable the kernel to act as a watchdog to detect hard lockups.
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 3/50 PCI: pci-bridge-emul: Add PCIe Root Capabilities Register
In reply to Greg Kroah-HartmanFrom: Pali Rohár <[email protected]>
commit e902bb7c24a7099d0eb0eb4cba06f2d91e9299f3 upstream.
The 16-bit Root Capabilities register is at offset 0x1e in the PCIe Capability. Rename current 'rsvd' struct member to 'rootcap'.
--- drivers/pci/pci-bridge-emul.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pci/pci-bridge-emul.h +1 -1
@@ -54,7 +54,7 @@ struct pci_bridge_emul_pcie_conf {__le16 slotctl;__le16 slotsta;__le16 rootctl; -__le16 rsvd; +__le16 rootcap;__le32 rootsta;__le32 devcap2;__le16 devctl2;
Greg Kroah-Hartman
maintainerPATCH 30/50 thermal/core: Fix thermal_cooling_device_register() prototype
In reply to Greg Kroah-HartmanFrom: Arnd Bergmann <[email protected]>
[ Upstream commit fb83610762dd5927212aa62a468dd3b756b57a88 ]
There are two pairs of declarations for thermal_cooling_device_register() and thermal_of_cooling_device_register(), and only one set was changed in a recent patch, so the other one now causes a compile-time warning:
drivers/net/wireless/mediatek/mt76/mt7915/init.c: In function 'mt7915_thermal_init':drivers/net/wireless/mediatek/mt76/mt7915/init.c:134:48: error: passing argument 1 of 'thermal_cooling_device_register' discards 'const' qualifier from pointer target type [-Werror=discarded-qualifiers]
134 | cdev = thermal_cooling_device_register(wiphy_name(wiphy), phy,
| ^~~~~~~~~~~~~~~~~
In file included from drivers/net/wireless/mediatek/mt76/mt7915/init.c:7:include/linux/thermal.h:407:39: note: expected 'char *' but argument is of type 'const char *'
407 | thermal_cooling_device_register(char *type, void *devdata,
| ~~~~~~^~~~
Change the dummy helper functions to have the same arguments as the normal version.
--- include/linux/thermal.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
include/linux/thermal.h +3 -2
@@ -501,12 +501,13 @@ static inline void thermal_zone_device_update(struct thermal_zone_device *tz,static inline void thermal_zone_set_trips (struct thermal_zone_device *tz) { }static inline struct thermal_cooling_device * -thermal_cooling_device_register (char *type,void *devdata, +thermal_cooling_device_register (const char *type,void *devdata,const struct thermal_cooling_device_ops *ops) {return ERR_PTR (-ENODEV ); }static inline struct thermal_cooling_device *thermal_of_cooling_device_register (struct device_node *np, -char *type,void *devdata,const struct thermal_cooling_device_ops *ops) +const char *type,void *devdata, +const struct thermal_cooling_device_ops *ops) {return ERR_PTR (-ENODEV ); }static inline struct thermal_cooling_device * devm_thermal_of_cooling_device_register(struct device *dev,
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 31/50 drivers: base: cacheinfo: Get rid of DEFINE_SMP_CALL_CACHE_FUNCTION()
In reply to Greg Kroah-HartmanFrom: Thomas Gleixner <[email protected]>
[ Upstream commit 4b92d4add5f6dcf21275185c997d6ecb800054cd ]
DEFINE_SMP_CALL_CACHE_FUNCTION() was usefel before the CPU hotplug rework to ensure that the cache related functions are called on the upcoming CPU because the notifier itself could run on any online CPU.
The hotplug state machine guarantees that the callbacks are invoked on the upcoming CPU. So there is no need to have this SMP function call obfuscation. That indirection was missed when the hotplug notifiers were converted.
This also solves the problem of ARM64 init_cache_level() invoking ACPI functions which take a semaphore in that context. That's invalid as SMP function calls run with interrupts disabled. Running it just from the callback in context of the CPU hotplug thread solves this.
--- arch/arm64/kernel/cacheinfo.c | 7 ++----- arch/mips/kernel/cacheinfo.c | 7 ++----- arch/riscv/kernel/cacheinfo.c | 7 ++----- arch/x86/kernel/cpu/cacheinfo.c | 7 ++----- include/linux/cacheinfo.h | 18 ------------------ 5 files changed, 8 insertions(+), 38 deletions(-)
arch/arm64/kernel/cacheinfo.c +2 -5
@@ -43,7 +43,7 @@ static void ci_leaf_init(struct cacheinfo *this_leaf, this_leaf->type = type; } -static int __init_cache_level (unsigned int cpu) +int init_cache_level (unsigned int cpu) {unsigned int ctype, level, leaves, fw_level;struct cpu_cacheinfo *this_cpu_ci =get_cpu_cacheinfo (cpu);
@@ -78,7 +78,7 @@ static int __init_cache_level(unsigned int cpu)return 0 ; } -static int __populate_cache_leaves (unsigned int cpu) +int populate_cache_leaves (unsigned int cpu) {unsigned int level, idx;enum cache_type type;
@@ -97,6 +97,3 @@ static int __populate_cache_leaves(unsigned int cpu) }return 0 ; } - -DEFINE_SMP_CALL_CACHE_FUNCTION (init_cache_level) -DEFINE_SMP_CALL_CACHE_FUNCTION (populate_cache_leaves)
arch/mips/kernel/cacheinfo.c +2 -5
@@ -17,7 +17,7 @@ do { \ leaf++; \ }while (0 ) -static int __init_cache_level(unsigned int cpu) +int init_cache_level(unsigned int cpu) {struct cpuinfo_mips *c = ¤t_cpu_data;struct cpu_cacheinfo *this_cpu_ci =get_cpu_cacheinfo (cpu);
@@ -69,7 +69,7 @@ static void fill_cpumask_cluster(int cpu, cpumask_t *cpu_map)cpumask_set_cpu (cpu1, cpu_map); } -static int __populate_cache_leaves (unsigned int cpu) +int populate_cache_leaves (unsigned int cpu) {struct cpuinfo_mips *c = ¤t_cpu_data;struct cpu_cacheinfo *this_cpu_ci =get_cpu_cacheinfo (cpu);
@@ -98,6 +98,3 @@ static int __populate_cache_leaves(unsigned int cpu)return 0 ; } - -DEFINE_SMP_CALL_CACHE_FUNCTION (init_cache_level) -DEFINE_SMP_CALL_CACHE_FUNCTION (populate_cache_leaves)
arch/riscv/kernel/cacheinfo.c +2 -5
@@ -16,7 +16,7 @@ static void ci_leaf_init(struct cacheinfo *this_leaf, this_leaf->type = type; } -static int __init_cache_level (unsigned int cpu) +int init_cache_level (unsigned int cpu) {struct cpu_cacheinfo *this_cpu_ci =get_cpu_cacheinfo (cpu);struct device_node *np =of_cpu_device_node_get (cpu);
@@ -58,7 +58,7 @@ static int __init_cache_level(unsigned int cpu)return 0 ; } -static int __populate_cache_leaves (unsigned int cpu) +int populate_cache_leaves (unsigned int cpu) {struct cpu_cacheinfo *this_cpu_ci =get_cpu_cacheinfo (cpu);struct cacheinfo *this_leaf = this_cpu_ci->info_list;
@@ -95,6 +95,3 @@ static int __populate_cache_leaves(unsigned int cpu)return 0 ; } - -DEFINE_SMP_CALL_CACHE_FUNCTION (init_cache_level) -DEFINE_SMP_CALL_CACHE_FUNCTION (populate_cache_leaves)
arch/x86/kernel/cpu/cacheinfo.c +2 -5
@@ -985,7 +985,7 @@ static void ci_leaf_init(struct cacheinfo *this_leaf, this_leaf->priv = base->nb; } -static int __init_cache_level (unsigned int cpu) +int init_cache_level (unsigned int cpu) {struct cpu_cacheinfo *this_cpu_ci =get_cpu_cacheinfo (cpu);
@@ -1014,7 +1014,7 @@ static void get_cache_id(int cpu, struct _cpuid4_info_regs *id4_regs) id4_regs->id = c->apicid >> index_msb; } -static int __populate_cache_leaves (unsigned int cpu) +int populate_cache_leaves (unsigned int cpu) {unsigned int idx, ret;struct cpu_cacheinfo *this_cpu_ci =get_cpu_cacheinfo (cpu);
@@ -1033,6 +1033,3 @@ static int __populate_cache_leaves(unsigned int cpu)return 0 ; } - -DEFINE_SMP_CALL_CACHE_FUNCTION (init_cache_level) -DEFINE_SMP_CALL_CACHE_FUNCTION (populate_cache_leaves)
include/linux/cacheinfo.h +0 -18
@@ -78,24 +78,6 @@ struct cpu_cacheinfo {bool cpu_map_populated; }; -/* -* Helpers to make sure "func" is executed on the cpu whose cache -* attributes are being detected -*/ -#define DEFINE_SMP_CALL_CACHE_FUNCTION (func) \ -static inline void _##func(void *ret) \ -{ \ - int cpu = smp_processor_id(); \ - *(int *)ret = __##func(cpu); \ -} \ - \ -int func(unsigned int cpu) \ -{ \ - int ret; \ - smp_call_function_single(cpu, _##func, &ret, true); \ - return ret; \ -} -struct cpu_cacheinfo *get_cpu_cacheinfo (unsigned int cpu);int init_cache_level (unsigned int cpu);int populate_cache_leaves (unsigned int cpu);
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 32/50 parisc: Move pci_dev_is_behind_card_dino to where it is used
In reply to Greg Kroah-HartmanFrom: Guenter Roeck <[email protected]>
[ Upstream commit 907872baa9f1538eed02ec737b8e89eba6c6e4b9 ]
parisc build test images fail to compile with the following error.
drivers/parisc/dino.c:160:12: error:
'pci_dev_is_behind_card_dino' defined but not used
Move the function just ahead of its only caller to avoid the error.
--- drivers/parisc/dino.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-)
drivers/parisc/dino.c +9 -9
@@ -156,15 +156,6 @@ static inline struct dino_device *DINO_DEV(struct pci_hba_data *hba) return container_of(hba, struct dino_device, hba); } -/* Check if PCI device is behind a Card-mode Dino. */ -static int pci_dev_is_behind_card_dino (struct pci_dev *dev) -{ -struct dino_device *dino_dev; - - dino_dev =DINO_DEV (parisc_walk_tree (dev->bus->bridge)); -return is_card_dino (&dino_dev->hba.dev->id); -} -/* * Dino Configuration Space Accessor Functions */
@@ -447,6 +438,15 @@ static void quirk_cirrus_cardbus(struct pci_dev *dev)DECLARE_PCI_FIXUP_ENABLE (PCI_VENDOR_ID_CIRRUS ,PCI_DEVICE_ID_CIRRUS_6832 , quirk_cirrus_cardbus );#ifdef CONFIG_TULIP +/* Check if PCI device is behind a Card-mode Dino. */ +static int pci_dev_is_behind_card_dino (struct pci_dev *dev) +{ +struct dino_device *dino_dev; + + dino_dev =DINO_DEV (parisc_walk_tree (dev->bus->bridge)); +return is_card_dino (&dino_dev->hba.dev->id); +} +static void pci_fixup_tulip (struct pci_dev *dev) {if (!pci_dev_is_behind_card_dino (dev))
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 33/50 dmaengine: sprd: Add missing MODULE_DEVICE_TABLE
In reply to Greg Kroah-HartmanFrom: Zou Wei <[email protected]>
[ Upstream commit 4faee8b65ec32346f8096e64c5fa1d5a73121742 ]
This patch adds missing MODULE_DEVICE_TABLE definition which generates correct modalias for automatic loading of this driver when it is built as an external module.
--- drivers/dma/sprd-dma.c | 1 + 1 file changed, 1 insertion(+)
drivers/dma/sprd-dma.c +1 -0
@@ -1230,6 +1230,7 @@ static const struct of_device_id sprd_dma_match[] = { { .compatible = "sprd,sc9860-dma", }, {}, }; +MODULE_DEVICE_TABLE (of, sprd_dma_match);static int __maybe_unused sprd_dma_runtime_suspend (struct device *dev) {
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 4/50 PCI: aardvark: Fix reporting CRS value
In reply to Greg Kroah-HartmanFrom: Pali Rohár <[email protected]>
commit 43f5c77bcbd27cce70bf33c2b86d6726ce95dd66 upstream.
Set CRSVIS flag in emulated root PCI bridge to indicate support for Completion Retry Status.
Add check for CRSSVE flag from root PCI brige when issuing Configuration Read Request via PIO to correctly returns fabricated CRS value as it is required by PCIe spec.
--- drivers/pci/controller/pci-aardvark.c | 67 +++++++++++++++++++++++++++++++--- 1 file changed, 63 insertions(+), 4 deletions(-)
drivers/pci/controller/pci-aardvark.c +63 -4
@@ -188,6 +188,8 @@#define MSI_IRQ_NUM 32 +#define CFG_RD_CRS_VAL 0xffff0001 +struct advk_pcie {struct platform_device *pdev;void __iomem *base;
@@ -365,7 +367,7 @@ static void advk_pcie_setup_hw(struct adadvk_writel (pcie, reg,PCIE_CORE_CMD_STATUS_REG ); } -static int advk_pcie_check_pio_status (struct advk_pcie *pcie,u32 *val) +static int advk_pcie_check_pio_status (struct advk_pcie *pcie,bool allow_crs,u32 *val) {struct device *dev = &pcie->pdev->dev;u32 reg;
@@ -407,9 +409,30 @@ static int advk_pcie_check_pio_status(st strcomp_status ="UR" ;break ;case PIO_COMPLETION_STATUS_CRS : +if (allow_crs && val) { +/* PCIe r4.0, sec 2.3.2, says: +* If CRS Software Visibility is enabled: +* For a Configuration Read Request that includes both +* bytes of the Vendor ID field of a device Function's +* Configuration Space Header, the Root Complex must +* complete the Request to the host by returning a +* read-data value of 0001h for the Vendor ID field and +* all '1's for any additional bytes included in the +* request. +* +* So CRS in this case is not an error status. +*/ + *val =CFG_RD_CRS_VAL ; + strcomp_status =NULL ; +break ; + }/* PCIe r4.0, sec 2.3.2, says: * If CRS Software Visibility is not enabled, the Root Complex * must re-issue the Configuration Request as a new Request. +* If CRS Software Visibility is enabled: For a Configuration +* Write Request or for any other Configuration Read Request, +* the Root Complex must re-issue the Configuration Request as +* a new Request. * A Root Complex implementation may choose to limit the number * of Configuration Request/CRS Completion Status loops before * determining that something is wrong with the target of the
@@ -478,6 +501,7 @@ advk_pci_bridge_emul_pcie_conf_read(strucase PCI_EXP_RTCTL : {u32 val =advk_readl (pcie,PCIE_ISR0_MASK_REG ); *value = (val &PCIE_MSG_PM_PME_MASK ) ?0 :PCI_EXP_RTCTL_PMEIE ; + *value |=PCI_EXP_RTCAP_CRSVIS <<16 ;return PCI_BRIDGE_EMUL_HANDLED ; }
@@ -559,6 +583,7 @@ static struct pci_bridge_emul_ops advk_pstatic int advk_sw_pci_bridge_init (struct advk_pcie *pcie) {struct pci_bridge_emul *bridge = &pcie->bridge; +int ret; bridge->conf.vendor =advk_readl (pcie,PCIE_CORE_DEV_ID_REG ) &0xffff ; bridge->conf.device =advk_readl (pcie,PCIE_CORE_DEV_ID_REG ) >>16 ;
@@ -580,7 +605,15 @@ static int advk_sw_pci_bridge_init(struc bridge->data = pcie; bridge->ops = &advk_pci_bridge_emul_ops; -return pci_bridge_emul_init (bridge,0 ); +/* PCIe config space can be initialized after pci_bridge_emul_init() */ + ret =pci_bridge_emul_init (bridge,0 ); +if (ret <0 ) +return ret; + +/* Indicates supports for Completion Retry Status */ + bridge->pcie_conf.rootcap =cpu_to_le16 (PCI_EXP_RTCAP_CRSVIS ); + +return 0 ; } static bool advk_pcie_valid_device(struct advk_pcie *pcie, struct pci_bus *bus,
@@ -625,6 +658,7 @@ static int advk_pcie_rd_conf(struct pci_ int where, int size, u32 *val) { struct advk_pcie *pcie = bus->sysdata; +bool allow_crs;u32 reg;int ret;
@@ -637,7 +671,24 @@ static int advk_pcie_rd_conf(struct pci_return pci_bridge_emul_conf_read (&pcie->bridge, where, size, val); +/* +* Completion Retry Status is possible to return only when reading all +* 4 bytes from PCI_VENDOR_ID and PCI_DEVICE_ID registers at once and +* CRSSVE flag on Root Bridge is enabled. +*/ + allow_crs = (where ==PCI_VENDOR_ID ) && (size ==4 ) && + (le16_to_cpu (pcie->bridge.pcie_conf.rootctl) & +PCI_EXP_RTCTL_CRSSVE ); +if (advk_pcie_pio_is_running (pcie)) { +/* +* If it is possible return Completion Retry Status so caller +* tries to issue the request again instead of failing. +*/ +if (allow_crs) { + *val =CFG_RD_CRS_VAL ; +return PCIBIOS_SUCCESSFUL ; + } *val =0xffffffff ;return PCIBIOS_SET_FAILED ; }
@@ -665,12 +716,20 @@ static int advk_pcie_rd_conf(struct pci_ ret =advk_pcie_wait_pio (pcie);if (ret <0 ) { +/* +* If it is possible return Completion Retry Status so caller +* tries to issue the request again instead of failing. +*/ +if (allow_crs) { + *val =CFG_RD_CRS_VAL ; +return PCIBIOS_SUCCESSFUL ; + } *val =0xffffffff ;return PCIBIOS_SET_FAILED ; }/* Check PIO status and get the read result */ - ret =advk_pcie_check_pio_status (pcie, val); + ret =advk_pcie_check_pio_status (pcie, allow_crs, val);if (ret <0 ) { *val =0xffffffff ;return PCIBIOS_SET_FAILED ;
@@ -739,7 +798,7 @@ static int advk_pcie_wr_conf(struct pci_if (ret <0 )return PCIBIOS_SET_FAILED ; - ret =advk_pcie_check_pio_status (pcie,NULL ); + ret =advk_pcie_check_pio_status (pcie, false,NULL );if (ret <0 )return PCIBIOS_SET_FAILED ;
Greg Kroah-Hartman
maintainerPATCH 5/50 PCI/ACPI: Add Ampere Altra SOC MCFG quirk
In reply to Greg Kroah-HartmanFrom: Tuan Phan <[email protected]>
commit 877c1a5f79c6984bbe3f2924234c08e2f4f1acd5 upstream.
Ampere Altra SOC supports only 32-bit ECAM reads. Add an MCFG quirk for the platform.
[ dannf: backport drops const qualifier from pci_32b_read_ops for
consistency with the other quirks that weren't yet constified in v5.4 ]
--- drivers/acpi/pci_mcfg.c | 20 ++++++++++++++++++++ drivers/pci/ecam.c | 10 ++++++++++ include/linux/pci-ecam.h | 1 + 3 files changed, 31 insertions(+)
drivers/acpi/pci_mcfg.c +20 -0
@@ -142,6 +142,26 @@ static struct mcfg_fixup mcfg_quirks[] =XGENE_V2_ECAM_MCFG (4 ,0 ),XGENE_V2_ECAM_MCFG (4 ,1 ),XGENE_V2_ECAM_MCFG (4 ,2 ), + +#define ALTRA_ECAM_QUIRK(rev, seg) \ + { "Ampere", "Altra ", rev, seg, MCFG_BUS_ANY, &pci_32b_read_ops } + +ALTRA_ECAM_QUIRK (1 ,0 ), +ALTRA_ECAM_QUIRK (1 ,1 ), +ALTRA_ECAM_QUIRK (1 ,2 ), +ALTRA_ECAM_QUIRK (1 ,3 ), +ALTRA_ECAM_QUIRK (1 ,4 ), +ALTRA_ECAM_QUIRK (1 ,5 ), +ALTRA_ECAM_QUIRK (1 ,6 ), +ALTRA_ECAM_QUIRK (1 ,7 ), +ALTRA_ECAM_QUIRK (1 ,8 ), +ALTRA_ECAM_QUIRK (1 ,9 ), +ALTRA_ECAM_QUIRK (1 ,10 ), +ALTRA_ECAM_QUIRK (1 ,11 ), +ALTRA_ECAM_QUIRK (1 ,12 ), +ALTRA_ECAM_QUIRK (1 ,13 ), +ALTRA_ECAM_QUIRK (1 ,14 ), + ALTRA_ECAM_QUIRK(1, 15), };static char mcfg_oem_id[ACPI_OEM_ID_SIZE ];
drivers/pci/ecam.c +10 -0
@@ -164,4 +164,14 @@ struct pci_ecam_ops pci_32b_ops = { .write = pci_generic_config_write32, } }; + +/* ECAM ops for 32-bit read only (non-compliant) */ +struct pci_ecam_ops pci_32b_read_ops = { + .bus_shift =20 , + .pci_ops = { + .map_bus = pci_ecam_map_bus, + .read = pci_generic_config_read32, + .write = pci_generic_config_write, + } +};#endif
include/linux/pci-ecam.h +1 -0
@@ -51,6 +51,7 @@ extern struct pci_ecam_ops pci_generic_e#if defined(CONFIG_ACPI ) && defined(CONFIG_PCI_QUIRKS )extern struct pci_ecam_ops pci_32b_ops;/* 32-bit accesses only */ +extern struct pci_ecam_ops pci_32b_read_ops;/* 32-bit read only */ extern struct pci_ecam_ops hisi_pcie_ops;/* HiSilicon */ extern struct pci_ecam_ops thunder_pem_ecam_ops;/* Cavium ThunderX 1.x & 2.x */ extern struct pci_ecam_ops pci_thunder_ecam_ops;/* Cavium ThunderX 1.x */
Greg Kroah-Hartman
maintainerPATCH 6/50 KVM: remember position in kvm->vcpus array
In reply to Greg Kroah-HartmanFrom: Radim Krčmář <[email protected]>
commit 8750e72a79dda2f665ce17b62049f4d62130d991 upstream.
Fetching an index for any vcpu in kvm->vcpus array by traversing the entire array everytime is costly.
This patch remembers the position of each vcpu in kvm->vcpus array by storing it in vcpus_idx under kvm_vcpu structure.
[[email protected]]: backport to 4.19 (also fits for 5.4)
--- include/linux/kvm_host.h | 11 +++-------- virt/kvm/kvm_main.c | 5 +++-- 2 files changed, 6 insertions(+), 10 deletions(-)
include/linux/kvm_host.h +3 -8
@@ -266,7 +266,8 @@ struct kvm_vcpu {struct preempt_notifier preempt_notifier;#endif int cpu; -int vcpu_id; +int vcpu_id;/* id given by userspace at creation */ +int vcpu_idx;/* index in kvm->vcpus array */ int srcu_idx;int mode;u64 requests;
@@ -571,13 +572,7 @@ static inline struct kvm_vcpu *kvm_get_vstatic inline int kvm_vcpu_get_idx (struct kvm_vcpu *vcpu) { -struct kvm_vcpu *tmp; -int idx; - -kvm_for_each_vcpu (idx, tmp, vcpu->kvm) -if (tmp == vcpu) -return idx; -BUG (); +return vcpu->vcpu_idx; }#define kvm_for_each_memslot (memslot, slots) \
virt/kvm/kvm_main.c +3 -2
@@ -2864,7 +2864,8 @@ static int kvm_vm_ioctl_create_vcpu(stru goto unlock_vcpu_destroy; } -BUG_ON (kvm->vcpus[atomic_read (&kvm->online_vcpus)]); + vcpu->vcpu_idx =atomic_read (&kvm->online_vcpus); +BUG_ON (kvm->vcpus[vcpu->vcpu_idx]);/* Now it's all set up, let userspace reach it */ kvm_get_kvm (kvm);
@@ -2874,7 +2875,7 @@ static int kvm_vm_ioctl_create_vcpu(stru goto unlock_vcpu_destroy; } - kvm->vcpus[atomic_read (&kvm->online_vcpus)] = vcpu; + kvm->vcpus[vcpu->vcpu_idx] = vcpu;/* * Pairs with smp_rmb() in kvm_get_vcpu. Write kvm->vcpus
Greg Kroah-Hartman
maintainerPATCH 7/50 console: consume APC, DM, DCS
In reply to Greg Kroah-HartmanFrom: nick black <[email protected]>
commit 3a2b2eb55681158d3e3ef464fbf47574cf0c517c upstream.
The Linux console's VT102 implementation already consumes OSC ("Operating System Command") sequences, probably because that's how palette changes are transmitted.
In addition to OSC, there are three other major clases of ANSI control
strings: APC ("Application Program Command"), PM ("Privacy Message"), and DCS ("Device Control String"). They are handled similarly to OSC in terms of termination.
Source: vt100.net
Add three new enumerated states, one for each of these types. All three are handled the same way right now--they simply consume input until terminated. I hope to expand upon this firmament in the future. Add new predicate ansi_control_string(), returning true for any of these states. Replace explicit checks against ESosc with calls to this function. Transition to these states appropriately from the escape initiation (ESesc) state.
This was motivated by the following Notcurses bugs:
https://github.com/dankamongmen/notcurses/issues/2050
https://github.com/dankamongmen/notcurses/issues/1828
https://github.com/dankamongmen/notcurses/issues/2069
where standard VT sequences are not consumed by the Linux console. It's not necessary that the Linux console *support* these sequences, but it ought *consume* these well-specified classes of sequences.
Tested by sending a variety of escape sequences to the console, and verifying that they still worked, or were now properly consumed. Verified that the escapes were properly terminated at a generic level. Verified that the Notcurses tools continued to show expected output on the Linux console, except now without escape bleedthrough.
--- drivers/tty/vt/vt.c | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-)
drivers/tty/vt/vt.c +27 -4
@@ -2070,7 +2070,7 @@ static void restore_cur(struct vc_data *enum { ESnormal, ESesc, ESsquare, ESgetpars, ESfunckey, EShash, ESsetG0, ESsetG1, ESpercent, EScsiignore, ESnonstd, - ESpalette, ESosc }; + ESpalette, ESosc, ESapc, ESpm, ESdcs };/* console_lock is held (except via vc_init()) */ static void reset_terminal (struct vc_data *vc,int do_clear)
@@ -2124,20 +2124,28 @@ static void reset_terminal(struct vc_datcsi_J (vc,2 ); } +/* is this state an ANSI control string? */ +static bool ansi_control_string (unsigned int state) +{ +if (state == ESosc || state == ESapc || state == ESpm || state == ESdcs) +return true; +return false; +} +/* console_lock is held */ static void do_con_trol (struct tty_struct *tty,struct vc_data *vc,int c) {/* * Control characters can be used in the _middle_ -* of an escape sequence. +* of an escape sequence, aside from ANSI control strings. */ -if (vc->vc_state == ESosc && c>=8 && c<=13 )/* ... except for OSC */ +if (ansi_control_string (vc->vc_state) && c >=8 && c <=13 )return ;switch (c) {case 0 :return ;case 7 : -if (vc->vc_state == ESosc) +if (ansi_control_string (vc->vc_state)) vc->vc_state = ESnormal;else if (vc->vc_bell_duration)kd_mksound (vc->vc_bell_pitch, vc->vc_bell_duration);
@@ -2196,6 +2204,12 @@ static void do_con_trol(struct tty_struccase ']' : vc->vc_state = ESnonstd;return ; +case '_' : + vc->vc_state = ESapc; +return ; +case '^' : + vc->vc_state = ESpm; +return ;case '%' : vc->vc_state = ESpercent;return ;
@@ -2212,6 +2226,9 @@ static void do_con_trol(struct tty_struccase 'H' : vc->vc_tab_stop[7 & (vc->vc_x >>5 )] |= (1 << (vc->vc_x &31 ));return ; +case 'P' : + vc->vc_state = ESdcs; +return ;case 'Z' :respond_ID (tty);return ;
@@ -2531,8 +2548,14 @@ static void do_con_trol(struct tty_struc vc->vc_translate =set_translate (vc->vc_G1_charset, vc); vc->vc_state = ESnormal;return ; +case ESapc: +return ;case ESosc:return ; +case ESpm: +return ; +case ESdcs: +return ;default : vc->vc_state = ESnormal; }
Greg Kroah-Hartman
maintainercover 5.4.149-rc1 review
This is the start of the stable review cycle for the 5.4.149 release. There are 50 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sun, 26 Sep 2021 12:43:20 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.4.149-rc1.gz
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-5.4.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 5.4.149-rc1
Guenter Roeck <[email protected]>
drm/nouveau/nvkm: Replace -ENOSYS with -ENODEV
Yu-Tung Chang <[email protected]>
rtc: rx8010: select REGMAP_I2C
Li Jinlin <[email protected]>
blk-throttle: fix UAF by deleteing timer in blk_throtl_exit()
Uwe Kleine-König <[email protected]>
pwm: stm32-lp: Don't modify HW state in .remove() callback
Uwe Kleine-König <[email protected]>
pwm: rockchip: Don't modify HW state in .remove() callback
Uwe Kleine-König <[email protected]>
pwm: img: Don't modify HW state in .remove() callback
Nanyong Sun <[email protected]>
nilfs2: fix memory leak in nilfs_sysfs_delete_snapshot_group
Nanyong Sun <[email protected]>
nilfs2: fix memory leak in nilfs_sysfs_create_snapshot_group
Nanyong Sun <[email protected]>
nilfs2: fix memory leak in nilfs_sysfs_delete_##name##_group
Nanyong Sun <[email protected]>
nilfs2: fix memory leak in nilfs_sysfs_create_##name##_group
Nanyong Sun <[email protected]>
nilfs2: fix NULL pointer in nilfs_##name##_attr_release
Nanyong Sun <[email protected]>
nilfs2: fix memory leak in nilfs_sysfs_create_device_group
Anand Jain <[email protected]>
btrfs: fix lockdep warning while mounting sprout fs
Jeff Layton <[email protected]>
ceph: lockdep annotations for try_nonblocking_invalidate
Jeff Layton <[email protected]>
ceph: request Fw caps before updating the mtime in ceph_write_iter
Radhey Shyam Pandey <[email protected]>
dmaengine: xilinx_dma: Set DMA mask for coherent APIs
Johannes Berg <[email protected]>
dmaengine: ioat: depends on !UML
Zou Wei <[email protected]>
dmaengine: sprd: Add missing MODULE_DEVICE_TABLE
Guenter Roeck <[email protected]>
parisc: Move pci_dev_is_behind_card_dino to where it is used
Thomas Gleixner <[email protected]>
drivers: base: cacheinfo: Get rid of DEFINE_SMP_CALL_CACHE_FUNCTION()
Arnd Bergmann <[email protected]>
thermal/core: Fix thermal_cooling_device_register() prototype
Lukas Bulwahn <[email protected]>
Kconfig.debug: drop selecting non-existing HARDLOCKUP_DETECTOR_ARCH
Jongsung Kim <[email protected]>
net: stmmac: reset Tx desc base address before restarting Tx
Petr Oros <[email protected]>
phy: avoid unnecessary link-up delay in polling mode
Uwe Kleine-König <[email protected]>
pwm: mxs: Don't modify HW state in .probe() after the PWM chip was registered
Uwe Kleine-König <[email protected]>
pwm: lpc32xx: Don't modify HW state in .probe() after the PWM chip was registered
Pavel Skripkin <[email protected]>
profiling: fix shift-out-of-bounds bugs
Zhen Lei <[email protected]>
nilfs2: use refcount_dec_and_lock() to fix potential UAF
Cyrill Gorcunov <[email protected]>
prctl: allow to setup brk for et_dyn executables
Xie Yongji <[email protected]>
9p/trans_virtio: Remove sysfs file on probe failure
Dan Carpenter <[email protected]>
thermal/drivers/exynos: Fix an error code in exynos_tmu_probe()
Andy Shevchenko <[email protected]>
dmaengine: acpi: Avoid comparison GSI with Linux vIRQ
Johannes Berg <[email protected]>
um: virtio_uml: fix memory leak on init failures
Nathan Chancellor <[email protected]>
staging: rtl8192u: Fix bitwise vs logical operator in TranslateRxSignalStuff819xUsb()
Marcelo Ricardo Leitner <[email protected]>
sctp: add param size validation for SCTP_PARAM_SET_PRIMARY
Marcelo Ricardo Leitner <[email protected]>
sctp: validate chunk size in __rcv_asconf_lookup
Alex Sverdlin <[email protected]>
ARM: 9098/1: ftrace: MODULE_PLT: Fix build problem without DYNAMIC_FTRACE
Alex Sverdlin <[email protected]>
ARM: 9079/1: ftrace: Add MODULE_PLTS support
Alex Sverdlin <[email protected]>
ARM: 9078/1: Add warn suppress parameter to arm_gen_branch_link()
Alex Sverdlin <[email protected]>
ARM: 9077/1: PLT: Move struct plt_entries definition to header
Andy Shevchenko <[email protected]>
apparmor: remove duplicate macro list_entry_is_head()
Florian Fainelli <[email protected]>
ARM: Qualify enabling of swiotlb_init()
David Hildenbrand <[email protected]>
s390/pci_mmio: fully validate the VMA before calling follow_pte()
nick black <[email protected]>
console: consume APC, DM, DCS
Radim Krčmář <[email protected]>
KVM: remember position in kvm->vcpus array
Tuan Phan <[email protected]>
PCI/ACPI: Add Ampere Altra SOC MCFG quirk
Pali Rohár <[email protected]>
PCI: aardvark: Fix reporting CRS value
Pali Rohár <[email protected]>
PCI: pci-bridge-emul: Add PCIe Root Capabilities Register
Pali Rohár <[email protected]>
PCI: aardvark: Indicate error in 'val' when config read fails
Grzegorz Jaszczyk <[email protected]>
PCI: pci-bridge-emul: Fix big-endian support
-------------
Diffstat:
Makefile | 4 +- arch/arm/include/asm/ftrace.h | 3 + arch/arm/include/asm/insn.h | 8 +-- arch/arm/include/asm/module.h | 10 +++ arch/arm/kernel/ftrace.c | 46 ++++++++++--- arch/arm/kernel/insn.c | 19 +++--- arch/arm/kernel/module-plts.c | 49 ++++++++++---- arch/arm/mm/init.c | 6 +- arch/arm64/kernel/cacheinfo.c | 7 +- arch/mips/kernel/cacheinfo.c | 7 +- arch/riscv/kernel/cacheinfo.c | 7 +- arch/s390/pci/pci_mmio.c | 2 +- arch/um/drivers/virtio_uml.c | 4 +- arch/x86/kernel/cpu/cacheinfo.c | 7 +- block/blk-throttle.c | 1 + drivers/acpi/pci_mcfg.c | 20 ++++++ drivers/dma/Kconfig | 2 +- drivers/dma/acpi-dma.c | 10 ++- drivers/dma/sprd-dma.c | 1 + drivers/dma/xilinx/xilinx_dma.c | 2 +- drivers/gpu/drm/nouveau/nvkm/engine/device/ctrl.c | 2 +- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 2 + drivers/net/phy/phy-c45.c | 5 +- drivers/net/phy/phy_device.c | 5 +- drivers/parisc/dino.c | 18 +++--- drivers/pci/controller/pci-aardvark.c | 71 +++++++++++++++++++-- drivers/pci/ecam.c | 10 +++ drivers/pci/pci-bridge-emul.c | 25 ++++---- drivers/pci/pci-bridge-emul.h | 78 +++++++++++------------ drivers/pwm/pwm-img.c | 16 ----- drivers/pwm/pwm-lpc32xx.c | 10 +-- drivers/pwm/pwm-mxs.c | 13 ++-- drivers/pwm/pwm-rockchip.c | 14 ---- drivers/pwm/pwm-stm32-lp.c | 2 - drivers/rtc/Kconfig | 1 + drivers/staging/rtl8192u/r8192U_core.c | 2 +- drivers/thermal/samsung/exynos_tmu.c | 1 + drivers/tty/vt/vt.c | 31 +++++++-- fs/btrfs/volumes.c | 7 +- fs/ceph/caps.c | 2 + fs/ceph/file.c | 32 +++++----- fs/nilfs2/sysfs.c | 26 ++++---- fs/nilfs2/the_nilfs.c | 9 ++- include/linux/cacheinfo.h | 18 ------ include/linux/kvm_host.h | 11 +--- include/linux/pci-ecam.h | 1 + include/linux/thermal.h | 5 +- kernel/profile.c | 21 +++--- kernel/sys.c | 7 -- lib/Kconfig.debug | 1 - net/9p/trans_virtio.c | 4 +- net/sctp/input.c | 3 + net/sctp/sm_make_chunk.c | 13 +++- security/apparmor/apparmorfs.c | 3 - virt/kvm/kvm_main.c | 5 +- 55 files changed, 414 insertions(+), 275 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 9/50 ARM: Qualify enabling of swiotlb_init()
From: Florian Fainelli <[email protected]>
commit fcf044891c84e38fc90eb736b818781bccf94e38 upstream.
We do not need a SWIOTLB unless we have DRAM that is addressable beyond the arm_dma_limit. Compare max_pfn with arm_dma_pfn_limit to determine whether we do need a SWIOTLB to be initialized.
--- arch/arm/mm/init.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
arch/arm/mm/init.c +5 -1
@@ -469,7 +469,11 @@ static void __init free_highpages(void)void __init mem_init (void ) {#ifdef CONFIG_ARM_LPAE -swiotlb_init (1 ); +if (swiotlb_force ==SWIOTLB_FORCE || + max_pfn > arm_dma_pfn_limit) +swiotlb_init (1 ); +else + swiotlb_force =SWIOTLB_NO_FORCE ;#endif set_max_mapnr (pfn_to_page (max_pfn) - mem_map);
Greg Kroah-Hartman
maintainerPATCH 8/50 s390/pci_mmio: fully validate the VMA before calling follow_pte()
In reply to Greg Kroah-HartmanFrom: David Hildenbrand <[email protected]>
commit a8b92b8c1eac8d655a97b1e90f4d83c25d9b9a18 upstream.
We should not walk/touch page tables outside of VMA boundaries when holding only the mmap sem in read mode. Evil user space can modify the VMA layout just before this function runs and e.g., trigger races with page table removal code since commit dd2283f2605e ("mm: mmap: zap pages with read mmap_sem in munmap").
find_vma() does not check if the address is >= the VMA start address; use vma_lookup() instead.
--- arch/s390/pci/pci_mmio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/s390/pci/pci_mmio.c +1 -1
@@ -128,7 +128,7 @@ static long get_pfn(unsigned long user_adown_read (¤t->mm->mmap_sem); ret = -EINVAL ; vma =find_vma (current->mm, user_addr); -if (!vma) +if (!vma || user_addr < vma->vm_start) goto out; ret = -EACCES ;if (!(vma->vm_flags & access))
Greg Kroah-Hartman
maintainerPATCH 35/50 dmaengine: xilinx_dma: Set DMA mask for coherent APIs
In reply to Greg Kroah-HartmanFrom: Radhey Shyam Pandey <[email protected]>
[ Upstream commit aac6c0f90799d66b8989be1e056408f33fd99fe6 ]
The xilinx dma driver uses the consistent allocations, so for correct operation also set the DMA mask for coherent APIs. It fixes the below kernel crash with dmatest client when DMA IP is configured with 64-bit address width and linux is booted from high (>4GB) memory.
Call trace: [ 489.531257] dma_alloc_from_pool+0x8c/0x1c0 [ 489.535431] dma_direct_alloc+0x284/0x330 [ 489.539432] dma_alloc_attrs+0x80/0xf0 [ 489.543174] dma_pool_alloc+0x160/0x2c0 [ 489.547003] xilinx_cdma_prep_memcpy+0xa4/0x180 [ 489.551524] dmatest_func+0x3cc/0x114c [ 489.555266] kthread+0x124/0x130 [ 489.558486] ret_from_fork+0x10/0x3c [ 489.562051] ---[ end trace 248625b2d596a90a ]---
--- drivers/dma/xilinx/xilinx_dma.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/dma/xilinx/xilinx_dma.c +1 -1
@@ -2703,7 +2703,7 @@ static int xilinx_dma_probe(struct platform_device *pdev) xdev->ext_addr = false;/* Set the dma mask bits */ -dma_set_mask (xdev->dev,DMA_BIT_MASK (addr_width)); +dma_set_mask_and_coherent (xdev->dev,DMA_BIT_MASK (addr_width));/* Initialize the DMA engine */ xdev->common.dev = &pdev->dev;
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 44/50 nilfs2: fix memory leak in nilfs_sysfs_delete_snapshot_group
In reply to Greg Kroah-HartmanFrom: Nanyong Sun <[email protected]>
[ Upstream commit 17243e1c3072b8417a5ebfc53065d0a87af7ca77 ]
kobject_put() should be used to cleanup the memory associated with the kobject instead of kobject_del(). See the section "Kobject removal" of "Documentation/core-api/kobject.rst".
--- fs/nilfs2/sysfs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/nilfs2/sysfs.c +1 -1
@@ -215,7 +215,7 @@ int nilfs_sysfs_create_snapshot_group(struct nilfs_root *root)void nilfs_sysfs_delete_snapshot_group (struct nilfs_root *root) { -kobject_del (&root->snapshot_kobj); +kobject_put (&root->snapshot_kobj); }/************************************************************************
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 47/50 pwm: stm32-lp: Dont modify HW state in .remove() callback
In reply to Greg Kroah-HartmanFrom: Uwe Kleine-König <[email protected]>
[ Upstream commit d44084c93427bb0a9261432db1a8ca76a42d805e ]
A consumer is expected to disable a PWM before calling pwm_put(). And if they didn't there is hopefully a good reason (or the consumer needs fixing). Also if disabling an enabled PWM was the right thing to do, this should better be done in the framework instead of in each low level driver.
--- drivers/pwm/pwm-stm32-lp.c | 2 -- 1 file changed, 2 deletions(-)
drivers/pwm/pwm-stm32-lp.c +0 -2
@@ -225,8 +225,6 @@ static int stm32_pwm_lp_remove(struct platform_device *pdev) {struct stm32_pwm_lp *priv =platform_get_drvdata (pdev); -pwm_disable (&priv->chip.pwms[0 ]); -return pwmchip_remove (&priv->chip); }
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 46/50 pwm: rockchip: Dont modify HW state in .remove() callback
In reply to Greg Kroah-HartmanFrom: Uwe Kleine-König <[email protected]>
[ Upstream commit 9d768cd7fd42bb0be16f36aec48548fca5260759 ]
A consumer is expected to disable a PWM before calling pwm_put(). And if they didn't there is hopefully a good reason (or the consumer needs fixing). Also if disabling an enabled PWM was the right thing to do, this should better be done in the framework instead of in each low level driver.
--- drivers/pwm/pwm-rockchip.c | 14 -------------- 1 file changed, 14 deletions(-)
drivers/pwm/pwm-rockchip.c +0 -14
@@ -383,20 +383,6 @@ static int rockchip_pwm_remove(struct platform_device *pdev) {struct rockchip_pwm_chip *pc =platform_get_drvdata (pdev); -/* -* Disable the PWM clk before unpreparing it if the PWM device is still -* running. This should only happen when the last PWM user left it -* enabled, or when nobody requested a PWM that was previously enabled -* by the bootloader. -* -* FIXME: Maybe the core should disable all PWM devices in -* pwmchip_remove(). In this case we'd only have to call -* clk_unprepare() after pwmchip_remove(). -* -*/ -if (pwm_is_enabled (pc->chip.pwms)) -clk_disable (pc->clk); -clk_unprepare (pc->pclk);clk_unprepare (pc->clk);
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 45/50 pwm: img: Dont modify HW state in .remove() callback
In reply to Greg Kroah-HartmanFrom: Uwe Kleine-König <[email protected]>
[ Upstream commit c68eb29c8e9067c08175dd0414f6984f236f719d ]
A consumer is expected to disable a PWM before calling pwm_put(). And if they didn't there is hopefully a good reason (or the consumer needs fixing). Also if disabling an enabled PWM was the right thing to do, this should better be done in the framework instead of in each low level driver.
--- drivers/pwm/pwm-img.c | 16 ---------------- 1 file changed, 16 deletions(-)
drivers/pwm/pwm-img.c +0 -16
@@ -329,23 +329,7 @@ err_pm_disable:static int img_pwm_remove (struct platform_device *pdev) {struct img_pwm_chip *pwm_chip =platform_get_drvdata (pdev); -u32 val; -unsigned int i; -int ret; - - ret =pm_runtime_get_sync (&pdev->dev); -if (ret <0 ) { -pm_runtime_put (&pdev->dev); -return ret; - } - -for (i =0 ; i < pwm_chip->chip.npwm; i++) { - val =img_pwm_readl (pwm_chip,PWM_CTRL_CFG ); - val &= ~BIT (i); -img_pwm_writel (pwm_chip,PWM_CTRL_CFG , val); - } -pm_runtime_put (&pdev->dev);pm_runtime_disable (&pdev->dev);if (!pm_runtime_status_suspended (&pdev->dev))img_pwm_runtime_suspend (&pdev->dev);
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 48/50 blk-throttle: fix UAF by deleteing timer in blk_throtl_exit()
In reply to Greg Kroah-HartmanFrom: Li Jinlin <[email protected]>
[ Upstream commit 884f0e84f1e3195b801319c8ec3d5774e9bf2710 ]
The pending timer has been set up in blk_throtl_init(). However, the timer is not deleted in blk_throtl_exit(). This means that the timer handler may still be running after freeing the timer, which would result in a use-after-free.
Fix by calling del_timer_sync() to delete the timer in blk_throtl_exit().
--- block/blk-throttle.c | 1 + 1 file changed, 1 insertion(+)
block/blk-throttle.c +1 -0
@@ -2414,6 +2414,7 @@ int blk_throtl_init(struct request_queue *q)void blk_throtl_exit (struct request_queue *q) {BUG_ON (!q->td); +del_timer_sync (&q->td->service_queue.pending_timer);throtl_shutdown_wq (q);blkcg_deactivate_policy (q, &blkcg_policy_throtl);free_percpu (q->td->latency_buckets[READ ]);
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 49/50 rtc: rx8010: select REGMAP_I2C
In reply to Greg Kroah-HartmanFrom: Yu-Tung Chang <[email protected]>
[ Upstream commit 0c45d3e24ef3d3d87c5e0077b8f38d1372af7176 ]
The rtc-rx8010 uses the I2C regmap but doesn't select it in Kconfig so depending on the configuration the build may fail. Fix it.
--- drivers/rtc/Kconfig | 1 + 1 file changed, 1 insertion(+)
drivers/rtc/Kconfig +1 -0
@@ -625,6 +625,7 @@ config RTC_DRV_FM3130 config RTC_DRV_RX8010 tristate "Epson RX8010SJ" + select REGMAP_I2C help If you say yes here you get support for the Epson RX8010SJ RTC chip.
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 50/50 drm/nouveau/nvkm: Replace -ENOSYS with -ENODEV
In reply to Greg Kroah-HartmanFrom: Guenter Roeck <[email protected]>
commit e8f71f89236ef82d449991bfbc237e3cb6ea584f upstream.
nvkm test builds fail with the following error.
drivers/gpu/drm/nouveau/nvkm/engine/device/ctrl.c: In function 'nvkm_control_mthd_pstate_info':
drivers/gpu/drm/nouveau/nvkm/engine/device/ctrl.c:60:35: error: overflow in conversion from 'int' to '__s8' {aka 'signed char'} changes value from '-251' to '5'
The code builds on most architectures, but fails on parisc where ENOSYS is defined as 251.
Replace the error code with -ENODEV (-19). The actual error code does not really matter and is not passed to userspace - it just has to be negative.
--- drivers/gpu/drm/nouveau/nvkm/engine/device/ctrl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/nouveau/nvkm/engine/device/ctrl.c +1 -1
@@ -57,7 +57,7 @@ nvkm_control_mthd_pstate_info(struct nvk args->v0.count =0 ; args->v0.ustate_ac =NVIF_CONTROL_PSTATE_INFO_V0_USTATE_DISABLE ; args->v0.ustate_dc =NVIF_CONTROL_PSTATE_INFO_V0_USTATE_DISABLE ; - args->v0.pwrsrc = -ENOSYS ; + args->v0.pwrsrc = -ENODEV ; args->v0.pstate =NVIF_CONTROL_PSTATE_INFO_V0_PSTATE_UNKNOWN ; }
Greg Kroah-Hartman
maintainerPATCH 36/50 ceph: request Fw caps before updating the mtime in ceph_write_iter
In reply to Greg Kroah-HartmanFrom: Jeff Layton <[email protected]>
[ Upstream commit b11ed50346683a749632ea664959b28d524d7395 ]
The current code will update the mtime and then try to get caps to handle the write. If we end up having to request caps from the MDS, then the mtime in the cap grant will clobber the updated mtime and it'll be lost.
This is most noticable when two clients are alternately writing to the same file. Fw caps are continually being granted and revoked, and the mtime ends up stuck because the updated mtimes are always being overwritten with the old one.
Fix this by changing the order of operations in ceph_write_iter to get the caps before updating the times. Also, make sure we check the pool full conditions before even getting any caps or uninlining.
URL: https://tracker.ceph.com/issues/46574
--- fs/ceph/file.c | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-)
fs/ceph/file.c +17 -15
@@ -1469,32 +1469,26 @@ retry_snap: goto out; } - err =file_remove_privs (file); -if (err) +down_read (&osdc->lock); + map_flags = osdc->osdmap->flags; + pool_flags =ceph_pg_pool_flags (osdc->osdmap, ci->i_layout.pool_id); +up_read (&osdc->lock); +if ((map_flags &CEPH_OSDMAP_FULL ) || + (pool_flags &CEPH_POOL_FLAG_FULL )) { + err = -ENOSPC ; goto out; + } - err =file_update_time (file); + err =file_remove_privs (file);if (err) goto out; -inode_inc_iversion_raw (inode); -if (ci->i_inline_version !=CEPH_INLINE_NONE ) { err =ceph_uninline_data (file,NULL );if (err <0 ) goto out; } -down_read (&osdc->lock); - map_flags = osdc->osdmap->flags; - pool_flags =ceph_pg_pool_flags (osdc->osdmap, ci->i_layout.pool_id); -up_read (&osdc->lock); -if ((map_flags &CEPH_OSDMAP_FULL ) || - (pool_flags &CEPH_POOL_FLAG_FULL )) { - err = -ENOSPC ; - goto out; - } -dout ("aio_write %p %llx.%llx %llu~%zd getting caps. i_size %llu\n" , inode,ceph_vinop (inode), pos, count,i_size_read (inode));if (fi->fmode &CEPH_FILE_MODE_LAZY )
@@ -1507,6 +1501,12 @@ retry_snap:if (err <0 ) goto out; + err =file_update_time (file); +if (err) + goto out_caps; + +inode_inc_iversion_raw (inode); +dout ("aio_write %p %llx.%llx %llu~%zd got cap refs on %s\n" , inode,ceph_vinop (inode), pos, count,ceph_cap_string (got));
@@ -1590,6 +1590,8 @@ retry_snap: } goto out_unlocked; +out_caps: +ceph_put_cap_refs (ci, got); out:if (direct_lock)ceph_end_io_direct (inode);
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 37/50 ceph: lockdep annotations for try_nonblocking_invalidate
In reply to Greg Kroah-HartmanFrom: Jeff Layton <[email protected]>
[ Upstream commit 3eaf5aa1cfa8c97c72f5824e2e9263d6cc977b03 ]
--- fs/ceph/caps.c | 2 ++ 1 file changed, 2 insertions(+)
fs/ceph/caps.c +2 -0
@@ -1775,6 +1775,8 @@ static u64 __mark_caps_flushing(struct inode *inode,* try to invalidate mapping pages without blocking. */ static int try_nonblocking_invalidate (struct inode *inode) + __releases(ci->i_ceph_lock) + __acquires(ci->i_ceph_lock) {struct ceph_inode_info *ci =ceph_inode (inode);u32 invalidating_gen = ci->i_rdcache_gen;
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 38/50 btrfs: fix lockdep warning while mounting sprout fs
In reply to Greg Kroah-HartmanFrom: Anand Jain <[email protected]>
[ Upstream commit c124706900c20dee70f921bb3a90492431561a0a ]
Following test case reproduces lockdep warning.
Test case:
$ mkfs.btrfs -f <dev1> $ btrfstune -S 1 <dev1> $ mount <dev1> <mnt> $ btrfs device add <dev2> <mnt> -f $ umount <mnt> $ mount <dev2> <mnt> $ umount <mnt>
The warning claims a possible ABBA deadlock between the threads initiated by [#1] btrfs device add and [#0] the mount.
[ 540.743122] WARNING: possible circular locking dependency detected
[ 540.743129] 5.11.0-rc7+ #5 Not tainted
[ 540.743135] ------------------------------------------------------
[ 540.743142] mount/2515 is trying to acquire lock:
[ 540.743149] ffffa0c5544c2ce0 (&fs_devs->device_list_mutex){+.+.}-{4:4}, at: clone_fs_devices+0x6d/0x210 [btrfs]
[ 540.743458] but task is already holding lock:
[ 540.743461] ffffa0c54a7932b8 (btrfs-chunk-00){++++}-{4:4}, at: __btrfs_tree_read_lock+0x32/0x200 [btrfs]
[ 540.743541] which lock already depends on the new lock.
[ 540.743543] the existing dependency chain (in reverse order) is: [ 540.743546] -> #1 (btrfs-chunk-00){++++}-{4:4}:
[ 540.743566] down_read_nested+0x48/0x2b0
[ 540.743585] __btrfs_tree_read_lock+0x32/0x200 [btrfs]
[ 540.743650] btrfs_read_lock_root_node+0x70/0x200 [btrfs]
[ 540.743733] btrfs_search_slot+0x6c6/0xe00 [btrfs]
[ 540.743785] btrfs_update_device+0x83/0x260 [btrfs]
[ 540.743849] btrfs_finish_chunk_alloc+0x13f/0x660 [btrfs] <--- device_list_mutex
[ 540.743911] btrfs_create_pending_block_groups+0x18d/0x3f0 [btrfs]
[ 540.743982] btrfs_commit_transaction+0x86/0x1260 [btrfs]
[ 540.744037] btrfs_init_new_device+0x1600/0x1dd0 [btrfs]
[ 540.744101] btrfs_ioctl+0x1c77/0x24c0 [btrfs]
[ 540.744166] __x64_sys_ioctl+0xe4/0x140
[ 540.744170] do_syscall_64+0x4b/0x80
[ 540.744174] entry_SYSCALL_64_after_hwframe+0x44/0xa9 [ 540.744180] -> #0 (&fs_devs->device_list_mutex){+.+.}-{4:4}:
[ 540.744184] __lock_acquire+0x155f/0x2360
[ 540.744188] lock_acquire+0x10b/0x5c0
[ 540.744190] __mutex_lock+0xb1/0xf80
[ 540.744193] mutex_lock_nested+0x27/0x30
[ 540.744196] clone_fs_devices+0x6d/0x210 [btrfs]
[ 540.744270] btrfs_read_chunk_tree+0x3c7/0xbb0 [btrfs]
[ 540.744336] open_ctree+0xf6e/0x2074 [btrfs]
[ 540.744406] btrfs_mount_root.cold.72+0x16/0x127 [btrfs]
[ 540.744472] legacy_get_tree+0x38/0x90
[ 540.744475] vfs_get_tree+0x30/0x140
[ 540.744478] fc_mount+0x16/0x60
[ 540.744482] vfs_kern_mount+0x91/0x100
[ 540.744484] btrfs_mount+0x1e6/0x670 [btrfs]
[ 540.744536] legacy_get_tree+0x38/0x90
[ 540.744537] vfs_get_tree+0x30/0x140
[ 540.744539] path_mount+0x8d8/0x1070
[ 540.744541] do_mount+0x8d/0xc0
[ 540.744543] __x64_sys_mount+0x125/0x160
[ 540.744545] do_syscall_64+0x4b/0x80
[ 540.744547] entry_SYSCALL_64_after_hwframe+0x44/0xa9[ 540.744551] other info that might help us debug this: [ 540.744552] Possible unsafe locking scenario:
[ 540.744553] CPU0 CPU1 [ 540.744554] ---- ---- [ 540.744555] lock(btrfs-chunk-00); [ 540.744557] lock(&fs_devs->device_list_mutex); [ 540.744560] lock(btrfs-chunk-00); [ 540.744562] lock(&fs_devs->device_list_mutex); [ 540.744564] *** DEADLOCK ***
[ 540.744565] 3 locks held by mount/2515:
[ 540.744567] #0: ffffa0c56bf7a0e0 (&type->s_umount_key#42/1){+.+.}-{4:4}, at: alloc_super.isra.16+0xdf/0x450
[ 540.744574] #1: ffffffffc05a9628 (uuid_mutex){+.+.}-{4:4}, at: btrfs_read_chunk_tree+0x63/0xbb0 [btrfs]
[ 540.744640] #2: ffffa0c54a7932b8 (btrfs-chunk-00){++++}-{4:4}, at: __btrfs_tree_read_lock+0x32/0x200 [btrfs]
[ 540.744708]
stack backtrace:
[ 540.744712] CPU: 2 PID: 2515 Comm: mount Not tainted 5.11.0-rc7+ #5But the device_list_mutex in clone_fs_devices() is redundant, as explained below. Two threads [1] and [2] (below) could lead to clone_fs_device().
[1]
open_ctree <== mount sprout fs
btrfs_read_chunk_tree()
mutex_lock(&uuid_mutex) <== global lock
read_one_dev()
open_seed_devices()
clone_fs_devices() <== seed fs_devices
mutex_lock(&orig->device_list_mutex) <== seed fs_devices [2]
btrfs_init_new_device() <== sprouting
mutex_lock(&uuid_mutex); <== global lock
btrfs_prepare_sprout()
lockdep_assert_held(&uuid_mutex)
clone_fs_devices(seed_fs_device) <== seed fs_devicesBoth of these threads hold uuid_mutex which is sufficient to protect getting the seed device(s) freed while we are trying to clone it for sprouting [2] or mounting a sprout [1] (as above). A mounted seed device can not free/write/replace because it is read-only. An unmounted seed device can be freed by btrfs_free_stale_devices(), but it needs uuid_mutex. So this patch removes the unnecessary device_list_mutex in clone_fs_devices(). And adds a lockdep_assert_held(&uuid_mutex) in clone_fs_devices().
--- fs/btrfs/volumes.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
fs/btrfs/volumes.c +4 -3
@@ -742,6 +742,8 @@ static int btrfs_free_stale_devices(const char *path,struct btrfs_device *device, *tmp_device;int ret =0 ; +lockdep_assert_held (&uuid_mutex); +if (path) ret = -ENOENT ;
@@ -1181,11 +1183,12 @@ static struct btrfs_fs_devices *clone_fs_devices(struct btrfs_fs_devices *orig)struct btrfs_device *orig_dev;int ret =0 ; +lockdep_assert_held (&uuid_mutex); + fs_devices =alloc_fs_devices (orig->fsid,NULL );if (IS_ERR (fs_devices))return fs_devices; -mutex_lock (&orig->device_list_mutex); fs_devices->total_devices = orig->total_devices;list_for_each_entry (orig_dev, &orig->devices, dev_list) {
@@ -1217,10 +1220,8 @@ static struct btrfs_fs_devices *clone_fs_devices(struct btrfs_fs_devices *orig) device->fs_devices = fs_devices; fs_devices->num_devices++; } -mutex_unlock (&orig->device_list_mutex);return fs_devices; error: -mutex_unlock (&orig->device_list_mutex);free_fs_devices (fs_devices);return ERR_PTR (ret); }
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 39/50 nilfs2: fix memory leak in nilfs_sysfs_create_device_group
In reply to Greg Kroah-HartmanFrom: Nanyong Sun <[email protected]>
[ Upstream commit 5f5dec07aca7067216ed4c1342e464e7307a9197 ]
Patch series "nilfs2: fix incorrect usage of kobject".
This patchset from Nanyong Sun fixes memory leak issues and a NULL pointer dereference issue caused by incorrect usage of kboject in nilfs2 sysfs implementation.
This patch (of 6):
Reported by syzkaller:
BUG: memory leak
unreferenced object 0xffff888100ca8988 (size 8):
comm "syz-executor.1", pid 1930, jiffies 4294745569 (age 18.052s)
hex dump (first 8 bytes):
6c 6f 6f 70 31 00 ff ff loop1...
backtrace:
kstrdup+0x36/0x70 mm/util.c:60
kstrdup_const+0x35/0x60 mm/util.c:83
kvasprintf_const+0xf1/0x180 lib/kasprintf.c:48
kobject_set_name_vargs+0x56/0x150 lib/kobject.c:289
kobject_add_varg lib/kobject.c:384 [inline]
kobject_init_and_add+0xc9/0x150 lib/kobject.c:473
nilfs_sysfs_create_device_group+0x150/0x7d0 fs/nilfs2/sysfs.c:986
init_nilfs+0xa21/0xea0 fs/nilfs2/the_nilfs.c:637
nilfs_fill_super fs/nilfs2/super.c:1046 [inline]
nilfs_mount+0x7b4/0xe80 fs/nilfs2/super.c:1316
legacy_get_tree+0x105/0x210 fs/fs_context.c:592
vfs_get_tree+0x8e/0x2d0 fs/super.c:1498
do_new_mount fs/namespace.c:2905 [inline]
path_mount+0xf9b/0x1990 fs/namespace.c:3235
do_mount+0xea/0x100 fs/namespace.c:3248
__do_sys_mount fs/namespace.c:3456 [inline]
__se_sys_mount fs/namespace.c:3433 [inline]
__x64_sys_mount+0x14b/0x1f0 fs/namespace.c:3433
do_syscall_x64 arch/x86/entry/common.c:50 [inline]
do_syscall_64+0x3b/0x90 arch/x86/entry/common.c:80
entry_SYSCALL_64_after_hwframe+0x44/0xaeIf kobject_init_and_add return with error, then the cleanup of kobject is needed because memory may be allocated in kobject_init_and_add without freeing.
And the place of cleanup_dev_kobject should use kobject_put to free the memory associated with the kobject. As the section "Kobject removal" of "Documentation/core-api/kobject.rst" says, kobject_del() just makes the kobject "invisible", but it is not cleaned up. And no more cleanup will do after cleanup_dev_kobject, so kobject_put is needed here.
--- fs/nilfs2/sysfs.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
fs/nilfs2/sysfs.c +2 -4
@@ -1000,7 +1000,7 @@ int nilfs_sysfs_create_device_group(struct super_block *sb) err =kobject_init_and_add (&nilfs->ns_dev_kobj, &nilfs_dev_ktype,NULL ,"%s" , sb->s_id);if (err) - goto free_dev_subgroups; + goto cleanup_dev_kobject; err =nilfs_sysfs_create_mounted_snapshots_group (nilfs);if (err)
@@ -1037,9 +1037,7 @@ delete_mounted_snapshots_group:nilfs_sysfs_delete_mounted_snapshots_group (nilfs); cleanup_dev_kobject: -kobject_del (&nilfs->ns_dev_kobj); - -free_dev_subgroups: +kobject_put (&nilfs->ns_dev_kobj);kfree (nilfs->ns_dev_subgroups); failed_create_device_group:
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 40/50 nilfs2: fix NULL pointer in nilfs_##name##_attr_release
In reply to Greg Kroah-HartmanFrom: Nanyong Sun <[email protected]>
[ Upstream commit dbc6e7d44a514f231a64d9d5676e001b660b6448 ]
In nilfs_##name##_attr_release, kobj->parent should not be referenced because it is a NULL pointer. The release() method of kobject is always called in kobject_put(kobj), in the implementation of kobject_put(), the kobj->parent will be assigned as NULL before call the release() method. So just use kobj to get the subgroups, which is more efficient and can fix a NULL pointer reference problem.
--- fs/nilfs2/sysfs.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-)
fs/nilfs2/sysfs.c +3 -5
@@ -64,11 +64,9 @@ static const struct sysfs_ops nilfs_##name##_attr_ops = { \#define NILFS_DEV_INT_GROUP_TYPE (name, parent_name) \ static void nilfs_##name##_attr_release(struct kobject *kobj) \ { \ - struct nilfs_sysfs_##parent_name##_subgroups *subgroups; \ - struct the_nilfs *nilfs = container_of(kobj->parent, \ - struct the_nilfs, \ - ns_##parent_name##_kobj); \ - subgroups = nilfs->ns_##parent_name##_subgroups; \ + struct nilfs_sysfs_##parent_name##_subgroups *subgroups = container_of(kobj, \ + struct nilfs_sysfs_##parent_name##_subgroups, \ + sg_##name##_kobj); \ complete(&subgroups->sg_##name##_kobj_unregister); \ } \ static struct kobj_type nilfs_##name##_ktype = { \
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 41/50 nilfs2: fix memory leak in nilfs_sysfs_create_##name##_group
In reply to Greg Kroah-HartmanFrom: Nanyong Sun <[email protected]>
[ Upstream commit 24f8cb1ed057c840728167dab33b32e44147c86f ]
If kobject_init_and_add return with error, kobject_put() is needed here to avoid memory leak, because kobject_init_and_add may return error without freeing the memory associated with the kobject it allocated.
--- fs/nilfs2/sysfs.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
fs/nilfs2/sysfs.c +2 -2
@@ -92,8 +92,8 @@ static int nilfs_sysfs_create_##name##_group(struct the_nilfs *nilfs) \ err = kobject_init_and_add(kobj, &nilfs_##name##_ktype, parent, \ #name); \ if (err) \ - return err; \ - return 0; \ + kobject_put(kobj); \ + return err; \ } \ static void nilfs_sysfs_delete_##name##_group(struct the_nilfs *nilfs) \ { \
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 42/50 nilfs2: fix memory leak in nilfs_sysfs_delete_##name##_group
In reply to Greg Kroah-HartmanFrom: Nanyong Sun <[email protected]>
[ Upstream commit a3e181259ddd61fd378390977a1e4e2316853afa ]
The kobject_put() should be used to cleanup the memory associated with the kobject instead of kobject_del. See the section "Kobject removal" of "Documentation/core-api/kobject.rst".
--- fs/nilfs2/sysfs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/nilfs2/sysfs.c +1 -1
@@ -97,7 +97,7 @@ static int nilfs_sysfs_create_##name##_group(struct the_nilfs *nilfs) \ } \ static void nilfs_sysfs_delete_##name##_group(struct the_nilfs *nilfs) \ { \ - kobject_del(&nilfs->ns_##parent_name##_subgroups->sg_##name##_kobj); \ + kobject_put(&nilfs->ns_##parent_name##_subgroups->sg_##name##_kobj); \ }/************************************************************************
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 43/50 nilfs2: fix memory leak in nilfs_sysfs_create_snapshot_group
In reply to Greg Kroah-HartmanFrom: Nanyong Sun <[email protected]>
[ Upstream commit b2fe39c248f3fa4bbb2a20759b4fdd83504190f7 ]
If kobject_init_and_add returns with error, kobject_put() is needed here to avoid memory leak, because kobject_init_and_add may return error without freeing the memory associated with the kobject it allocated.
--- fs/nilfs2/sysfs.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
fs/nilfs2/sysfs.c +2 -2
@@ -208,9 +208,9 @@ int nilfs_sysfs_create_snapshot_group(struct nilfs_root *root) }if (err) -return err; +kobject_put (&root->snapshot_kobj); -return 0 ; +return err; }void nilfs_sysfs_delete_snapshot_group (struct nilfs_root *root)
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 34/50 dmaengine: ioat: depends on !UML
In reply to Greg Kroah-HartmanFrom: Johannes Berg <[email protected]>
[ Upstream commit bbac7a92a46f0876e588722ebe552ddfe6fd790f ]
Now that UML has PCI support, this driver must depend also on !UML since it pokes at X86_64 architecture internals that don't exist on ARCH=um.
--- drivers/dma/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/dma/Kconfig +1 -1
@@ -276,7 +276,7 @@ config INTEL_IDMA64 config INTEL_IOATDMA tristate "Intel I/OAT DMA support" - depends on PCI && X86_64 + depends on PCI && X86_64 && !UML select DMA_ENGINE select DMA_ENGINE_RAID select DCA
Signature · 1 line
2.33.0
Hello!
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.149 release. There are 50 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sun, 26 Sep 2021 12:43:20 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.4.149-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.4.y
and the diffstat can be found below.thanks,
greg k-h
Regressions detected.
While building mxs_defconfig for arm with GCC 8, 9, 10 and 11, the following error was encountered:
/builds/linux/arch/arm/mach-mxs/mach-mxs.c:285:26: warning: duplicate 'const' declaration specifier [-Wduplicate-decl-specifier]
285 | static const struct gpio const tx28_gpios[] __initconst = {
| ^~~~~
/builds/linux/drivers/pwm/pwm-mxs.c: In function 'mxs_pwm_probe':
/builds/linux/drivers/pwm/pwm-mxs.c:164:24: error: implicit declaration of function 'dev_err_probe'; did you mean 'device_reprobe'? [-Werror=implicit-function-declaration]
164 | return dev_err_probe(&pdev->dev, ret, "failed to reset PWM\n");
| ^~~~~~~~~~~~~
| device_reprobe cc1: some warnings being treated as errors
make[3]: *** [/builds/linux/scripts/Makefile.build:280: drivers/pwm/pwm-mxs.o] Error 1
The same problem is seen withs Clang 10, 11, 12, 13 and nightly:
/builds/linux/drivers/pwm/pwm-mxs.c:156:10: error: implicit declaration of function 'dev_err_probe' [-Werror,-Wimplicit-function-declaration]
return dev_err_probe(&pdev->dev, ret, "failed to reset PWM\n");
^
/builds/linux/drivers/pwm/pwm-mxs.c:156:10: note: did you mean 'device_reprobe'?
/builds/linux/include/linux/device.h:1565:25: note: 'device_reprobe' declared here
extern int __must_check device_reprobe(struct device *dev);
^ 1 error generated.
make[3]: *** [/builds/linux/scripts/Makefile.build:262: drivers/pwm/pwm-mxs.o] Error 1
This is also seen in other branches (from 4.4 to 5.4). To reproduce this build locally:
tuxmake \
--target-arch=arm \
--kconfig=mxs_defconfig \
--toolchain=gcc-11 \
--runtime=podman \
config default kernel xipkernel modules dtbs dtbs-legacy debugkernel headersor:
tuxmake \
--target-arch=arm \
--kconfig=mxs_defconfig \
--toolchain=clang-13 \
--runtime=podman \
config default kernel xipkernel modules dtbs dtbs-legacy debugkernel headersGreetings!
Daniel Díaz
[email protected]
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.149 release. There are 50 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sun, 26 Sep 2021 12:43:20 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.4.149-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.4.y
and the diffstat can be found below.thanks,
greg k-h
All tests passing for Tegra ...
Test results for stable-v5.4:
10 builds: 10 pass, 0 fail
26 boots: 26 pass, 0 fail
59 tests: 59 pass, 0 failLinux version: 5.4.149-rc1-g0e003dbb1df4
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,
tegra194-p2972-0000, tegra20-ventana,
tegra210-p2371-2180, tegra210-p3450-0000,
tegra30-cardhu-a04Jon
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.149 release. There are 50 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sun, 26 Sep 2021 12:43:20 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.4.149-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.4.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.149 release. There are 50 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sun, 26 Sep 2021 12:43:20 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.4.149-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.4.y
and the diffstat can be found below.thanks,
greg k-h
On ARCH_BRCMSTB using 32-bit and 64-bit ARM kernels:
Signature · 1 line
Florian