diff options
37 files changed, 147 insertions, 28 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index f6cda468095d..46bd8e033042 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -13425,9 +13425,12 @@ F:	mm/kasan/  F:	scripts/Makefile.kasan  KCONFIG +M:	Nathan Chancellor <nathan@kernel.org> +M:	Nicolas Schier <nsc@kernel.org>  L:	linux-kbuild@vger.kernel.org -S:	Orphan +S:	Odd Fixes  Q:	https://patchwork.kernel.org/project/linux-kbuild/list/ +T:	git git://git.kernel.org/pub/scm/linux/kernel/git/kbuild/linux.git  F:	Documentation/kbuild/kconfig*  F:	scripts/Kconfig.include  F:	scripts/kconfig/ @@ -2,7 +2,7 @@  VERSION = 6  PATCHLEVEL = 18  SUBLEVEL = 0 -EXTRAVERSION = -rc3 +EXTRAVERSION = -rc4  NAME = Baby Opossum Posse  # *DOCUMENTATION* diff --git a/arch/arm64/net/bpf_jit_comp.c b/arch/arm64/net/bpf_jit_comp.c index ab83089c3d8f..0c9a50a1e73e 100644 --- a/arch/arm64/net/bpf_jit_comp.c +++ b/arch/arm64/net/bpf_jit_comp.c @@ -1213,6 +1213,7 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx,  	u8 src = bpf2a64[insn->src_reg];  	const u8 tmp = bpf2a64[TMP_REG_1];  	const u8 tmp2 = bpf2a64[TMP_REG_2]; +	const u8 tmp3 = bpf2a64[TMP_REG_3];  	const u8 fp = bpf2a64[BPF_REG_FP];  	const u8 arena_vm_base = bpf2a64[ARENA_VM_START];  	const u8 priv_sp = bpf2a64[PRIVATE_SP]; @@ -1757,8 +1758,8 @@ emit_cond_jmp:  	case BPF_ST | BPF_PROBE_MEM32 | BPF_W:  	case BPF_ST | BPF_PROBE_MEM32 | BPF_DW:  		if (BPF_MODE(insn->code) == BPF_PROBE_MEM32) { -			emit(A64_ADD(1, tmp2, dst, arena_vm_base), ctx); -			dst = tmp2; +			emit(A64_ADD(1, tmp3, dst, arena_vm_base), ctx); +			dst = tmp3;  		}  		if (dst == fp) {  			dst_adj = ctx->priv_sp_used ? priv_sp : A64_SP; diff --git a/arch/x86/Makefile b/arch/x86/Makefile index 4db7e4bf69f5..8fbff3106c56 100644 --- a/arch/x86/Makefile +++ b/arch/x86/Makefile @@ -75,7 +75,7 @@ export BITS  #  #    https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53383  # -KBUILD_CFLAGS += -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -mno-avx +KBUILD_CFLAGS += -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -mno-avx -mno-sse4a  KBUILD_RUSTFLAGS += --target=$(objtree)/scripts/target.json  KBUILD_RUSTFLAGS += -Ctarget-feature=-sse,-sse2,-sse3,-ssse3,-sse4.1,-sse4.2,-avx,-avx2 diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c index 28f5468a6ea3..fe65be0b9d9c 100644 --- a/arch/x86/events/intel/core.c +++ b/arch/x86/events/intel/core.c @@ -7596,6 +7596,7 @@ __init int intel_pmu_init(void)  		break;  	case INTEL_PANTHERLAKE_L: +	case INTEL_WILDCATLAKE_L:  		pr_cont("Pantherlake Hybrid events, ");  		name = "pantherlake_hybrid";  		goto lnl_common; diff --git a/arch/x86/events/intel/ds.c b/arch/x86/events/intel/ds.c index c0b7ac1c7594..01bc59e9286c 100644 --- a/arch/x86/events/intel/ds.c +++ b/arch/x86/events/intel/ds.c @@ -317,7 +317,8 @@ static u64 __grt_latency_data(struct perf_event *event, u64 status,  {  	u64 val; -	WARN_ON_ONCE(hybrid_pmu(event->pmu)->pmu_type == hybrid_big); +	WARN_ON_ONCE(is_hybrid() && +		     hybrid_pmu(event->pmu)->pmu_type == hybrid_big);  	dse &= PERF_PEBS_DATA_SOURCE_GRT_MASK;  	val = hybrid_var(event->pmu, pebs_data_source)[dse]; diff --git a/arch/x86/events/intel/uncore.c b/arch/x86/events/intel/uncore.c index a762f7f5b161..d6c945cc5d07 100644 --- a/arch/x86/events/intel/uncore.c +++ b/arch/x86/events/intel/uncore.c @@ -1895,6 +1895,7 @@ static const struct x86_cpu_id intel_uncore_match[] __initconst = {  	X86_MATCH_VFM(INTEL_ARROWLAKE_H,	&mtl_uncore_init),  	X86_MATCH_VFM(INTEL_LUNARLAKE_M,	&lnl_uncore_init),  	X86_MATCH_VFM(INTEL_PANTHERLAKE_L,	&ptl_uncore_init), +	X86_MATCH_VFM(INTEL_WILDCATLAKE_L,	&ptl_uncore_init),  	X86_MATCH_VFM(INTEL_SAPPHIRERAPIDS_X,	&spr_uncore_init),  	X86_MATCH_VFM(INTEL_EMERALDRAPIDS_X,	&spr_uncore_init),  	X86_MATCH_VFM(INTEL_GRANITERAPIDS_X,	&gnr_uncore_init), diff --git a/arch/x86/include/asm/intel-family.h b/arch/x86/include/asm/intel-family.h index f32a0eca2ae5..950bfd006905 100644 --- a/arch/x86/include/asm/intel-family.h +++ b/arch/x86/include/asm/intel-family.h @@ -150,12 +150,12 @@  #define INTEL_LUNARLAKE_M		IFM(6, 0xBD) /* Lion Cove / Skymont */ -#define INTEL_PANTHERLAKE_L		IFM(6, 0xCC) /* Cougar Cove / Crestmont */ +#define INTEL_PANTHERLAKE_L		IFM(6, 0xCC) /* Cougar Cove / Darkmont */  #define INTEL_WILDCATLAKE_L		IFM(6, 0xD5) -#define INTEL_NOVALAKE			IFM(18, 0x01) -#define INTEL_NOVALAKE_L		IFM(18, 0x03) +#define INTEL_NOVALAKE			IFM(18, 0x01) /* Coyote Cove / Arctic Wolf */ +#define INTEL_NOVALAKE_L		IFM(18, 0x03) /* Coyote Cove / Arctic Wolf */  /* "Small Core" Processors (Atom/E-Core) */ diff --git a/arch/x86/include/asm/page_64.h b/arch/x86/include/asm/page_64.h index 015d23f3e01f..53f4089333f2 100644 --- a/arch/x86/include/asm/page_64.h +++ b/arch/x86/include/asm/page_64.h @@ -43,6 +43,9 @@ extern unsigned long __phys_addr_symbol(unsigned long);  void clear_page_orig(void *page);  void clear_page_rep(void *page);  void clear_page_erms(void *page); +KCFI_REFERENCE(clear_page_orig); +KCFI_REFERENCE(clear_page_rep); +KCFI_REFERENCE(clear_page_erms);  static inline void clear_page(void *page)  { diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index ccaa51ce63f6..8e36964a7721 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c @@ -516,7 +516,7 @@ static void bsp_init_amd(struct cpuinfo_x86 *c)  			setup_force_cpu_cap(X86_FEATURE_ZEN5);  			break;  		case 0x50 ... 0x5f: -		case 0x90 ... 0xaf: +		case 0x80 ... 0xaf:  		case 0xc0 ... 0xcf:  			setup_force_cpu_cap(X86_FEATURE_ZEN6);  			break; @@ -1035,8 +1035,18 @@ static void init_amd_zen4(struct cpuinfo_x86 *c)  	}  } +static const struct x86_cpu_id zen5_rdseed_microcode[] = { +	ZEN_MODEL_STEP_UCODE(0x1a, 0x02, 0x1, 0x0b00215a), +	ZEN_MODEL_STEP_UCODE(0x1a, 0x11, 0x0, 0x0b101054), +}; +  static void init_amd_zen5(struct cpuinfo_x86 *c)  { +	if (!x86_match_min_microcode_rev(zen5_rdseed_microcode)) { +		clear_cpu_cap(c, X86_FEATURE_RDSEED); +		msr_clear_bit(MSR_AMD64_CPUID_FN_7, 18); +		pr_emerg_once("RDSEED32 is broken. Disabling the corresponding CPUID bit.\n"); +	}  }  static void init_amd(struct cpuinfo_x86 *c) diff --git a/arch/x86/kernel/cpu/microcode/amd.c b/arch/x86/kernel/cpu/microcode/amd.c index 28ed8c089024..b7c797dc94f4 100644 --- a/arch/x86/kernel/cpu/microcode/amd.c +++ b/arch/x86/kernel/cpu/microcode/amd.c @@ -233,13 +233,31 @@ static bool need_sha_check(u32 cur_rev)  	return true;  } +static bool cpu_has_entrysign(void) +{ +	unsigned int fam   = x86_family(bsp_cpuid_1_eax); +	unsigned int model = x86_model(bsp_cpuid_1_eax); + +	if (fam == 0x17 || fam == 0x19) +		return true; + +	if (fam == 0x1a) { +		if (model <= 0x2f || +		    (0x40 <= model && model <= 0x4f) || +		    (0x60 <= model && model <= 0x6f)) +			return true; +	} + +	return false; +} +  static bool verify_sha256_digest(u32 patch_id, u32 cur_rev, const u8 *data, unsigned int len)  {  	struct patch_digest *pd = NULL;  	u8 digest[SHA256_DIGEST_SIZE];  	int i; -	if (x86_family(bsp_cpuid_1_eax) < 0x17) +	if (!cpu_has_entrysign())  		return true;  	if (!need_sha_check(cur_rev)) diff --git a/arch/x86/kernel/fpu/core.c b/arch/x86/kernel/fpu/core.c index 1f71cc135e9a..e88eacb1b5bb 100644 --- a/arch/x86/kernel/fpu/core.c +++ b/arch/x86/kernel/fpu/core.c @@ -825,6 +825,9 @@ void fpu__clear_user_states(struct fpu *fpu)  	    !fpregs_state_valid(fpu, smp_processor_id()))  		os_xrstor_supervisor(fpu->fpstate); +	/* Ensure XFD state is in sync before reloading XSTATE */ +	xfd_update_state(fpu->fpstate); +  	/* Reset user states in registers. */  	restore_fpregs_from_init_fpstate(XFEATURE_MASK_USER_RESTORE); diff --git a/arch/x86/net/bpf_jit_comp.c b/arch/x86/net/bpf_jit_comp.c index d4c93d9e73e4..de5083cb1d37 100644 --- a/arch/x86/net/bpf_jit_comp.c +++ b/arch/x86/net/bpf_jit_comp.c @@ -2701,7 +2701,7 @@ emit_jmp:  			/* Update cleanup_addr */  			ctx->cleanup_addr = proglen;  			if (bpf_prog_was_classic(bpf_prog) && -			    !capable(CAP_SYS_ADMIN)) { +			    !ns_capable_noaudit(&init_user_ns, CAP_SYS_ADMIN)) {  				u8 *ip = image + addrs[i - 1];  				if (emit_spectre_bhb_barrier(&prog, ip, bpf_prog)) diff --git a/drivers/base/regmap/regmap-slimbus.c b/drivers/base/regmap/regmap-slimbus.c index 54eb7d227cf4..e523fae73004 100644 --- a/drivers/base/regmap/regmap-slimbus.c +++ b/drivers/base/regmap/regmap-slimbus.c @@ -48,8 +48,7 @@ struct regmap *__regmap_init_slimbus(struct slim_device *slimbus,  	if (IS_ERR(bus))  		return ERR_CAST(bus); -	return __regmap_init(&slimbus->dev, bus, &slimbus->dev, config, -			     lock_key, lock_name); +	return __regmap_init(&slimbus->dev, bus, slimbus, config, lock_key, lock_name);  }  EXPORT_SYMBOL_GPL(__regmap_init_slimbus); @@ -63,8 +62,7 @@ struct regmap *__devm_regmap_init_slimbus(struct slim_device *slimbus,  	if (IS_ERR(bus))  		return ERR_CAST(bus); -	return __devm_regmap_init(&slimbus->dev, bus, &slimbus, config, -				  lock_key, lock_name); +	return __devm_regmap_init(&slimbus->dev, bus, slimbus, config, lock_key, lock_name);  }  EXPORT_SYMBOL_GPL(__devm_regmap_init_slimbus); diff --git a/drivers/edac/versalnet_edac.c b/drivers/edac/versalnet_edac.c index 7c5db8bf0595..1ded4c3f0213 100644 --- a/drivers/edac/versalnet_edac.c +++ b/drivers/edac/versalnet_edac.c @@ -433,7 +433,7 @@ static void handle_error(struct mc_priv  *priv, struct ecc_status *stat,  	phys_addr_t pfn;  	int err; -	if (WARN_ON_ONCE(ctl_num > NUM_CONTROLLERS)) +	if (WARN_ON_ONCE(ctl_num >= NUM_CONTROLLERS))  		return;  	mci = priv->mci[ctl_num]; diff --git a/drivers/regulator/bd718x7-regulator.c b/drivers/regulator/bd718x7-regulator.c index 022d98f3c32a..ea9c4058ee6a 100644 --- a/drivers/regulator/bd718x7-regulator.c +++ b/drivers/regulator/bd718x7-regulator.c @@ -1613,6 +1613,8 @@ static int setup_feedback_loop(struct device *dev, struct device_node *np,  				step /= r1;  				new[j].min = min; +				new[j].min_sel = desc->linear_ranges[j].min_sel; +				new[j].max_sel = desc->linear_ranges[j].max_sel;  				new[j].step = step;  				dev_dbg(dev, "%s: old range min %d, step %d\n", diff --git a/drivers/spi/spi-intel-pci.c b/drivers/spi/spi-intel-pci.c index 7765fb27c37c..b8c572394aac 100644 --- a/drivers/spi/spi-intel-pci.c +++ b/drivers/spi/spi-intel-pci.c @@ -80,6 +80,7 @@ static const struct pci_device_id intel_spi_pci_ids[] = {  	{ PCI_VDEVICE(INTEL, 0x51a4), (unsigned long)&cnl_info },  	{ PCI_VDEVICE(INTEL, 0x54a4), (unsigned long)&cnl_info },  	{ PCI_VDEVICE(INTEL, 0x5794), (unsigned long)&cnl_info }, +	{ PCI_VDEVICE(INTEL, 0x5825), (unsigned long)&cnl_info },  	{ PCI_VDEVICE(INTEL, 0x7723), (unsigned long)&cnl_info },  	{ PCI_VDEVICE(INTEL, 0x7a24), (unsigned long)&cnl_info },  	{ PCI_VDEVICE(INTEL, 0x7aa4), (unsigned long)&cnl_info }, diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 755ec6dfd51c..23273d0e6f22 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c @@ -2228,6 +2228,14 @@ static noinline_for_stack void write_one_eb(struct extent_buffer *eb,  		wbc_account_cgroup_owner(wbc, folio, range_len);  		folio_unlock(folio);  	} +	/* +	 * If the fs is already in error status, do not submit any writeback +	 * but immediately finish it. +	 */ +	if (unlikely(BTRFS_FS_ERROR(fs_info))) { +		btrfs_bio_end_io(bbio, errno_to_blk_status(BTRFS_FS_ERROR(fs_info))); +		return; +	}  	btrfs_submit_bbio(bbio, 0);  } diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index 7efd1f8a1912..fa82def46e39 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c @@ -2854,12 +2854,22 @@ static int btrfs_fallocate_update_isize(struct inode *inode,  {  	struct btrfs_trans_handle *trans;  	struct btrfs_root *root = BTRFS_I(inode)->root; +	u64 range_start; +	u64 range_end;  	int ret;  	int ret2;  	if (mode & FALLOC_FL_KEEP_SIZE || end <= i_size_read(inode))  		return 0; +	range_start = round_down(i_size_read(inode), root->fs_info->sectorsize); +	range_end = round_up(end, root->fs_info->sectorsize); + +	ret = btrfs_inode_set_file_extent_range(BTRFS_I(inode), range_start, +						range_end - range_start); +	if (ret) +		return ret; +  	trans = btrfs_start_transaction(root, 1);  	if (IS_ERR(trans))  		return PTR_ERR(trans); diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 3b1b3a0553ee..3df5f36185a0 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -6873,7 +6873,6 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir,  	BTRFS_I(inode)->dir_index = 0ULL;  	inode_inc_iversion(inode);  	inode_set_ctime_current(inode); -	set_bit(BTRFS_INODE_COPY_EVERYTHING, &BTRFS_I(inode)->runtime_flags);  	ret = btrfs_add_link(trans, BTRFS_I(dir), BTRFS_I(inode),  			     &fname.disk_name, 1, index); diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c index 1175b8192cd7..31ad8580322a 100644 --- a/fs/btrfs/qgroup.c +++ b/fs/btrfs/qgroup.c @@ -1539,8 +1539,10 @@ int btrfs_add_qgroup_relation(struct btrfs_trans_handle *trans, u64 src, u64 dst  	ASSERT(prealloc);  	/* Check the level of src and dst first */ -	if (btrfs_qgroup_level(src) >= btrfs_qgroup_level(dst)) +	if (btrfs_qgroup_level(src) >= btrfs_qgroup_level(dst)) { +		kfree(prealloc);  		return -EINVAL; +	}  	mutex_lock(&fs_info->qgroup_ioctl_lock);  	if (!fs_info->quota_root) { diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index 621e0df097e3..c90b2d2cb08f 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c @@ -7910,6 +7910,9 @@ void btrfs_log_new_name(struct btrfs_trans_handle *trans,  	bool log_pinned = false;  	int ret; +	/* The inode has a new name (ref/extref), so make sure we log it. */ +	set_bit(BTRFS_INODE_COPY_EVERYTHING, &inode->runtime_flags); +  	btrfs_init_log_ctx(&ctx, inode);  	ctx.logging_new_name = true; diff --git a/fs/xfs/libxfs/xfs_rtgroup.h b/fs/xfs/libxfs/xfs_rtgroup.h index d36a6ae0abe5..d4fcf591e63d 100644 --- a/fs/xfs/libxfs/xfs_rtgroup.h +++ b/fs/xfs/libxfs/xfs_rtgroup.h @@ -50,6 +50,12 @@ struct xfs_rtgroup {  		uint8_t			*rtg_rsum_cache;  		struct xfs_open_zone	*rtg_open_zone;  	}; + +	/* +	 * Count of outstanding GC operations for zoned XFS.  Any RTG with a +	 * non-zero rtg_gccount will not be picked as new GC victim. +	 */ +	atomic_t		rtg_gccount;  };  /* diff --git a/fs/xfs/xfs_zone_alloc.c b/fs/xfs/xfs_zone_alloc.c index 23cdab4515bb..040402240807 100644 --- a/fs/xfs/xfs_zone_alloc.c +++ b/fs/xfs/xfs_zone_alloc.c @@ -246,6 +246,14 @@ xfs_zoned_map_extent(  	 * If a data write raced with this GC write, keep the existing data in  	 * the data fork, mark our newly written GC extent as reclaimable, then  	 * move on to the next extent. +	 * +	 * Note that this can also happen when racing with operations that do +	 * not actually invalidate the data, but just move it to a different +	 * inode (XFS_IOC_EXCHANGE_RANGE), or to a different offset inside the +	 * inode (FALLOC_FL_COLLAPSE_RANGE / FALLOC_FL_INSERT_RANGE).  If the +	 * data was just moved around, GC fails to free the zone, but the zone +	 * becomes a GC candidate again as soon as all previous GC I/O has +	 * finished and these blocks will be moved out eventually.  	 */  	if (old_startblock != NULLFSBLOCK &&  	    old_startblock != data.br_startblock) diff --git a/fs/xfs/xfs_zone_gc.c b/fs/xfs/xfs_zone_gc.c index 109877d9a6bf..4ade54445532 100644 --- a/fs/xfs/xfs_zone_gc.c +++ b/fs/xfs/xfs_zone_gc.c @@ -114,6 +114,8 @@ struct xfs_gc_bio {  	/* Open Zone being written to */  	struct xfs_open_zone		*oz; +	struct xfs_rtgroup		*victim_rtg; +  	/* Bio used for reads and writes, including the bvec used by it */  	struct bio_vec			bv;  	struct bio			bio;	/* must be last */ @@ -264,6 +266,7 @@ xfs_zone_gc_iter_init(  	iter->rec_count = 0;  	iter->rec_idx = 0;  	iter->victim_rtg = victim_rtg; +	atomic_inc(&victim_rtg->rtg_gccount);  }  /* @@ -362,6 +365,7 @@ xfs_zone_gc_query(  	return 0;  done: +	atomic_dec(&iter->victim_rtg->rtg_gccount);  	xfs_rtgroup_rele(iter->victim_rtg);  	iter->victim_rtg = NULL;  	return 0; @@ -451,6 +455,20 @@ xfs_zone_gc_pick_victim_from(  		if (!rtg)  			continue; +		/* +		 * If the zone is already undergoing GC, don't pick it again. +		 * +		 * This prevents us from picking one of the zones for which we +		 * already submitted GC I/O, but for which the remapping hasn't +		 * concluded yet.  This won't cause data corruption, but +		 * increases write amplification and slows down GC, so this is +		 * a bad thing. +		 */ +		if (atomic_read(&rtg->rtg_gccount)) { +			xfs_rtgroup_rele(rtg); +			continue; +		} +  		/* skip zones that are just waiting for a reset */  		if (rtg_rmap(rtg)->i_used_blocks == 0 ||  		    rtg_rmap(rtg)->i_used_blocks >= victim_used) { @@ -688,6 +706,9 @@ xfs_zone_gc_start_chunk(  	chunk->scratch = &data->scratch[data->scratch_idx];  	chunk->data = data;  	chunk->oz = oz; +	chunk->victim_rtg = iter->victim_rtg; +	atomic_inc(&chunk->victim_rtg->rtg_group.xg_active_ref); +	atomic_inc(&chunk->victim_rtg->rtg_gccount);  	bio->bi_iter.bi_sector = xfs_rtb_to_daddr(mp, chunk->old_startblock);  	bio->bi_end_io = xfs_zone_gc_end_io; @@ -710,6 +731,8 @@ static void  xfs_zone_gc_free_chunk(  	struct xfs_gc_bio	*chunk)  { +	atomic_dec(&chunk->victim_rtg->rtg_gccount); +	xfs_rtgroup_rele(chunk->victim_rtg);  	list_del(&chunk->entry);  	xfs_open_zone_put(chunk->oz);  	xfs_irele(chunk->ip); @@ -770,6 +793,10 @@ xfs_zone_gc_split_write(  	split_chunk->oz = chunk->oz;  	atomic_inc(&chunk->oz->oz_ref); +	split_chunk->victim_rtg = chunk->victim_rtg; +	atomic_inc(&chunk->victim_rtg->rtg_group.xg_active_ref); +	atomic_inc(&chunk->victim_rtg->rtg_gccount); +  	chunk->offset += split_len;  	chunk->len -= split_len;  	chunk->old_startblock += XFS_B_TO_FSB(data->mp, split_len); diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index 8a9a2e732a65..e04d56a5332e 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h @@ -832,7 +832,7 @@ defined(CONFIG_AUTOFDO_CLANG) || defined(CONFIG_PROPELLER_CLANG)  /* Required sections not related to debugging. */  #define ELF_DETAILS							\ -		.modinfo : { *(.modinfo) }				\ +		.modinfo : { *(.modinfo) . = ALIGN(8); }		\  		.comment 0 : { *(.comment) }				\  		.symtab 0 : { *(.symtab) }				\  		.strtab 0 : { *(.strtab) }				\ diff --git a/include/linux/regmap.h b/include/linux/regmap.h index 4e1ac1fbcec4..55343795644b 100644 --- a/include/linux/regmap.h +++ b/include/linux/regmap.h @@ -1643,7 +1643,7 @@ struct regmap_irq_chip_data;   * @status_invert: Inverted status register: cleared bits are active interrupts.   * @status_is_level: Status register is actuall signal level: Xor status   *		     register with previous value to get active interrupts. - * @wake_invert: Inverted wake register: cleared bits are wake enabled. + * @wake_invert: Inverted wake register: cleared bits are wake disabled.   * @type_in_mask: Use the mask registers for controlling irq type. Use this if   *		  the hardware provides separate bits for rising/falling edge   *		  or low/high level interrupts and they should be combined into diff --git a/include/linux/sched.h b/include/linux/sched.h index cbb7340c5866..b469878de25c 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -2407,12 +2407,12 @@ static inline void __migrate_enable(void) { }   * be defined in kernel/sched/core.c.   */  #ifndef INSTANTIATE_EXPORTED_MIGRATE_DISABLE -static inline void migrate_disable(void) +static __always_inline void migrate_disable(void)  {  	__migrate_disable();  } -static inline void migrate_enable(void) +static __always_inline void migrate_enable(void)  {  	__migrate_enable();  } diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c index 8eb117c52817..eb25e70e0bdc 100644 --- a/kernel/bpf/helpers.c +++ b/kernel/bpf/helpers.c @@ -4345,6 +4345,7 @@ BTF_ID_FLAGS(func, bpf_iter_kmem_cache_next, KF_ITER_NEXT | KF_RET_NULL | KF_SLE  BTF_ID_FLAGS(func, bpf_iter_kmem_cache_destroy, KF_ITER_DESTROY | KF_SLEEPABLE)  BTF_ID_FLAGS(func, bpf_local_irq_save)  BTF_ID_FLAGS(func, bpf_local_irq_restore) +#ifdef CONFIG_BPF_EVENTS  BTF_ID_FLAGS(func, bpf_probe_read_user_dynptr)  BTF_ID_FLAGS(func, bpf_probe_read_kernel_dynptr)  BTF_ID_FLAGS(func, bpf_probe_read_user_str_dynptr) @@ -4353,6 +4354,7 @@ BTF_ID_FLAGS(func, bpf_copy_from_user_dynptr, KF_SLEEPABLE)  BTF_ID_FLAGS(func, bpf_copy_from_user_str_dynptr, KF_SLEEPABLE)  BTF_ID_FLAGS(func, bpf_copy_from_user_task_dynptr, KF_SLEEPABLE | KF_TRUSTED_ARGS)  BTF_ID_FLAGS(func, bpf_copy_from_user_task_str_dynptr, KF_SLEEPABLE | KF_TRUSTED_ARGS) +#endif  #ifdef CONFIG_DMA_SHARED_BUFFER  BTF_ID_FLAGS(func, bpf_iter_dmabuf_new, KF_ITER_NEW | KF_SLEEPABLE)  BTF_ID_FLAGS(func, bpf_iter_dmabuf_next, KF_ITER_NEXT | KF_RET_NULL | KF_SLEEPABLE) diff --git a/kernel/bpf/ringbuf.c b/kernel/bpf/ringbuf.c index 719d73299397..d706c4b7f532 100644 --- a/kernel/bpf/ringbuf.c +++ b/kernel/bpf/ringbuf.c @@ -216,6 +216,8 @@ static struct bpf_map *ringbuf_map_alloc(union bpf_attr *attr)  static void bpf_ringbuf_free(struct bpf_ringbuf *rb)  { +	irq_work_sync(&rb->work); +  	/* copy pages pointer and nr_pages to local variable, as we are going  	 * to unmap rb itself with vunmap() below  	 */ diff --git a/lib/Kconfig.kmsan b/lib/Kconfig.kmsan index 7251b6b59e69..cae1ddcc18e1 100644 --- a/lib/Kconfig.kmsan +++ b/lib/Kconfig.kmsan @@ -3,7 +3,7 @@ config HAVE_ARCH_KMSAN  	bool  config HAVE_KMSAN_COMPILER -	def_bool CC_IS_CLANG +	def_bool $(cc-option,-fsanitize=kernel-memory)  config KMSAN  	bool "KMSAN: detector of uninitialized values use" diff --git a/net/core/filter.c b/net/core/filter.c index 76628df1fc82..fa06c5a08e22 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -3877,7 +3877,8 @@ static inline int __bpf_skb_change_head(struct sk_buff *skb, u32 head_room,  	u32 new_len = skb->len + head_room;  	int ret; -	if (unlikely(flags || (!skb_is_gso(skb) && new_len > max_len) || +	if (unlikely(flags || (int)head_room < 0 || +		     (!skb_is_gso(skb) && new_len > max_len) ||  		     new_len < skb->len))  		return -EINVAL; diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c index 84ea9215c0a7..b8b7bba84a65 100644 --- a/scripts/kconfig/mconf.c +++ b/scripts/kconfig/mconf.c @@ -12,6 +12,7 @@  #include <errno.h>  #include <fcntl.h>  #include <limits.h> +#include <locale.h>  #include <stdarg.h>  #include <stdlib.h>  #include <string.h> @@ -931,6 +932,8 @@ int main(int ac, char **av)  	signal(SIGINT, sig_handler); +	setlocale(LC_ALL, ""); +  	if (ac > 1 && strcmp(av[1], "-s") == 0) {  		silent = 1;  		/* Silence conf_read() until the real callback is set up */ diff --git a/scripts/kconfig/nconf.c b/scripts/kconfig/nconf.c index ae1fe5f60327..521700ed7152 100644 --- a/scripts/kconfig/nconf.c +++ b/scripts/kconfig/nconf.c @@ -7,6 +7,7 @@  #ifndef _GNU_SOURCE  #define _GNU_SOURCE  #endif +#include <locale.h>  #include <string.h>  #include <strings.h>  #include <stdlib.h> @@ -1478,6 +1479,8 @@ int main(int ac, char **av)  	int lines, columns;  	char *mode; +	setlocale(LC_ALL, ""); +  	if (ac > 1 && strcmp(av[1], "-s") == 0) {  		/* Silence conf_read() until the real callback is set up */  		conf_set_message_callback(NULL); diff --git a/scripts/package/install-extmod-build b/scripts/package/install-extmod-build index b96538787f3d..054fdf45cc37 100755 --- a/scripts/package/install-extmod-build +++ b/scripts/package/install-extmod-build @@ -63,7 +63,7 @@ if [ "${CC}" != "${HOSTCC}" ]; then  	# Clear VPATH and srcroot because the source files reside in the output  	# directory.  	# shellcheck disable=SC2016 # $(MAKE) and $(build) will be expanded by Make -	"${MAKE}" run-command KBUILD_RUN_COMMAND='+$(MAKE) HOSTCC='"${CC}"' VPATH= srcroot=. $(build)='"$(realpath --relative-base=. "${destdir}")"/scripts +	"${MAKE}" run-command KBUILD_RUN_COMMAND='+$(MAKE) HOSTCC='"${CC}"' VPATH= srcroot=. $(build)='"$(realpath --relative-to=. "${destdir}")"/scripts  	rm -f "${destdir}/scripts/Kbuild"  fi diff --git a/tools/lib/bpf/bpf_tracing.h b/tools/lib/bpf/bpf_tracing.h index a8f6cd4841b0..dbe32a5d02cd 100644 --- a/tools/lib/bpf/bpf_tracing.h +++ b/tools/lib/bpf/bpf_tracing.h @@ -311,7 +311,7 @@ struct pt_regs___arm64 {  #define __PT_RET_REG regs[31]  #define __PT_FP_REG __unsupported__  #define __PT_RC_REG gpr[3] -#define __PT_SP_REG sp +#define __PT_SP_REG gpr[1]  #define __PT_IP_REG nip  #elif defined(bpf_target_sparc) diff --git a/tools/objtool/check.c b/tools/objtool/check.c index 620854fdaaf6..9004fbc06769 100644 --- a/tools/objtool/check.c +++ b/tools/objtool/check.c @@ -3516,8 +3516,11 @@ static bool skip_alt_group(struct instruction *insn)  {  	struct instruction *alt_insn = insn->alts ? insn->alts->insn : NULL; +	if (!insn->alt_group) +		return false; +  	/* ANNOTATE_IGNORE_ALTERNATIVE */ -	if (insn->alt_group && insn->alt_group->ignore) +	if (insn->alt_group->ignore)  		return true;  	/*  | 
