diff options
Diffstat (limited to 'include')
61 files changed, 391 insertions, 111 deletions
| diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h index 0584e9f6e339..57acb895c038 100644 --- a/include/acpi/acpi_bus.h +++ b/include/acpi/acpi_bus.h @@ -657,6 +657,7 @@ static inline bool acpi_quirk_skip_acpi_ac_and_battery(void)  #if IS_ENABLED(CONFIG_X86_ANDROID_TABLETS)  bool acpi_quirk_skip_i2c_client_enumeration(struct acpi_device *adev);  int acpi_quirk_skip_serdev_enumeration(struct device *controller_parent, bool *skip); +bool acpi_quirk_skip_gpio_event_handlers(void);  #else  static inline bool acpi_quirk_skip_i2c_client_enumeration(struct acpi_device *adev)  { @@ -668,6 +669,10 @@ acpi_quirk_skip_serdev_enumeration(struct device *controller_parent, bool *skip)  	*skip = false;  	return 0;  } +static inline bool acpi_quirk_skip_gpio_event_handlers(void) +{ +	return false; +}  #endif  #ifdef CONFIG_PM diff --git a/include/acpi/video.h b/include/acpi/video.h index 8ed9bec03e53..ff5a8da5d883 100644 --- a/include/acpi/video.h +++ b/include/acpi/video.h @@ -59,8 +59,6 @@ extern void acpi_video_unregister(void);  extern void acpi_video_register_backlight(void);  extern int acpi_video_get_edid(struct acpi_device *device, int type,  			       int device_id, void **edid); -extern enum acpi_backlight_type acpi_video_get_backlight_type(void); -extern bool acpi_video_backlight_use_native(void);  /*   * Note: The value returned by acpi_video_handles_brightness_key_presses()   * may change over time and should not be cached. @@ -69,6 +67,19 @@ extern bool acpi_video_handles_brightness_key_presses(void);  extern int acpi_video_get_levels(struct acpi_device *device,  				 struct acpi_video_device_brightness **dev_br,  				 int *pmax_level); + +extern enum acpi_backlight_type __acpi_video_get_backlight_type(bool native, +								bool *auto_detect); + +static inline enum acpi_backlight_type acpi_video_get_backlight_type(void) +{ +	return __acpi_video_get_backlight_type(false, NULL); +} + +static inline bool acpi_video_backlight_use_native(void) +{ +	return __acpi_video_get_backlight_type(true, NULL) == acpi_backlight_native; +}  #else  static inline void acpi_video_report_nolcd(void) { return; };  static inline int acpi_video_register(void) { return -ENODEV; } diff --git a/include/asm-generic/atomic.h b/include/asm-generic/atomic.h index 04b8be9f1a77..e271d6708c87 100644 --- a/include/asm-generic/atomic.h +++ b/include/asm-generic/atomic.h @@ -130,7 +130,7 @@ ATOMIC_OP(xor, ^)  #define arch_atomic_read(v)			READ_ONCE((v)->counter)  #define arch_atomic_set(v, i)			WRITE_ONCE(((v)->counter), (i)) -#define arch_atomic_xchg(ptr, v)		(arch_xchg(&(ptr)->counter, (v))) -#define arch_atomic_cmpxchg(v, old, new)	(arch_cmpxchg(&((v)->counter), (old), (new))) +#define arch_atomic_xchg(ptr, v)		(arch_xchg(&(ptr)->counter, (u32)(v))) +#define arch_atomic_cmpxchg(v, old, new)	(arch_cmpxchg(&((v)->counter), (u32)(old), (u32)(new)))  #endif /* __ASM_GENERIC_ATOMIC_H */ diff --git a/include/asm-generic/cmpxchg-local.h b/include/asm-generic/cmpxchg-local.h index c3e7315b7c1d..3df9f59a544e 100644 --- a/include/asm-generic/cmpxchg-local.h +++ b/include/asm-generic/cmpxchg-local.h @@ -26,16 +26,16 @@ static inline unsigned long __generic_cmpxchg_local(volatile void *ptr,  	raw_local_irq_save(flags);  	switch (size) {  	case 1: prev = *(u8 *)ptr; -		if (prev == (u8)old) -			*(u8 *)ptr = (u8)new; +		if (prev == (old & 0xffu)) +			*(u8 *)ptr = (new & 0xffu);  		break;  	case 2: prev = *(u16 *)ptr; -		if (prev == (u16)old) -			*(u16 *)ptr = (u16)new; +		if (prev == (old & 0xffffu)) +			*(u16 *)ptr = (new & 0xffffu);  		break;  	case 4: prev = *(u32 *)ptr; -		if (prev == (u32)old) -			*(u32 *)ptr = (u32)new; +		if (prev == (old & 0xffffffffffu)) +			*(u32 *)ptr = (new & 0xffffffffu);  		break;  	case 8: prev = *(u64 *)ptr;  		if (prev == old) diff --git a/include/asm-generic/cmpxchg.h b/include/asm-generic/cmpxchg.h index dca4419922a9..848de25fc4bf 100644 --- a/include/asm-generic/cmpxchg.h +++ b/include/asm-generic/cmpxchg.h @@ -32,7 +32,7 @@ unsigned long __generic_xchg(unsigned long x, volatile void *ptr, int size)  #else  		local_irq_save(flags);  		ret = *(volatile u8 *)ptr; -		*(volatile u8 *)ptr = x; +		*(volatile u8 *)ptr = (x & 0xffu);  		local_irq_restore(flags);  		return ret;  #endif /* __xchg_u8 */ @@ -43,7 +43,7 @@ unsigned long __generic_xchg(unsigned long x, volatile void *ptr, int size)  #else  		local_irq_save(flags);  		ret = *(volatile u16 *)ptr; -		*(volatile u16 *)ptr = x; +		*(volatile u16 *)ptr = (x & 0xffffu);  		local_irq_restore(flags);  		return ret;  #endif /* __xchg_u16 */ @@ -54,7 +54,7 @@ unsigned long __generic_xchg(unsigned long x, volatile void *ptr, int size)  #else  		local_irq_save(flags);  		ret = *(volatile u32 *)ptr; -		*(volatile u32 *)ptr = x; +		*(volatile u32 *)ptr = (x & 0xffffffffu);  		local_irq_restore(flags);  		return ret;  #endif /* __xchg_u32 */ diff --git a/include/asm-generic/io.h b/include/asm-generic/io.h index 4c44a29b5e8e..587e7e9b9a37 100644 --- a/include/asm-generic/io.h +++ b/include/asm-generic/io.h @@ -236,7 +236,7 @@ static inline u64 readq(const volatile void __iomem *addr)  	log_read_mmio(64, addr, _THIS_IP_, _RET_IP_);  	__io_br(); -	val = __le64_to_cpu(__raw_readq(addr)); +	val = __le64_to_cpu((__le64 __force)__raw_readq(addr));  	__io_ar(val);  	log_post_read_mmio(val, 64, addr, _THIS_IP_, _RET_IP_);  	return val; @@ -287,7 +287,7 @@ static inline void writeq(u64 value, volatile void __iomem *addr)  {  	log_write_mmio(value, 64, addr, _THIS_IP_, _RET_IP_);  	__io_bw(); -	__raw_writeq(__cpu_to_le64(value), addr); +	__raw_writeq((u64 __force)__cpu_to_le64(value), addr);  	__io_aw();  	log_post_write_mmio(value, 64, addr, _THIS_IP_, _RET_IP_);  } @@ -319,7 +319,7 @@ static inline u16 readw_relaxed(const volatile void __iomem *addr)  	u16 val;  	log_read_mmio(16, addr, _THIS_IP_, _RET_IP_); -	val = __le16_to_cpu(__raw_readw(addr)); +	val = __le16_to_cpu((__le16 __force)__raw_readw(addr));  	log_post_read_mmio(val, 16, addr, _THIS_IP_, _RET_IP_);  	return val;  } @@ -332,7 +332,7 @@ static inline u32 readl_relaxed(const volatile void __iomem *addr)  	u32 val;  	log_read_mmio(32, addr, _THIS_IP_, _RET_IP_); -	val = __le32_to_cpu(__raw_readl(addr)); +	val = __le32_to_cpu((__le32 __force)__raw_readl(addr));  	log_post_read_mmio(val, 32, addr, _THIS_IP_, _RET_IP_);  	return val;  } @@ -345,7 +345,7 @@ static inline u64 readq_relaxed(const volatile void __iomem *addr)  	u64 val;  	log_read_mmio(64, addr, _THIS_IP_, _RET_IP_); -	val = __le64_to_cpu(__raw_readq(addr)); +	val = __le64_to_cpu((__le64 __force)__raw_readq(addr));  	log_post_read_mmio(val, 64, addr, _THIS_IP_, _RET_IP_);  	return val;  } @@ -366,7 +366,7 @@ static inline void writeb_relaxed(u8 value, volatile void __iomem *addr)  static inline void writew_relaxed(u16 value, volatile void __iomem *addr)  {  	log_write_mmio(value, 16, addr, _THIS_IP_, _RET_IP_); -	__raw_writew(cpu_to_le16(value), addr); +	__raw_writew((u16 __force)cpu_to_le16(value), addr);  	log_post_write_mmio(value, 16, addr, _THIS_IP_, _RET_IP_);  }  #endif @@ -376,7 +376,7 @@ static inline void writew_relaxed(u16 value, volatile void __iomem *addr)  static inline void writel_relaxed(u32 value, volatile void __iomem *addr)  {  	log_write_mmio(value, 32, addr, _THIS_IP_, _RET_IP_); -	__raw_writel(__cpu_to_le32(value), addr); +	__raw_writel((u32 __force)__cpu_to_le32(value), addr);  	log_post_write_mmio(value, 32, addr, _THIS_IP_, _RET_IP_);  }  #endif @@ -386,7 +386,7 @@ static inline void writel_relaxed(u32 value, volatile void __iomem *addr)  static inline void writeq_relaxed(u64 value, volatile void __iomem *addr)  {  	log_write_mmio(value, 64, addr, _THIS_IP_, _RET_IP_); -	__raw_writeq(__cpu_to_le64(value), addr); +	__raw_writeq((u64 __force)__cpu_to_le64(value), addr);  	log_post_write_mmio(value, 64, addr, _THIS_IP_, _RET_IP_);  }  #endif diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h index 42f86327b40a..bf964cdfb330 100644 --- a/include/drm/drm_bridge.h +++ b/include/drm/drm_bridge.h @@ -423,11 +423,11 @@ struct drm_bridge_funcs {  	 *  	 * The returned array must be allocated with kmalloc() and will be  	 * freed by the caller. If the allocation fails, NULL should be -	 * returned. num_output_fmts must be set to the returned array size. +	 * returned. num_input_fmts must be set to the returned array size.  	 * Formats listed in the returned array should be listed in decreasing  	 * preference order (the core will try all formats until it finds one  	 * that works). When the format is not supported NULL should be -	 * returned and num_output_fmts should be set to 0. +	 * returned and num_input_fmts should be set to 0.  	 *  	 * This method is called on all elements of the bridge chain as part of  	 * the bus format negotiation process that happens in diff --git a/include/drm/drm_gem.h b/include/drm/drm_gem.h index 772a4adf5287..f1f00fc2dba6 100644 --- a/include/drm/drm_gem.h +++ b/include/drm/drm_gem.h @@ -476,7 +476,9 @@ int drm_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev,  void drm_gem_lru_init(struct drm_gem_lru *lru, struct mutex *lock);  void drm_gem_lru_remove(struct drm_gem_object *obj);  void drm_gem_lru_move_tail(struct drm_gem_lru *lru, struct drm_gem_object *obj); -unsigned long drm_gem_lru_scan(struct drm_gem_lru *lru, unsigned nr_to_scan, +unsigned long drm_gem_lru_scan(struct drm_gem_lru *lru, +			       unsigned int nr_to_scan, +			       unsigned long *remaining,  			       bool (*shrink)(struct drm_gem_object *obj));  #endif /* __DRM_GEM_H__ */ diff --git a/include/drm/gpu_scheduler.h b/include/drm/gpu_scheduler.h index 9db9e5e504ee..9935d1e2ff69 100644 --- a/include/drm/gpu_scheduler.h +++ b/include/drm/gpu_scheduler.h @@ -228,13 +228,6 @@ struct drm_sched_entity {  	 */  	struct rb_node			rb_tree_node; -	/** -	 * @elapsed_ns: -	 * -	 * Records the amount of time where jobs from this entity were active -	 * on the GPU. -	 */ -	uint64_t elapsed_ns;  };  /** diff --git a/include/kvm/arm_arch_timer.h b/include/kvm/arm_arch_timer.h index 71916de7c6c4..c52a6e6839da 100644 --- a/include/kvm/arm_arch_timer.h +++ b/include/kvm/arm_arch_timer.h @@ -23,6 +23,19 @@ enum kvm_arch_timer_regs {  	TIMER_REG_CTL,  }; +struct arch_timer_offset { +	/* +	 * If set, pointer to one of the offsets in the kvm's offset +	 * structure. If NULL, assume a zero offset. +	 */ +	u64	*vm_offset; +}; + +struct arch_timer_vm_data { +	/* Offset applied to the virtual timer/counter */ +	u64	voffset; +}; +  struct arch_timer_context {  	struct kvm_vcpu			*vcpu; @@ -32,6 +45,8 @@ struct arch_timer_context {  	/* Emulated Timer (may be unused) */  	struct hrtimer			hrtimer; +	/* Offset for this counter/timer */ +	struct arch_timer_offset	offset;  	/*  	 * We have multiple paths which can save/restore the timer state onto  	 * the hardware, so we need some way of keeping track of where the diff --git a/include/linux/acpi_mdio.h b/include/linux/acpi_mdio.h index 0a24ab7cb66f..8e2eefa9fbc0 100644 --- a/include/linux/acpi_mdio.h +++ b/include/linux/acpi_mdio.h @@ -9,7 +9,14 @@  #include <linux/phy.h>  #if IS_ENABLED(CONFIG_ACPI_MDIO) -int acpi_mdiobus_register(struct mii_bus *mdio, struct fwnode_handle *fwnode); +int __acpi_mdiobus_register(struct mii_bus *mdio, struct fwnode_handle *fwnode, +			    struct module *owner); + +static inline int +acpi_mdiobus_register(struct mii_bus *mdio, struct fwnode_handle *handle) +{ +	return __acpi_mdiobus_register(mdio, handle, THIS_MODULE); +}  #else /* CONFIG_ACPI_MDIO */  static inline int  acpi_mdiobus_register(struct mii_bus *mdio, struct fwnode_handle *fwnode) diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h index 842e72a5348f..6f3175f0678a 100644 --- a/include/linux/clk-provider.h +++ b/include/linux/clk-provider.h @@ -1363,7 +1363,13 @@ struct clk_hw_onecell_data {  	struct clk_hw *hws[];  }; -#define CLK_OF_DECLARE(name, compat, fn) OF_DECLARE_1(clk, name, compat, fn) +#define CLK_OF_DECLARE(name, compat, fn) \ +	static void __init __##name##_of_clk_init_declare(struct device_node *np) \ +	{								\ +		fn(np);							\ +		fwnode_dev_initialized(of_fwnode_handle(np), true);	\ +	}								\ +	OF_DECLARE_1(clk, name, compat, __##name##_of_clk_init_declare)  /*   * Use this macro when you have a driver that requires two initialization diff --git a/include/linux/context_tracking.h b/include/linux/context_tracking.h index d4afa8508a80..3a7909ed5498 100644 --- a/include/linux/context_tracking.h +++ b/include/linux/context_tracking.h @@ -96,6 +96,7 @@ static inline void user_exit_irqoff(void) { }  static inline int exception_enter(void) { return 0; }  static inline void exception_exit(enum ctx_state prev_ctx) { }  static inline int ct_state(void) { return -1; } +static inline int __ct_state(void) { return -1; }  static __always_inline bool context_tracking_guest_enter(void) { return false; }  static inline void context_tracking_guest_exit(void) { }  #define CT_WARN_ON(cond) do { } while (0) diff --git a/include/linux/context_tracking_state.h b/include/linux/context_tracking_state.h index 4a4d56f77180..fdd537ea513f 100644 --- a/include/linux/context_tracking_state.h +++ b/include/linux/context_tracking_state.h @@ -46,7 +46,9 @@ struct context_tracking {  #ifdef CONFIG_CONTEXT_TRACKING  DECLARE_PER_CPU(struct context_tracking, context_tracking); +#endif +#ifdef CONFIG_CONTEXT_TRACKING_USER  static __always_inline int __ct_state(void)  {  	return arch_atomic_read(this_cpu_ptr(&context_tracking.state)) & CT_STATE_MASK; diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h index c6fab004104a..5b2f8147d1ae 100644 --- a/include/linux/cpuhotplug.h +++ b/include/linux/cpuhotplug.h @@ -218,7 +218,6 @@ enum cpuhp_state {  	CPUHP_AP_PERF_X86_CQM_ONLINE,  	CPUHP_AP_PERF_X86_CSTATE_ONLINE,  	CPUHP_AP_PERF_X86_IDXD_ONLINE, -	CPUHP_AP_PERF_X86_IOMMU_PERF_ONLINE,  	CPUHP_AP_PERF_S390_CF_ONLINE,  	CPUHP_AP_PERF_S390_SF_ONLINE,  	CPUHP_AP_PERF_ARM_CCI_ONLINE, diff --git a/include/linux/cpumask.h b/include/linux/cpumask.h index 8fbe76607965..ca736b05ec7b 100644 --- a/include/linux/cpumask.h +++ b/include/linux/cpumask.h @@ -66,7 +66,7 @@ static inline void set_nr_cpu_ids(unsigned int nr)   *   * Finally, some operations just want the exact limit, either because   * they set bits or just don't have any faster fixed-sized versions. We - * call this just 'nr_cpumask_size'. + * call this just 'nr_cpumask_bits'.   *   * Note that these optional constants are always guaranteed to be at   * least as big as 'nr_cpu_ids' itself is, and all our cpumask @@ -147,7 +147,7 @@ static __always_inline void cpu_max_bits_warn(unsigned int cpu, unsigned int bit  /* verify cpu argument to cpumask_* operators */  static __always_inline unsigned int cpumask_check(unsigned int cpu)  { -	cpu_max_bits_warn(cpu, nr_cpumask_bits); +	cpu_max_bits_warn(cpu, small_cpumask_bits);  	return cpu;  } @@ -351,6 +351,23 @@ unsigned int __pure cpumask_next_wrap(int n, const struct cpumask *mask, int sta  	for_each_andnot_bit(cpu, cpumask_bits(mask1), cpumask_bits(mask2), small_cpumask_bits)  /** + * for_each_cpu_or - iterate over every cpu present in either mask + * @cpu: the (optionally unsigned) integer iterator + * @mask1: the first cpumask pointer + * @mask2: the second cpumask pointer + * + * This saves a temporary CPU mask in many places.  It is equivalent to: + *	struct cpumask tmp; + *	cpumask_or(&tmp, &mask1, &mask2); + *	for_each_cpu(cpu, &tmp) + *		... + * + * After the loop, cpu is >= nr_cpu_ids. + */ +#define for_each_cpu_or(cpu, mask1, mask2)				\ +	for_each_or_bit(cpu, cpumask_bits(mask1), cpumask_bits(mask2), small_cpumask_bits) + +/**   * cpumask_any_but - return a "random" in a cpumask, but not this one.   * @mask: the cpumask to search   * @cpu: the cpu to ignore. @@ -518,14 +535,14 @@ static __always_inline bool cpumask_test_and_clear_cpu(int cpu, struct cpumask *  /**   * cpumask_setall - set all cpus (< nr_cpu_ids) in a cpumask   * @dstp: the cpumask pointer - * - * Note: since we set bits, we should use the tighter 'bitmap_set()' with - * the eact number of bits, not 'bitmap_fill()' that will fill past the - * end.   */  static inline void cpumask_setall(struct cpumask *dstp)  { -	bitmap_set(cpumask_bits(dstp), 0, nr_cpumask_bits); +	if (small_const_nbits(small_cpumask_bits)) { +		cpumask_bits(dstp)[0] = BITMAP_LAST_WORD_MASK(nr_cpumask_bits); +		return; +	} +	bitmap_fill(cpumask_bits(dstp), nr_cpumask_bits);  }  /** diff --git a/include/linux/efi.h b/include/linux/efi.h index 04a733f0ba95..7aa62c92185f 100644 --- a/include/linux/efi.h +++ b/include/linux/efi.h @@ -693,6 +693,7 @@ efi_guid_to_str(efi_guid_t *guid, char *out)  }  extern void efi_init (void); +extern void efi_earlycon_reprobe(void);  #ifdef CONFIG_EFI  extern void efi_enter_virtual_mode (void);	/* switch EFI to virtual mode, if possible */  #else diff --git a/include/linux/fb.h b/include/linux/fb.h index d8d20514ea05..02d09cb57f6c 100644 --- a/include/linux/fb.h +++ b/include/linux/fb.h @@ -212,6 +212,7 @@ struct fb_deferred_io {  	/* delay between mkwrite and deferred handler */  	unsigned long delay;  	bool sort_pagereflist; /* sort pagelist by offset */ +	int open_count; /* number of opened files; protected by fb_info lock */  	struct mutex lock; /* mutex that protects the pageref list */  	struct list_head pagereflist; /* list of pagerefs for touched pages */  	/* callback */ diff --git a/include/linux/find.h b/include/linux/find.h index 4647864a5ffd..5e4f39ef2e72 100644 --- a/include/linux/find.h +++ b/include/linux/find.h @@ -14,6 +14,8 @@ unsigned long _find_next_and_bit(const unsigned long *addr1, const unsigned long  					unsigned long nbits, unsigned long start);  unsigned long _find_next_andnot_bit(const unsigned long *addr1, const unsigned long *addr2,  					unsigned long nbits, unsigned long start); +unsigned long _find_next_or_bit(const unsigned long *addr1, const unsigned long *addr2, +					unsigned long nbits, unsigned long start);  unsigned long _find_next_zero_bit(const unsigned long *addr, unsigned long nbits,  					 unsigned long start);  extern unsigned long _find_first_bit(const unsigned long *addr, unsigned long size); @@ -127,6 +129,36 @@ unsigned long find_next_andnot_bit(const unsigned long *addr1,  }  #endif +#ifndef find_next_or_bit +/** + * find_next_or_bit - find the next set bit in either memory regions + * @addr1: The first address to base the search on + * @addr2: The second address to base the search on + * @size: The bitmap size in bits + * @offset: The bitnumber to start searching at + * + * Returns the bit number for the next set bit + * If no bits are set, returns @size. + */ +static inline +unsigned long find_next_or_bit(const unsigned long *addr1, +		const unsigned long *addr2, unsigned long size, +		unsigned long offset) +{ +	if (small_const_nbits(size)) { +		unsigned long val; + +		if (unlikely(offset >= size)) +			return size; + +		val = (*addr1 | *addr2) & GENMASK(size - 1, offset); +		return val ? __ffs(val) : size; +	} + +	return _find_next_or_bit(addr1, addr2, size, offset); +} +#endif +  #ifndef find_next_zero_bit  /**   * find_next_zero_bit - find the next cleared bit in a memory region @@ -536,6 +568,11 @@ unsigned long find_next_bit_le(const void *addr, unsigned  	     (bit) = find_next_andnot_bit((addr1), (addr2), (size), (bit)), (bit) < (size);\  	     (bit)++) +#define for_each_or_bit(bit, addr1, addr2, size) \ +	for ((bit) = 0;									\ +	     (bit) = find_next_or_bit((addr1), (addr2), (size), (bit)), (bit) < (size);\ +	     (bit)++) +  /* same as for_each_set_bit() but use bit as value to start with */  #define for_each_set_bit_from(bit, addr, size) \  	for (; (bit) = find_next_bit((addr), (size), (bit)), (bit) < (size); (bit)++) diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index 366c730beaa3..402fc061de75 100644 --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h @@ -980,7 +980,7 @@ static inline void __ftrace_enabled_restore(int enabled)  #define CALLER_ADDR5 ((unsigned long)ftrace_return_address(5))  #define CALLER_ADDR6 ((unsigned long)ftrace_return_address(6)) -static inline unsigned long get_lock_parent_ip(void) +static __always_inline unsigned long get_lock_parent_ip(void)  {  	unsigned long addr = CALLER_ADDR0; diff --git a/include/linux/hid.h b/include/linux/hid.h index eaf8ab177303..1ea8c7a3570b 100644 --- a/include/linux/hid.h +++ b/include/linux/hid.h @@ -834,6 +834,7 @@ struct hid_driver {   * @output_report: send output report to device   * @idle: send idle request to device   * @may_wakeup: return if device may act as a wakeup source during system-suspend + * @max_buffer_size: over-ride maximum data buffer size (default: HID_MAX_BUFFER_SIZE)   */  struct hid_ll_driver {  	int (*start)(struct hid_device *hdev); @@ -859,6 +860,8 @@ struct hid_ll_driver {  	int (*idle)(struct hid_device *hdev, int report, int idle, int reqtype);  	bool (*may_wakeup)(struct hid_device *hdev); + +	unsigned int max_buffer_size;  };  extern bool hid_is_usb(const struct hid_device *hdev); diff --git a/include/linux/highmem.h b/include/linux/highmem.h index b06254e76d99..8fc10089e19e 100644 --- a/include/linux/highmem.h +++ b/include/linux/highmem.h @@ -481,4 +481,10 @@ static inline void folio_zero_range(struct folio *folio,  	zero_user_segments(&folio->page, start, start + length, 0, 0);  } +static inline void put_and_unmap_page(struct page *page, void *addr) +{ +	kunmap_local(addr); +	put_page(page); +} +  #endif /* _LINUX_HIGHMEM_H */ diff --git a/include/linux/i2c.h b/include/linux/i2c.h index 500404d85141..5ba89663ea86 100644 --- a/include/linux/i2c.h +++ b/include/linux/i2c.h @@ -236,8 +236,8 @@ enum i2c_driver_flags {  /**   * struct i2c_driver - represent an I2C device driver   * @class: What kind of i2c device we instantiate (for detect) - * @probe: Callback for device binding - soon to be deprecated - * @probe_new: New callback for device binding + * @probe: Callback for device binding + * @probe_new: Transitional callback for device binding - do not use   * @remove: Callback for device unbinding   * @shutdown: Callback for device shutdown   * @alert: Alert callback, for example for the SMBus alert protocol @@ -272,14 +272,18 @@ enum i2c_driver_flags {  struct i2c_driver {  	unsigned int class; +	union {  	/* Standard driver model interfaces */ -	int (*probe)(struct i2c_client *client, const struct i2c_device_id *id); +		int (*probe)(struct i2c_client *client); +		/* +		 * Legacy callback that was part of a conversion of .probe(). +		 * Today it has the same semantic as .probe(). Don't use for new +		 * code. +		 */ +		int (*probe_new)(struct i2c_client *client); +	};  	void (*remove)(struct i2c_client *client); -	/* New driver model interface to aid the seamless removal of the -	 * current probe()'s, more commonly unused than used second parameter. -	 */ -	int (*probe_new)(struct i2c_client *client);  	/* driver model interfaces that don't relate to enumeration  */  	void (*shutdown)(struct i2c_client *client); diff --git a/include/linux/interconnect-provider.h b/include/linux/interconnect-provider.h index cd5c5a27557f..d12cd18aab3f 100644 --- a/include/linux/interconnect-provider.h +++ b/include/linux/interconnect-provider.h @@ -122,6 +122,9 @@ int icc_link_destroy(struct icc_node *src, struct icc_node *dst);  void icc_node_add(struct icc_node *node, struct icc_provider *provider);  void icc_node_del(struct icc_node *node);  int icc_nodes_remove(struct icc_provider *provider); +void icc_provider_init(struct icc_provider *provider); +int icc_provider_register(struct icc_provider *provider); +void icc_provider_deregister(struct icc_provider *provider);  int icc_provider_add(struct icc_provider *provider);  void icc_provider_del(struct icc_provider *provider);  struct icc_node_data *of_icc_get_from_provider(struct of_phandle_args *spec); @@ -167,6 +170,15 @@ static inline int icc_nodes_remove(struct icc_provider *provider)  	return -ENOTSUPP;  } +static inline void icc_provider_init(struct icc_provider *provider) { } + +static inline int icc_provider_register(struct icc_provider *provider) +{ +	return -ENOTSUPP; +} + +static inline void icc_provider_deregister(struct icc_provider *provider) { } +  static inline int icc_provider_add(struct icc_provider *provider)  {  	return -ENOTSUPP; diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h index 5962072a4b19..f619bae1dcc5 100644 --- a/include/linux/jbd2.h +++ b/include/linux/jbd2.h @@ -1308,6 +1308,14 @@ struct journal_s  				    struct buffer_head *bh,  				    enum passtype pass, int off,  				    tid_t expected_commit_id); + +	/** +	 * @j_bmap: +	 * +	 * Bmap function that should be used instead of the generic +	 * VFS bmap function. +	 */ +	int (*j_bmap)(struct journal_s *journal, sector_t *block);  };  #define jbd2_might_wait_for_commit(j) \ diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 8ada23756b0e..a9adf75344be 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -755,6 +755,7 @@ struct kvm {  	struct {  		spinlock_t        lock;  		struct list_head  items; +		/* resampler_list update side is protected by resampler_lock. */  		struct list_head  resampler_list;  		struct mutex      resampler_lock;  	} irqfds; @@ -1986,6 +1987,9 @@ int kvm_ioeventfd(struct kvm *kvm, struct kvm_ioeventfd *args);  #ifdef CONFIG_HAVE_KVM_IRQFD  int kvm_irqfd(struct kvm *kvm, struct kvm_irqfd *args);  void kvm_irqfd_release(struct kvm *kvm); +bool kvm_notify_irqfd_resampler(struct kvm *kvm, +				unsigned int irqchip, +				unsigned int pin);  void kvm_irq_routing_update(struct kvm *);  #else  static inline int kvm_irqfd(struct kvm *kvm, struct kvm_irqfd *args) @@ -1994,6 +1998,13 @@ static inline int kvm_irqfd(struct kvm *kvm, struct kvm_irqfd *args)  }  static inline void kvm_irqfd_release(struct kvm *kvm) {} + +static inline bool kvm_notify_irqfd_resampler(struct kvm *kvm, +					      unsigned int irqchip, +					      unsigned int pin) +{ +	return false; +}  #endif  #else diff --git a/include/linux/kvm_irqfd.h b/include/linux/kvm_irqfd.h index dac047abdba7..8ad43692e3bb 100644 --- a/include/linux/kvm_irqfd.h +++ b/include/linux/kvm_irqfd.h @@ -31,7 +31,7 @@ struct kvm_kernel_irqfd_resampler {  	/*  	 * Entry in list of kvm->irqfd.resampler_list.  Use for sharing  	 * resamplers among irqfds on the same gsi. -	 * Accessed and modified under kvm->irqfds.resampler_lock +	 * RCU list modified under kvm->irqfds.resampler_lock  	 */  	struct list_head link;  }; diff --git a/include/linux/lockd/xdr4.h b/include/linux/lockd/xdr4.h index 9a6b55da8fd6..72831e35dca3 100644 --- a/include/linux/lockd/xdr4.h +++ b/include/linux/lockd/xdr4.h @@ -22,6 +22,7 @@  #define	nlm4_fbig		cpu_to_be32(NLM_FBIG)  #define	nlm4_failed		cpu_to_be32(NLM_FAILED) +void	nlm4svc_set_file_lock_range(struct file_lock *fl, u64 off, u64 len);  bool	nlm4svc_decode_void(struct svc_rqst *rqstp, struct xdr_stream *xdr);  bool	nlm4svc_decode_testargs(struct svc_rqst *rqstp, struct xdr_stream *xdr);  bool	nlm4svc_decode_lockargs(struct svc_rqst *rqstp, struct xdr_stream *xdr); diff --git a/include/linux/mlx5/device.h b/include/linux/mlx5/device.h index 71b06ebad402..1db19a9d26e3 100644 --- a/include/linux/mlx5/device.h +++ b/include/linux/mlx5/device.h @@ -36,6 +36,7 @@  #include <linux/types.h>  #include <rdma/ib_verbs.h>  #include <linux/mlx5/mlx5_ifc.h> +#include <linux/bitfield.h>  #if defined(__LITTLE_ENDIAN)  #define MLX5_SET_HOST_ENDIANNESS	0 @@ -980,14 +981,23 @@ enum {  };  enum { -	CQE_RSS_HTYPE_IP	= 0x3 << 2, +	CQE_RSS_HTYPE_IP	= GENMASK(3, 2),  	/* cqe->rss_hash_type[3:2] - IP destination selected for hash  	 * (00 = none,  01 = IPv4, 10 = IPv6, 11 = Reserved)  	 */ -	CQE_RSS_HTYPE_L4	= 0x3 << 6, +	CQE_RSS_IP_NONE		= 0x0, +	CQE_RSS_IPV4		= 0x1, +	CQE_RSS_IPV6		= 0x2, +	CQE_RSS_RESERVED	= 0x3, + +	CQE_RSS_HTYPE_L4	= GENMASK(7, 6),  	/* cqe->rss_hash_type[7:6] - L4 destination selected for hash  	 * (00 = none, 01 = TCP. 10 = UDP, 11 = IPSEC.SPI  	 */ +	CQE_RSS_L4_NONE		= 0x0, +	CQE_RSS_L4_TCP		= 0x1, +	CQE_RSS_L4_UDP		= 0x2, +	CQE_RSS_L4_IPSEC	= 0x3,  };  enum { diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index 0722859c3647..a57e6ae78e65 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h @@ -774,7 +774,8 @@ struct mm_struct {  	unsigned long cpu_bitmap[];  }; -#define MM_MT_FLAGS	(MT_FLAGS_ALLOC_RANGE | MT_FLAGS_LOCK_EXTERN) +#define MM_MT_FLAGS	(MT_FLAGS_ALLOC_RANGE | MT_FLAGS_LOCK_EXTERN | \ +			 MT_FLAGS_USE_RCU)  extern struct mm_struct init_mm;  /* Pointer magic because the dynamic array size confuses some compilers. */ diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 6a14b7b11766..c35f04f636f1 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -297,9 +297,11 @@ struct hh_cache {   * relationship HH alignment <= LL alignment.   */  #define LL_RESERVED_SPACE(dev) \ -	((((dev)->hard_header_len+(dev)->needed_headroom)&~(HH_DATA_MOD - 1)) + HH_DATA_MOD) +	((((dev)->hard_header_len + READ_ONCE((dev)->needed_headroom)) \ +	  & ~(HH_DATA_MOD - 1)) + HH_DATA_MOD)  #define LL_RESERVED_SPACE_EXTRA(dev,extra) \ -	((((dev)->hard_header_len+(dev)->needed_headroom+(extra))&~(HH_DATA_MOD - 1)) + HH_DATA_MOD) +	((((dev)->hard_header_len + READ_ONCE((dev)->needed_headroom) + (extra)) \ +	  & ~(HH_DATA_MOD - 1)) + HH_DATA_MOD)  struct header_ops {  	int	(*create) (struct sk_buff *skb, struct net_device *dev, @@ -1622,7 +1624,8 @@ struct net_device_ops {  struct xdp_metadata_ops {  	int	(*xmo_rx_timestamp)(const struct xdp_md *ctx, u64 *timestamp); -	int	(*xmo_rx_hash)(const struct xdp_md *ctx, u32 *hash); +	int	(*xmo_rx_hash)(const struct xdp_md *ctx, u32 *hash, +			       enum xdp_rss_hash_type *rss_type);  };  /** diff --git a/include/linux/of_mdio.h b/include/linux/of_mdio.h index da633d34ab86..8a52ef2e6fa6 100644 --- a/include/linux/of_mdio.h +++ b/include/linux/of_mdio.h @@ -14,9 +14,25 @@  #if IS_ENABLED(CONFIG_OF_MDIO)  bool of_mdiobus_child_is_phy(struct device_node *child); -int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np); -int devm_of_mdiobus_register(struct device *dev, struct mii_bus *mdio, -			     struct device_node *np); +int __of_mdiobus_register(struct mii_bus *mdio, struct device_node *np, +			  struct module *owner); + +static inline int of_mdiobus_register(struct mii_bus *mdio, +				      struct device_node *np) +{ +	return __of_mdiobus_register(mdio, np, THIS_MODULE); +} + +int __devm_of_mdiobus_register(struct device *dev, struct mii_bus *mdio, +			       struct device_node *np, struct module *owner); + +static inline int devm_of_mdiobus_register(struct device *dev, +					   struct mii_bus *mdio, +					   struct device_node *np) +{ +	return __devm_of_mdiobus_register(dev, mdio, np, THIS_MODULE); +} +  struct mdio_device *of_mdio_find_device(struct device_node *np);  struct phy_device *of_phy_find_device(struct device_node *phy_np);  struct phy_device * diff --git a/include/linux/pci-doe.h b/include/linux/pci-doe.h index ed9b4df792b8..43765eaf2342 100644 --- a/include/linux/pci-doe.h +++ b/include/linux/pci-doe.h @@ -34,6 +34,10 @@ struct pci_doe_mb;   * @work: Used internally by the mailbox   * @doe_mb: Used internally by the mailbox   * + * Payloads are treated as opaque byte streams which are transmitted verbatim, + * without byte-swapping.  If payloads contain little-endian register values, + * the caller is responsible for conversion with cpu_to_le32() / le32_to_cpu(). + *   * The payload sizes and rv are specified in bytes with the following   * restrictions concerning the protocol.   * @@ -45,9 +49,9 @@ struct pci_doe_mb;   */  struct pci_doe_task {  	struct pci_doe_protocol prot; -	u32 *request_pl; +	__le32 *request_pl;  	size_t request_pl_sz; -	u32 *response_pl; +	__le32 *response_pl;  	size_t response_pl_sz;  	int rv;  	void (*complete)(struct pci_doe_task *task); diff --git a/include/linux/pci.h b/include/linux/pci.h index fafd8020c6d7..a5dda515fcd1 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -1438,6 +1438,7 @@ void pci_bus_add_resource(struct pci_bus *bus, struct resource *res,  			  unsigned int flags);  struct resource *pci_bus_resource_n(const struct pci_bus *bus, int n);  void pci_bus_remove_resources(struct pci_bus *bus); +void pci_bus_remove_resource(struct pci_bus *bus, struct resource *res);  int devm_request_pci_bus_resources(struct device *dev,  				   struct list_head *resources); @@ -1623,6 +1624,8 @@ pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs,  					      flags, NULL);  } +static inline bool pci_msix_can_alloc_dyn(struct pci_dev *dev) +{ return false; }  static inline struct msi_map pci_msix_alloc_irq_at(struct pci_dev *dev, unsigned int index,  						   const struct irq_affinity_desc *affdesc)  { diff --git a/include/linux/percpu_counter.h b/include/linux/percpu_counter.h index 521a733e21a9..75b73c83bc9d 100644 --- a/include/linux/percpu_counter.h +++ b/include/linux/percpu_counter.h @@ -45,7 +45,6 @@ void percpu_counter_set(struct percpu_counter *fbc, s64 amount);  void percpu_counter_add_batch(struct percpu_counter *fbc, s64 amount,  			      s32 batch);  s64 __percpu_counter_sum(struct percpu_counter *fbc); -s64 percpu_counter_sum_all(struct percpu_counter *fbc);  int __percpu_counter_compare(struct percpu_counter *fbc, s64 rhs, s32 batch);  void percpu_counter_sync(struct percpu_counter *fbc); @@ -196,11 +195,6 @@ static inline s64 percpu_counter_sum(struct percpu_counter *fbc)  	return percpu_counter_read(fbc);  } -static inline s64 percpu_counter_sum_all(struct percpu_counter *fbc) -{ -	return percpu_counter_read(fbc); -} -  static inline bool percpu_counter_initialized(struct percpu_counter *fbc)  {  	return true; diff --git a/include/linux/phy.h b/include/linux/phy.h index 36bf0bbc8efa..db7c0bd67559 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h @@ -1547,7 +1547,7 @@ int fwnode_get_phy_id(struct fwnode_handle *fwnode, u32 *phy_id);  struct mdio_device *fwnode_mdio_find_device(struct fwnode_handle *fwnode);  struct phy_device *fwnode_phy_find_device(struct fwnode_handle *phy_fwnode);  struct phy_device *device_phy_find_device(struct device *dev); -struct fwnode_handle *fwnode_get_phy_node(struct fwnode_handle *fwnode); +struct fwnode_handle *fwnode_get_phy_node(const struct fwnode_handle *fwnode);  struct phy_device *get_phy_device(struct mii_bus *bus, int addr, bool is_c45);  int phy_device_register(struct phy_device *phy);  void phy_device_free(struct phy_device *phydev); diff --git a/include/linux/phylink.h b/include/linux/phylink.h index c492c26202b5..637698ed5cb6 100644 --- a/include/linux/phylink.h +++ b/include/linux/phylink.h @@ -574,6 +574,7 @@ struct phylink *phylink_create(struct phylink_config *, struct fwnode_handle *,  			       phy_interface_t iface,  			       const struct phylink_mac_ops *mac_ops);  void phylink_destroy(struct phylink *); +bool phylink_expects_phy(struct phylink *pl);  int phylink_connect_phy(struct phylink *, struct phy_device *);  int phylink_of_phy_connect(struct phylink *, struct device_node *, u32 flags); diff --git a/include/linux/rtnetlink.h b/include/linux/rtnetlink.h index 92ad75549e9c..b6e6378dcbbd 100644 --- a/include/linux/rtnetlink.h +++ b/include/linux/rtnetlink.h @@ -25,7 +25,8 @@ void rtmsg_ifinfo_newnet(int type, struct net_device *dev, unsigned int change,  struct sk_buff *rtmsg_ifinfo_build_skb(int type, struct net_device *dev,  				       unsigned change, u32 event,  				       gfp_t flags, int *new_nsid, -				       int new_ifindex, u32 portid, u32 seq); +				       int new_ifindex, u32 portid, +				       const struct nlmsghdr *nlh);  void rtmsg_ifinfo_send(struct sk_buff *skb, struct net_device *dev,  		       gfp_t flags, u32 portid, const struct nlmsghdr *nlh); diff --git a/include/linux/sfp.h b/include/linux/sfp.h index 52b98f9666a2..ef06a195b3c2 100644 --- a/include/linux/sfp.h +++ b/include/linux/sfp.h @@ -557,7 +557,7 @@ int sfp_get_module_eeprom_by_page(struct sfp_bus *bus,  void sfp_upstream_start(struct sfp_bus *bus);  void sfp_upstream_stop(struct sfp_bus *bus);  void sfp_bus_put(struct sfp_bus *bus); -struct sfp_bus *sfp_bus_find_fwnode(struct fwnode_handle *fwnode); +struct sfp_bus *sfp_bus_find_fwnode(const struct fwnode_handle *fwnode);  int sfp_bus_add_upstream(struct sfp_bus *bus, void *upstream,  			 const struct sfp_upstream_ops *ops);  void sfp_bus_del_upstream(struct sfp_bus *bus); @@ -619,7 +619,8 @@ static inline void sfp_bus_put(struct sfp_bus *bus)  {  } -static inline struct sfp_bus *sfp_bus_find_fwnode(struct fwnode_handle *fwnode) +static inline struct sfp_bus * +sfp_bus_find_fwnode(const struct fwnode_handle *fwnode)  {  	return NULL;  } diff --git a/include/linux/stmmac.h b/include/linux/stmmac.h index a152678b82b7..a2414c187483 100644 --- a/include/linux/stmmac.h +++ b/include/linux/stmmac.h @@ -215,7 +215,7 @@ struct plat_stmmacenet_data {  	int unicast_filter_entries;  	int tx_fifo_size;  	int rx_fifo_size; -	u32 addr64; +	u32 host_dma_width;  	u32 rx_queues_to_use;  	u32 tx_queues_to_use;  	u8 rx_sched_algorithm; diff --git a/include/linux/sysfb.h b/include/linux/sysfb.h index 8ba8b5be5567..c1ef5fc60a3c 100644 --- a/include/linux/sysfb.h +++ b/include/linux/sysfb.h @@ -70,11 +70,16 @@ static inline void sysfb_disable(void)  #ifdef CONFIG_EFI  extern struct efifb_dmi_info efifb_dmi_list[]; -void sysfb_apply_efi_quirks(struct platform_device *pd); +void sysfb_apply_efi_quirks(void); +void sysfb_set_efifb_fwnode(struct platform_device *pd);  #else /* CONFIG_EFI */ -static inline void sysfb_apply_efi_quirks(struct platform_device *pd) +static inline void sysfb_apply_efi_quirks(void) +{ +} + +static inline void sysfb_set_efifb_fwnode(struct platform_device *pd)  {  } diff --git a/include/linux/thermal.h b/include/linux/thermal.h index 2bb4bf33f4f3..13c6aaed18df 100644 --- a/include/linux/thermal.h +++ b/include/linux/thermal.h @@ -384,6 +384,7 @@ devm_thermal_of_cooling_device_register(struct device *dev,  				struct device_node *np,  				char *type, void *devdata,  				const struct thermal_cooling_device_ops *ops); +void thermal_cooling_device_update(struct thermal_cooling_device *);  void thermal_cooling_device_unregister(struct thermal_cooling_device *);  struct thermal_zone_device *thermal_zone_get_zone_by_name(const char *name);  int thermal_zone_get_temp(struct thermal_zone_device *tz, int *temp); diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h index e299f29375bb..6811e43c1b5c 100644 --- a/include/linux/tracepoint.h +++ b/include/linux/tracepoint.h @@ -242,12 +242,11 @@ static inline struct tracepoint *tracepoint_ptr_deref(tracepoint_ptr_t *p)   * not add unwanted padding between the beginning of the section and the   * structure. Force alignment to the same alignment as the section start.   * - * When lockdep is enabled, we make sure to always do the RCU portions of - * the tracepoint code, regardless of whether tracing is on. However, - * don't check if the condition is false, due to interaction with idle - * instrumentation. This lets us find RCU issues triggered with tracepoints - * even when this tracepoint is off. This code has no purpose other than - * poking RCU a bit. + * When lockdep is enabled, we make sure to always test if RCU is + * "watching" regardless if the tracepoint is enabled or not. Tracepoints + * require RCU to be active, and it should always warn at the tracepoint + * site if it is not watching, as it will need to be active when the + * tracepoint is enabled.   */  #define __DECLARE_TRACE(name, proto, args, cond, data_proto)		\  	extern int __traceiter_##name(data_proto);			\ @@ -260,9 +259,7 @@ static inline struct tracepoint *tracepoint_ptr_deref(tracepoint_ptr_t *p)  				TP_ARGS(args),				\  				TP_CONDITION(cond), 0);			\  		if (IS_ENABLED(CONFIG_LOCKDEP) && (cond)) {		\ -			rcu_read_lock_sched_notrace();			\ -			rcu_dereference_sched(__tracepoint_##name.funcs);\ -			rcu_read_unlock_sched_notrace();		\ +			WARN_ON_ONCE(!rcu_is_watching());		\  		}							\  	}								\  	__DECLARE_TRACE_RCU(name, PARAMS(proto), PARAMS(args),		\ diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index 7254edfba4c9..d5311ceb21c6 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h @@ -954,6 +954,7 @@ enum {  	HCI_CONN_STK_ENCRYPT,  	HCI_CONN_AUTH_INITIATOR,  	HCI_CONN_DROP, +	HCI_CONN_CANCEL,  	HCI_CONN_PARAM_REMOVAL_PEND,  	HCI_CONN_NEW_LINK_KEY,  	HCI_CONN_SCANNING, @@ -1613,6 +1614,7 @@ void hci_conn_add_sysfs(struct hci_conn *conn);  void hci_conn_del_sysfs(struct hci_conn *conn);  #define SET_HCIDEV_DEV(hdev, pdev) ((hdev)->dev.parent = (pdev)) +#define GET_HCIDEV_DEV(hdev) ((hdev)->dev.parent)  /* ----- LMP capabilities ----- */  #define lmp_encrypt_capable(dev)   ((dev)->features[0][0] & LMP_ENCRYPT) diff --git a/include/net/bonding.h b/include/net/bonding.h index ea36ab7f9e72..c3843239517d 100644 --- a/include/net/bonding.h +++ b/include/net/bonding.h @@ -761,13 +761,17 @@ static inline int bond_get_targets_ip(__be32 *targets, __be32 ip)  #if IS_ENABLED(CONFIG_IPV6)  static inline int bond_get_targets_ip6(struct in6_addr *targets, struct in6_addr *ip)  { +	struct in6_addr mcaddr;  	int i; -	for (i = 0; i < BOND_MAX_NS_TARGETS; i++) -		if (ipv6_addr_equal(&targets[i], ip)) +	for (i = 0; i < BOND_MAX_NS_TARGETS; i++) { +		addrconf_addr_solict_mult(&targets[i], &mcaddr); +		if ((ipv6_addr_equal(&targets[i], ip)) || +		    (ipv6_addr_equal(&mcaddr, ip)))  			return i;  		else if (ipv6_addr_any(&targets[i]))  			break; +	}  	return -1;  } diff --git a/include/net/netfilter/nf_tproxy.h b/include/net/netfilter/nf_tproxy.h index 82d0e41b76f2..faa108b1ba67 100644 --- a/include/net/netfilter/nf_tproxy.h +++ b/include/net/netfilter/nf_tproxy.h @@ -17,6 +17,13 @@ static inline bool nf_tproxy_sk_is_transparent(struct sock *sk)  	return false;  } +static inline void nf_tproxy_twsk_deschedule_put(struct inet_timewait_sock *tw) +{ +	local_bh_disable(); +	inet_twsk_deschedule_put(tw); +	local_bh_enable(); +} +  /* assign a socket to the skb -- consumes sk */  static inline void nf_tproxy_assign_sock(struct sk_buff *skb, struct sock *sk)  { diff --git a/include/net/raw.h b/include/net/raw.h index 2c004c20ed99..3af5289fdead 100644 --- a/include/net/raw.h +++ b/include/net/raw.h @@ -37,7 +37,7 @@ int raw_rcv(struct sock *, struct sk_buff *);  struct raw_hashinfo {  	spinlock_t lock; -	struct hlist_nulls_head ht[RAW_HTABLE_SIZE] ____cacheline_aligned; +	struct hlist_head ht[RAW_HTABLE_SIZE] ____cacheline_aligned;  };  static inline u32 raw_hashfunc(const struct net *net, u32 proto) @@ -51,7 +51,7 @@ static inline void raw_hashinfo_init(struct raw_hashinfo *hashinfo)  	spin_lock_init(&hashinfo->lock);  	for (i = 0; i < RAW_HTABLE_SIZE; i++) -		INIT_HLIST_NULLS_HEAD(&hashinfo->ht[i], i); +		INIT_HLIST_HEAD(&hashinfo->ht[i]);  }  #ifdef CONFIG_PROC_FS diff --git a/include/net/xdp.h b/include/net/xdp.h index d517bfac937b..76aa748e7923 100644 --- a/include/net/xdp.h +++ b/include/net/xdp.h @@ -8,6 +8,7 @@  #include <linux/skbuff.h> /* skb_shared_info */  #include <uapi/linux/netdev.h> +#include <linux/bitfield.h>  /**   * DOC: XDP RX-queue information @@ -425,9 +426,56 @@ XDP_METADATA_KFUNC_xxx  MAX_XDP_METADATA_KFUNC,  }; +enum xdp_rss_hash_type { +	/* First part: Individual bits for L3/L4 types */ +	XDP_RSS_L3_IPV4		= BIT(0), +	XDP_RSS_L3_IPV6		= BIT(1), + +	/* The fixed (L3) IPv4 and IPv6 headers can both be followed by +	 * variable/dynamic headers, IPv4 called Options and IPv6 called +	 * Extension Headers. HW RSS type can contain this info. +	 */ +	XDP_RSS_L3_DYNHDR	= BIT(2), + +	/* When RSS hash covers L4 then drivers MUST set XDP_RSS_L4 bit in +	 * addition to the protocol specific bit.  This ease interaction with +	 * SKBs and avoids reserving a fixed mask for future L4 protocol bits. +	 */ +	XDP_RSS_L4		= BIT(3), /* L4 based hash, proto can be unknown */ +	XDP_RSS_L4_TCP		= BIT(4), +	XDP_RSS_L4_UDP		= BIT(5), +	XDP_RSS_L4_SCTP		= BIT(6), +	XDP_RSS_L4_IPSEC	= BIT(7), /* L4 based hash include IPSEC SPI */ + +	/* Second part: RSS hash type combinations used for driver HW mapping */ +	XDP_RSS_TYPE_NONE            = 0, +	XDP_RSS_TYPE_L2              = XDP_RSS_TYPE_NONE, + +	XDP_RSS_TYPE_L3_IPV4         = XDP_RSS_L3_IPV4, +	XDP_RSS_TYPE_L3_IPV6         = XDP_RSS_L3_IPV6, +	XDP_RSS_TYPE_L3_IPV4_OPT     = XDP_RSS_L3_IPV4 | XDP_RSS_L3_DYNHDR, +	XDP_RSS_TYPE_L3_IPV6_EX      = XDP_RSS_L3_IPV6 | XDP_RSS_L3_DYNHDR, + +	XDP_RSS_TYPE_L4_ANY          = XDP_RSS_L4, +	XDP_RSS_TYPE_L4_IPV4_TCP     = XDP_RSS_L3_IPV4 | XDP_RSS_L4 | XDP_RSS_L4_TCP, +	XDP_RSS_TYPE_L4_IPV4_UDP     = XDP_RSS_L3_IPV4 | XDP_RSS_L4 | XDP_RSS_L4_UDP, +	XDP_RSS_TYPE_L4_IPV4_SCTP    = XDP_RSS_L3_IPV4 | XDP_RSS_L4 | XDP_RSS_L4_SCTP, +	XDP_RSS_TYPE_L4_IPV4_IPSEC   = XDP_RSS_L3_IPV4 | XDP_RSS_L4 | XDP_RSS_L4_IPSEC, + +	XDP_RSS_TYPE_L4_IPV6_TCP     = XDP_RSS_L3_IPV6 | XDP_RSS_L4 | XDP_RSS_L4_TCP, +	XDP_RSS_TYPE_L4_IPV6_UDP     = XDP_RSS_L3_IPV6 | XDP_RSS_L4 | XDP_RSS_L4_UDP, +	XDP_RSS_TYPE_L4_IPV6_SCTP    = XDP_RSS_L3_IPV6 | XDP_RSS_L4 | XDP_RSS_L4_SCTP, +	XDP_RSS_TYPE_L4_IPV6_IPSEC   = XDP_RSS_L3_IPV6 | XDP_RSS_L4 | XDP_RSS_L4_IPSEC, + +	XDP_RSS_TYPE_L4_IPV6_TCP_EX  = XDP_RSS_TYPE_L4_IPV6_TCP  | XDP_RSS_L3_DYNHDR, +	XDP_RSS_TYPE_L4_IPV6_UDP_EX  = XDP_RSS_TYPE_L4_IPV6_UDP  | XDP_RSS_L3_DYNHDR, +	XDP_RSS_TYPE_L4_IPV6_SCTP_EX = XDP_RSS_TYPE_L4_IPV6_SCTP | XDP_RSS_L3_DYNHDR, +}; +  #ifdef CONFIG_NET  u32 bpf_xdp_metadata_kfunc_id(int id);  bool bpf_dev_bound_kfunc_id(u32 btf_id); +void xdp_set_features_flag(struct net_device *dev, xdp_features_t val);  void xdp_features_set_redirect_target(struct net_device *dev, bool support_sg);  void xdp_features_clear_redirect_target(struct net_device *dev);  #else @@ -435,6 +483,11 @@ static inline u32 bpf_xdp_metadata_kfunc_id(int id) { return 0; }  static inline bool bpf_dev_bound_kfunc_id(u32 btf_id) { return false; }  static inline void +xdp_set_features_flag(struct net_device *dev, xdp_features_t val) +{ +} + +static inline void  xdp_features_set_redirect_target(struct net_device *dev, bool support_sg)  {  } @@ -445,4 +498,9 @@ xdp_features_clear_redirect_target(struct net_device *dev)  }  #endif +static inline void xdp_clear_features_flag(struct net_device *dev) +{ +	xdp_set_features_flag(dev, 0); +} +  #endif /* __LINUX_NET_XDP_H__ */ diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h index de310f21406c..f10a008e5bfa 100644 --- a/include/scsi/scsi_device.h +++ b/include/scsi/scsi_device.h @@ -145,6 +145,7 @@ struct scsi_device {  	const char * model;		/* ... after scan; point to static string */  	const char * rev;		/* ... "nullnullnullnull" before scan */ +#define SCSI_DEFAULT_VPD_LEN	255	/* default SCSI VPD page size (max) */  	struct scsi_vpd __rcu *vpd_pg0;  	struct scsi_vpd __rcu *vpd_pg83;  	struct scsi_vpd __rcu *vpd_pg80; @@ -215,6 +216,7 @@ struct scsi_device {  					 * creation time */  	unsigned ignore_media_change:1; /* Ignore MEDIA CHANGE on resume */  	unsigned silence_suspend:1;	/* Do not print runtime PM related messages */ +	unsigned no_vpd_size:1;		/* No VPD size reported in header */  	unsigned int queue_stopped;	/* request queue is quiesced */  	bool offline_already;		/* Device offline message logged */ diff --git a/include/scsi/scsi_devinfo.h b/include/scsi/scsi_devinfo.h index 5d14adae21c7..6b548dc2c496 100644 --- a/include/scsi/scsi_devinfo.h +++ b/include/scsi/scsi_devinfo.h @@ -32,7 +32,8 @@  #define BLIST_IGN_MEDIA_CHANGE	((__force blist_flags_t)(1ULL << 11))  /* do not do automatic start on add */  #define BLIST_NOSTARTONADD	((__force blist_flags_t)(1ULL << 12)) -#define __BLIST_UNUSED_13	((__force blist_flags_t)(1ULL << 13)) +/* do not ask for VPD page size first on some broken targets */ +#define BLIST_NO_VPD_SIZE	((__force blist_flags_t)(1ULL << 13))  #define __BLIST_UNUSED_14	((__force blist_flags_t)(1ULL << 14))  #define __BLIST_UNUSED_15	((__force blist_flags_t)(1ULL << 15))  #define __BLIST_UNUSED_16	((__force blist_flags_t)(1ULL << 16)) @@ -74,8 +75,7 @@  #define __BLIST_HIGH_UNUSED (~(__BLIST_LAST_USED | \  			       (__force blist_flags_t) \  			       ((__force __u64)__BLIST_LAST_USED - 1ULL))) -#define __BLIST_UNUSED_MASK (__BLIST_UNUSED_13 | \ -			     __BLIST_UNUSED_14 | \ +#define __BLIST_UNUSED_MASK (__BLIST_UNUSED_14 | \  			     __BLIST_UNUSED_15 | \  			     __BLIST_UNUSED_16 | \  			     __BLIST_UNUSED_24 | \ diff --git a/include/trace/events/f2fs.h b/include/trace/events/f2fs.h index 1322d34a5dfc..99cbc5949e3c 100644 --- a/include/trace/events/f2fs.h +++ b/include/trace/events/f2fs.h @@ -512,7 +512,7 @@ TRACE_EVENT(f2fs_truncate_partial_nodes,  	TP_STRUCT__entry(  		__field(dev_t,	dev)  		__field(ino_t,	ino) -		__field(nid_t,	nid[3]) +		__array(nid_t,	nid, 3)  		__field(int,	depth)  		__field(int,	err)  	), diff --git a/include/trace/events/mmap.h b/include/trace/events/mmap.h index 216de5f03621..f8d61485de16 100644 --- a/include/trace/events/mmap.h +++ b/include/trace/events/mmap.h @@ -35,7 +35,7 @@ TRACE_EVENT(vm_unmapped_area,  		__entry->align_offset = info->align_offset;  	), -	TP_printk("addr=0x%lx err=%ld total_vm=0x%lx flags=0x%lx len=0x%lx lo=0x%lx hi=0x%lx mask=0x%lx ofs=0x%lx\n", +	TP_printk("addr=0x%lx err=%ld total_vm=0x%lx flags=0x%lx len=0x%lx lo=0x%lx hi=0x%lx mask=0x%lx ofs=0x%lx",  		IS_ERR_VALUE(__entry->addr) ? 0 : __entry->addr,  		IS_ERR_VALUE(__entry->addr) ? __entry->addr : 0,  		__entry->total_vm, __entry->flags, __entry->length, @@ -110,7 +110,7 @@ TRACE_EVENT(exit_mmap,  		       __entry->mt		= &mm->mm_mt;  	), -	TP_printk("mt_mod %p, DESTROY\n", +	TP_printk("mt_mod %p, DESTROY",  		  __entry->mt  	)  ); diff --git a/include/trace/events/rcu.h b/include/trace/events/rcu.h index 90b2fb0292cb..012fa0d171b2 100644 --- a/include/trace/events/rcu.h +++ b/include/trace/events/rcu.h @@ -768,7 +768,7 @@ TRACE_EVENT_RCU(rcu_torture_read,  	TP_ARGS(rcutorturename, rhp, secs, c_old, c),  	TP_STRUCT__entry( -		__field(char, rcutorturename[RCUTORTURENAME_LEN]) +		__array(char, rcutorturename, RCUTORTURENAME_LEN)  		__field(struct rcu_head *, rhp)  		__field(unsigned long, secs)  		__field(unsigned long, c_old) diff --git a/include/trace/stages/stage5_get_offsets.h b/include/trace/stages/stage5_get_offsets.h index ac5c24d3beeb..e30a13be46ba 100644 --- a/include/trace/stages/stage5_get_offsets.h +++ b/include/trace/stages/stage5_get_offsets.h @@ -9,17 +9,30 @@  #undef __entry  #define __entry entry +/* + * Fields should never declare an array: i.e. __field(int, arr[5]) + * If they do, it will cause issues in parsing and possibly corrupt the + * events. To prevent that from happening, test the sizeof() a fictitious + * type called "struct _test_no_array_##item" which will fail if "item" + * contains array elements (like "arr[5]"). + * + * If you hit this, use __array(int, arr, 5) instead. + */  #undef __field -#define __field(type, item) +#define __field(type, item)					\ +	{ (void)sizeof(struct _test_no_array_##item *); }  #undef __field_ext -#define __field_ext(type, item, filter_type) +#define __field_ext(type, item, filter_type)			\ +	{ (void)sizeof(struct _test_no_array_##item *); }  #undef __field_struct -#define __field_struct(type, item) +#define __field_struct(type, item)				\ +	{ (void)sizeof(struct _test_no_array_##item *); }  #undef __field_struct_ext -#define __field_struct_ext(type, item, filter_type) +#define __field_struct_ext(type, item, filter_type)		\ +	{ (void)sizeof(struct _test_no_array_##item *); }  #undef __array  #define __array(type, item, len) diff --git a/include/uapi/linux/btrfs.h b/include/uapi/linux/btrfs.h index b4f0f9531119..ada0a489bf2b 100644 --- a/include/uapi/linux/btrfs.h +++ b/include/uapi/linux/btrfs.h @@ -245,7 +245,17 @@ struct btrfs_ioctl_dev_info_args {  	__u8 uuid[BTRFS_UUID_SIZE];		/* in/out */  	__u64 bytes_used;			/* out */  	__u64 total_bytes;			/* out */ -	__u64 unused[379];			/* pad to 4k */ +	/* +	 * Optional, out. +	 * +	 * Showing the fsid of the device, allowing user space to check if this +	 * device is a seeding one. +	 * +	 * Introduced in v6.3, thus user space still needs to check if kernel +	 * changed this value.  Older kernel will not touch the values here. +	 */ +	__u8 fsid[BTRFS_UUID_SIZE]; +	__u64 unused[377];			/* pad to 4k */  	__u8 path[BTRFS_DEVICE_PATH_NAME_MAX];	/* out */  }; diff --git a/include/uapi/linux/fou.h b/include/uapi/linux/fou.h index 19ebbef41a63..b5cd3e7b3775 100644 --- a/include/uapi/linux/fou.h +++ b/include/uapi/linux/fou.h @@ -1,4 +1,4 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */  /* Do not edit directly, auto-generated from: */  /*	Documentation/netlink/specs/fou.yaml */  /* YNL-GEN uapi header */ diff --git a/include/uapi/linux/netdev.h b/include/uapi/linux/netdev.h index 588391447bfb..639524b59930 100644 --- a/include/uapi/linux/netdev.h +++ b/include/uapi/linux/netdev.h @@ -1,4 +1,4 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */  /* Do not edit directly, auto-generated from: */  /*	Documentation/netlink/specs/netdev.yaml */  /* YNL-GEN uapi header */ @@ -33,6 +33,8 @@ enum netdev_xdp_act {  	NETDEV_XDP_ACT_HW_OFFLOAD = 16,  	NETDEV_XDP_ACT_RX_SG = 32,  	NETDEV_XDP_ACT_NDO_XMIT_SG = 64, + +	NETDEV_XDP_ACT_MASK = 127,  };  enum { diff --git a/include/uapi/linux/rtnetlink.h b/include/uapi/linux/rtnetlink.h index 25a0af57dd5e..51c13cf9c5ae 100644 --- a/include/uapi/linux/rtnetlink.h +++ b/include/uapi/linux/rtnetlink.h @@ -789,6 +789,7 @@ enum {  	TCA_ROOT_FLAGS,  	TCA_ROOT_COUNT,  	TCA_ROOT_TIME_DELTA, /* in msecs */ +	TCA_ROOT_EXT_WARN_MSG,  	__TCA_ROOT_MAX,  #define	TCA_ROOT_MAX (__TCA_ROOT_MAX - 1)  }; diff --git a/include/uapi/linux/virtio_blk.h b/include/uapi/linux/virtio_blk.h index 5af2a0300bb9..3744e4da1b2a 100644 --- a/include/uapi/linux/virtio_blk.h +++ b/include/uapi/linux/virtio_blk.h @@ -140,11 +140,11 @@ struct virtio_blk_config {  	/* Zoned block device characteristics (if VIRTIO_BLK_F_ZONED) */  	struct virtio_blk_zoned_characteristics { -		__le32 zone_sectors; -		__le32 max_open_zones; -		__le32 max_active_zones; -		__le32 max_append_sectors; -		__le32 write_granularity; +		__virtio32 zone_sectors; +		__virtio32 max_open_zones; +		__virtio32 max_active_zones; +		__virtio32 max_append_sectors; +		__virtio32 write_granularity;  		__u8 model;  		__u8 unused2[3];  	} zoned; @@ -241,11 +241,11 @@ struct virtio_blk_outhdr {   */  struct virtio_blk_zone_descriptor {  	/* Zone capacity */ -	__le64 z_cap; +	__virtio64 z_cap;  	/* The starting sector of the zone */ -	__le64 z_start; +	__virtio64 z_start;  	/* Zone write pointer position in sectors */ -	__le64 z_wp; +	__virtio64 z_wp;  	/* Zone type */  	__u8 z_type;  	/* Zone state */ @@ -254,7 +254,7 @@ struct virtio_blk_zone_descriptor {  };  struct virtio_blk_zone_report { -	__le64 nr_zones; +	__virtio64 nr_zones;  	__u8 reserved[56];  	struct virtio_blk_zone_descriptor zones[];  }; diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h index 25aab8ec4f86..431c3afb2ce0 100644 --- a/include/ufs/ufshcd.h +++ b/include/ufs/ufshcd.h @@ -979,7 +979,6 @@ struct ufs_hba {  	struct completion *uic_async_done;  	enum ufshcd_state ufshcd_state; -	bool logical_unit_scan_finished;  	u32 eh_flags;  	u32 intr_mask;  	u16 ee_ctrl_mask; diff --git a/include/xen/interface/platform.h b/include/xen/interface/platform.h index 655d92e803e1..79a443c65ea9 100644 --- a/include/xen/interface/platform.h +++ b/include/xen/interface/platform.h @@ -483,6 +483,8 @@ struct xenpf_symdata {  };  DEFINE_GUEST_HANDLE_STRUCT(xenpf_symdata); +#define XENPF_get_dom0_console 64 +  struct xen_platform_op {  	uint32_t cmd;  	uint32_t interface_version; /* XENPF_INTERFACE_VERSION */ @@ -506,6 +508,7 @@ struct xen_platform_op {  		struct xenpf_mem_hotadd        mem_add;  		struct xenpf_core_parking      core_parking;  		struct xenpf_symdata           symdata; +		struct dom0_vga_console_info   dom0_console;  		uint8_t                        pad[128];  	} u;  }; |