diff options
Diffstat (limited to 'include/linux')
49 files changed, 297 insertions, 154 deletions
diff --git a/include/linux/acpi.h b/include/linux/acpi.h index 64e10746f282..968173ec2726 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h @@ -587,7 +587,7 @@ extern int acpi_nvs_for_each_region(int (*func)(__u64, __u64, void *),  const struct acpi_device_id *acpi_match_device(const struct acpi_device_id *ids,  					       const struct device *dev); -void *acpi_get_match_data(const struct device *dev); +const void *acpi_device_get_match_data(const struct device *dev);  extern bool acpi_driver_match_device(struct device *dev,  				     const struct device_driver *drv);  int acpi_device_uevent_modalias(struct device *, struct kobj_uevent_env *); @@ -766,7 +766,7 @@ static inline const struct acpi_device_id *acpi_match_device(  	return NULL;  } -static inline void *acpi_get_match_data(const struct device *dev) +static inline const void *acpi_device_get_match_data(const struct device *dev)  {  	return NULL;  } diff --git a/include/linux/bio.h b/include/linux/bio.h index d0eb659fa733..ce547a25e8ae 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -511,6 +511,7 @@ void zero_fill_bio(struct bio *bio);  extern struct bio_vec *bvec_alloc(gfp_t, int, unsigned long *, mempool_t *);  extern void bvec_free(mempool_t *, struct bio_vec *, unsigned int);  extern unsigned int bvec_nr_vecs(unsigned short idx); +extern const char *bio_devname(struct bio *bio, char *buffer);  #define bio_set_dev(bio, bdev) 			\  do {						\ @@ -529,9 +530,6 @@ do {						\  #define bio_dev(bio) \  	disk_devt((bio)->bi_disk) -#define bio_devname(bio, buf) \ -	__bdevname(bio_dev(bio), (buf)) -  #ifdef CONFIG_BLK_CGROUP  int bio_associate_blkcg(struct bio *bio, struct cgroup_subsys_state *blkcg_css);  void bio_disassociate_task(struct bio *bio); diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 4f3df807cf8f..ed63f3b69c12 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -49,7 +49,7 @@ struct blk_stat_callback;  #define BLKDEV_MIN_RQ	4  #define BLKDEV_MAX_RQ	128	/* Default maximum */ -/* Must be consisitent with blk_mq_poll_stats_bkt() */ +/* Must be consistent with blk_mq_poll_stats_bkt() */  #define BLK_MQ_POLL_STATS_BKTS 16  /* diff --git a/include/linux/cgroup-defs.h b/include/linux/cgroup-defs.h index 9f242b876fde..f8e76d01a5ad 100644 --- a/include/linux/cgroup-defs.h +++ b/include/linux/cgroup-defs.h @@ -755,13 +755,13 @@ struct sock_cgroup_data {   * updaters and return part of the previous pointer as the prioidx or   * classid.  Such races are short-lived and the result isn't critical.   */ -static inline u16 sock_cgroup_prioidx(struct sock_cgroup_data *skcd) +static inline u16 sock_cgroup_prioidx(const struct sock_cgroup_data *skcd)  {  	/* fallback to 1 which is always the ID of the root cgroup */  	return (skcd->is_data & 1) ? skcd->prioidx : 1;  } -static inline u32 sock_cgroup_classid(struct sock_cgroup_data *skcd) +static inline u32 sock_cgroup_classid(const struct sock_cgroup_data *skcd)  {  	/* fallback to 0 which is the unconfigured default classid */  	return (skcd->is_data & 1) ? skcd->classid : 0; diff --git a/include/linux/compat.h b/include/linux/compat.h index 8a9643857c4a..16c3027074a2 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h @@ -17,6 +17,7 @@  #include <linux/if.h>  #include <linux/fs.h>  #include <linux/aio_abi.h>	/* for aio_context_t */ +#include <linux/uaccess.h>  #include <linux/unistd.h>  #include <asm/compat.h> @@ -229,13 +230,13 @@ typedef struct compat_siginfo {  				short int _addr_lsb;	/* Valid LSB of the reported address. */  				/* used when si_code=SEGV_BNDERR */  				struct { -					short _dummy_bnd; +					compat_uptr_t _dummy_bnd;  					compat_uptr_t _lower;  					compat_uptr_t _upper;  				} _addr_bnd;  				/* used when si_code=SEGV_PKUERR */  				struct { -					short _dummy_pkey; +					compat_uptr_t _dummy_pkey;  					u32 _pkey;  				} _addr_pkey;  			}; @@ -550,8 +551,29 @@ asmlinkage long compat_sys_settimeofday(struct compat_timeval __user *tv,  asmlinkage long compat_sys_adjtimex(struct compat_timex __user *utp);  extern int get_compat_sigset(sigset_t *set, const compat_sigset_t __user *compat); -extern int put_compat_sigset(compat_sigset_t __user *compat, -			     const sigset_t *set, unsigned int size); + +/* + * Defined inline such that size can be compile time constant, which avoids + * CONFIG_HARDENED_USERCOPY complaining about copies from task_struct + */ +static inline int +put_compat_sigset(compat_sigset_t __user *compat, const sigset_t *set, +		  unsigned int size) +{ +	/* size <= sizeof(compat_sigset_t) <= sizeof(sigset_t) */ +#ifdef __BIG_ENDIAN +	compat_sigset_t v; +	switch (_NSIG_WORDS) { +	case 4: v.sig[7] = (set->sig[3] >> 32); v.sig[6] = set->sig[3]; +	case 3: v.sig[5] = (set->sig[2] >> 32); v.sig[4] = set->sig[2]; +	case 2: v.sig[3] = (set->sig[1] >> 32); v.sig[2] = set->sig[1]; +	case 1: v.sig[1] = (set->sig[0] >> 32); v.sig[0] = set->sig[0]; +	} +	return copy_to_user(compat, &v, size) ? -EFAULT : 0; +#else +	return copy_to_user(compat, set, size) ? -EFAULT : 0; +#endif +}  asmlinkage long compat_sys_migrate_pages(compat_pid_t pid,  		compat_ulong_t maxnode, const compat_ulong_t __user *old_nodes, diff --git a/include/linux/compiler-clang.h b/include/linux/compiler-clang.h index d02a4df3f473..d3f264a5b04d 100644 --- a/include/linux/compiler-clang.h +++ b/include/linux/compiler-clang.h @@ -27,3 +27,8 @@  #if __has_feature(address_sanitizer)  #define __SANITIZE_ADDRESS__  #endif + +/* Clang doesn't have a way to turn it off per-function, yet. */ +#ifdef __noretpoline +#undef __noretpoline +#endif diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h index 631354acfa72..e2c7f4369eff 100644 --- a/include/linux/compiler-gcc.h +++ b/include/linux/compiler-gcc.h @@ -93,6 +93,10 @@  #define __weak		__attribute__((weak))  #define __alias(symbol)	__attribute__((alias(#symbol))) +#ifdef RETPOLINE +#define __noretpoline __attribute__((indirect_branch("keep"))) +#endif +  /*   * it doesn't make sense on ARM (currently the only user of __naked)   * to trace naked functions because then mcount is called without @@ -167,8 +171,6 @@  #if GCC_VERSION >= 40100  # define __compiletime_object_size(obj) __builtin_object_size(obj, 0) - -#define __nostackprotector	__attribute__((__optimize__("no-stack-protector")))  #endif  #if GCC_VERSION >= 40300 @@ -196,6 +198,11 @@  #endif /* __CHECKER__ */  #endif /* GCC_VERSION >= 40300 */ +#if GCC_VERSION >= 40400 +#define __optimize(level)	__attribute__((__optimize__(level))) +#define __nostackprotector	__optimize("no-stack-protector") +#endif /* GCC_VERSION >= 40400 */ +  #if GCC_VERSION >= 40500  #ifndef __CHECKER__ @@ -205,6 +212,15 @@  #endif  /* + * calling noreturn functions, __builtin_unreachable() and __builtin_trap() + * confuse the stack allocation in gcc, leading to overly large stack + * frames, see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82365 + * + * Adding an empty inline assembly before it works around the problem + */ +#define barrier_before_unreachable() asm volatile("") + +/*   * Mark a position in code as unreachable.  This can be used to   * suppress control flow warnings after asm blocks that transfer   * control elsewhere. @@ -214,7 +230,11 @@   * unreleased.  Really, we need to have autoconf for the kernel.   */  #define unreachable() \ -	do { annotate_unreachable(); __builtin_unreachable(); } while (0) +	do {					\ +		annotate_unreachable();		\ +		barrier_before_unreachable();	\ +		__builtin_unreachable();	\ +	} while (0)  /* Mark a function definition as prohibited from being cloned. */  #define __noclone	__attribute__((__noclone__, __optimize__("no-tracer"))) diff --git a/include/linux/compiler.h b/include/linux/compiler.h index c2cc57a2f508..ab4711c63601 100644 --- a/include/linux/compiler.h +++ b/include/linux/compiler.h @@ -86,6 +86,11 @@ void ftrace_likely_update(struct ftrace_likely_data *f, int val,  # define barrier_data(ptr) barrier()  #endif +/* workaround for GCC PR82365 if needed */ +#ifndef barrier_before_unreachable +# define barrier_before_unreachable() do { } while (0) +#endif +  /* Unreachable code */  #ifdef CONFIG_STACK_VALIDATION  /* @@ -277,6 +282,10 @@ unsigned long read_word_at_a_time(const void *addr)  #endif /* __ASSEMBLY__ */ +#ifndef __optimize +# define __optimize(level) +#endif +  /* Compile time object size, -1 for unknown */  #ifndef __compiletime_object_size  # define __compiletime_object_size(obj) -1 diff --git a/include/linux/cpuidle.h b/include/linux/cpuidle.h index 871f9e21810c..0b3fc229086c 100644 --- a/include/linux/cpuidle.h +++ b/include/linux/cpuidle.h @@ -225,7 +225,7 @@ static inline void cpuidle_coupled_parallel_barrier(struct cpuidle_device *dev,  }  #endif -#ifdef CONFIG_ARCH_HAS_CPU_RELAX +#if defined(CONFIG_CPU_IDLE) && defined(CONFIG_ARCH_HAS_CPU_RELAX)  void cpuidle_poll_state_init(struct cpuidle_driver *drv);  #else  static inline void cpuidle_poll_state_init(struct cpuidle_driver *drv) {} diff --git a/include/linux/cpumask.h b/include/linux/cpumask.h index d4a2a7dcd72d..bf53d893ad02 100644 --- a/include/linux/cpumask.h +++ b/include/linux/cpumask.h @@ -170,6 +170,8 @@ static inline unsigned int cpumask_local_spread(unsigned int i, int node)  	for ((cpu) = 0; (cpu) < 1; (cpu)++, (void)mask)  #define for_each_cpu_not(cpu, mask)		\  	for ((cpu) = 0; (cpu) < 1; (cpu)++, (void)mask) +#define for_each_cpu_wrap(cpu, mask, start)	\ +	for ((cpu) = 0; (cpu) < 1; (cpu)++, (void)mask, (void)(start))  #define for_each_cpu_and(cpu, mask, and)	\  	for ((cpu) = 0; (cpu) < 1; (cpu)++, (void)mask, (void)and)  #else diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h index 34fe8463d10e..eb9eab4ecd6d 100644 --- a/include/linux/dma-mapping.h +++ b/include/linux/dma-mapping.h @@ -578,7 +578,7 @@ static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr)  /*   * This is a hack for the legacy x86 forbid_dac and iommu_sac_force. Please - * don't use this is new code. + * don't use this in new code.   */  #ifndef arch_dma_supported  #define arch_dma_supported(dev, mask)	(1) diff --git a/include/linux/fs.h b/include/linux/fs.h index 2a815560fda0..c6baf767619e 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1317,6 +1317,7 @@ extern int send_sigurg(struct fown_struct *fown);  #define SB_I_CGROUPWB	0x00000001	/* cgroup-aware writeback enabled */  #define SB_I_NOEXEC	0x00000002	/* Ignore executables on this fs */  #define SB_I_NODEV	0x00000004	/* Ignore devices on this fs */ +#define SB_I_MULTIROOT	0x00000008	/* Multiple roots to the dentry tree */  /* sb->s_iflags to limit user namespace mounts */  #define SB_I_USERNS_VISIBLE		0x00000010 /* fstype already mounted */ @@ -3198,7 +3199,7 @@ static inline bool vma_is_fsdax(struct vm_area_struct *vma)  	if (!vma_is_dax(vma))  		return false;  	inode = file_inode(vma->vm_file); -	if (inode->i_mode == S_IFCHR) +	if (S_ISCHR(inode->i_mode))  		return false; /* device-dax */  	return true;  } diff --git a/include/linux/fsl_ifc.h b/include/linux/fsl_ifc.h index c332f0a45607..3fdfede2f0f3 100644 --- a/include/linux/fsl_ifc.h +++ b/include/linux/fsl_ifc.h @@ -734,11 +734,7 @@ struct fsl_ifc_nand {  	u32 res19[0x10];  	__be32 nand_fsr;  	u32 res20; -	/* The V1 nand_eccstat is actually 4 words that overlaps the -	 * V2 nand_eccstat. -	 */ -	__be32 v1_nand_eccstat[2]; -	__be32 v2_nand_eccstat[6]; +	__be32 nand_eccstat[8];  	u32 res21[0x1c];  	__be32 nanndcr;  	u32 res22[0x2]; diff --git a/include/linux/fwnode.h b/include/linux/fwnode.h index 4fa1a489efe4..4fe8f289b3f6 100644 --- a/include/linux/fwnode.h +++ b/include/linux/fwnode.h @@ -73,8 +73,8 @@ struct fwnode_operations {  	struct fwnode_handle *(*get)(struct fwnode_handle *fwnode);  	void (*put)(struct fwnode_handle *fwnode);  	bool (*device_is_available)(const struct fwnode_handle *fwnode); -	void *(*device_get_match_data)(const struct fwnode_handle *fwnode, -				       const struct device *dev); +	const void *(*device_get_match_data)(const struct fwnode_handle *fwnode, +					     const struct device *dev);  	bool (*property_present)(const struct fwnode_handle *fwnode,  				 const char *propname);  	int (*property_read_int_array)(const struct fwnode_handle *fwnode, diff --git a/include/linux/genhd.h b/include/linux/genhd.h index 5e3531027b51..c826b0b5232a 100644 --- a/include/linux/genhd.h +++ b/include/linux/genhd.h @@ -198,6 +198,7 @@ struct gendisk {  	void *private_data;  	int flags; +	struct rw_semaphore lookup_sem;  	struct kobject *slave_dir;  	struct timer_rand_state *random; @@ -600,8 +601,9 @@ extern void delete_partition(struct gendisk *, int);  extern void printk_all_partitions(void);  extern struct gendisk *__alloc_disk_node(int minors, int node_id); -extern struct kobject *get_disk(struct gendisk *disk); +extern struct kobject *get_disk_and_module(struct gendisk *disk);  extern void put_disk(struct gendisk *disk); +extern void put_disk_and_module(struct gendisk *disk);  extern void blk_register_region(dev_t devt, unsigned long range,  			struct module *module,  			struct kobject *(*probe)(dev_t, int *, void *), diff --git a/include/linux/if_tun.h b/include/linux/if_tun.h index c5b0a75a7812..fd00170b494f 100644 --- a/include/linux/if_tun.h +++ b/include/linux/if_tun.h @@ -25,6 +25,7 @@ struct ptr_ring *tun_get_tx_ring(struct file *file);  bool tun_is_xdp_buff(void *ptr);  void *tun_xdp_to_ptr(void *ptr);  void *tun_ptr_to_xdp(void *ptr); +void tun_ptr_free(void *ptr);  #else  #include <linux/err.h>  #include <linux/errno.h> @@ -50,5 +51,8 @@ static inline void *tun_ptr_to_xdp(void *ptr)  {  	return NULL;  } +static inline void tun_ptr_free(void *ptr) +{ +}  #endif /* CONFIG_TUN */  #endif /* __IF_TUN_H */ diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h index 5e6a2d4dc366..c4a1cff9c768 100644 --- a/include/linux/if_vlan.h +++ b/include/linux/if_vlan.h @@ -300,30 +300,34 @@ static inline bool vlan_hw_offload_capable(netdev_features_t features,  }  /** - * __vlan_insert_tag - regular VLAN tag inserting + * __vlan_insert_inner_tag - inner VLAN tag inserting   * @skb: skbuff to tag   * @vlan_proto: VLAN encapsulation protocol   * @vlan_tci: VLAN TCI to insert + * @mac_len: MAC header length including outer vlan headers   * - * Inserts the VLAN tag into @skb as part of the payload + * Inserts the VLAN tag into @skb as part of the payload at offset mac_len   * Returns error if skb_cow_head failes.   *   * Does not change skb->protocol so this function can be used during receive.   */ -static inline int __vlan_insert_tag(struct sk_buff *skb, -				    __be16 vlan_proto, u16 vlan_tci) +static inline int __vlan_insert_inner_tag(struct sk_buff *skb, +					  __be16 vlan_proto, u16 vlan_tci, +					  unsigned int mac_len)  {  	struct vlan_ethhdr *veth;  	if (skb_cow_head(skb, VLAN_HLEN) < 0)  		return -ENOMEM; -	veth = skb_push(skb, VLAN_HLEN); +	skb_push(skb, VLAN_HLEN); -	/* Move the mac addresses to the beginning of the new header. */ -	memmove(skb->data, skb->data + VLAN_HLEN, 2 * ETH_ALEN); +	/* Move the mac header sans proto to the beginning of the new header. */ +	memmove(skb->data, skb->data + VLAN_HLEN, mac_len - ETH_TLEN);  	skb->mac_header -= VLAN_HLEN; +	veth = (struct vlan_ethhdr *)(skb->data + mac_len - ETH_HLEN); +  	/* first, the ethernet type */  	veth->h_vlan_proto = vlan_proto; @@ -334,12 +338,30 @@ static inline int __vlan_insert_tag(struct sk_buff *skb,  }  /** - * vlan_insert_tag - regular VLAN tag inserting + * __vlan_insert_tag - regular VLAN tag inserting   * @skb: skbuff to tag   * @vlan_proto: VLAN encapsulation protocol   * @vlan_tci: VLAN TCI to insert   *   * Inserts the VLAN tag into @skb as part of the payload + * Returns error if skb_cow_head failes. + * + * Does not change skb->protocol so this function can be used during receive. + */ +static inline int __vlan_insert_tag(struct sk_buff *skb, +				    __be16 vlan_proto, u16 vlan_tci) +{ +	return __vlan_insert_inner_tag(skb, vlan_proto, vlan_tci, ETH_HLEN); +} + +/** + * vlan_insert_inner_tag - inner VLAN tag inserting + * @skb: skbuff to tag + * @vlan_proto: VLAN encapsulation protocol + * @vlan_tci: VLAN TCI to insert + * @mac_len: MAC header length including outer vlan headers + * + * Inserts the VLAN tag into @skb as part of the payload at offset mac_len   * Returns a VLAN tagged skb. If a new skb is created, @skb is freed.   *   * Following the skb_unshare() example, in case of error, the calling function @@ -347,12 +369,14 @@ static inline int __vlan_insert_tag(struct sk_buff *skb,   *   * Does not change skb->protocol so this function can be used during receive.   */ -static inline struct sk_buff *vlan_insert_tag(struct sk_buff *skb, -					      __be16 vlan_proto, u16 vlan_tci) +static inline struct sk_buff *vlan_insert_inner_tag(struct sk_buff *skb, +						    __be16 vlan_proto, +						    u16 vlan_tci, +						    unsigned int mac_len)  {  	int err; -	err = __vlan_insert_tag(skb, vlan_proto, vlan_tci); +	err = __vlan_insert_inner_tag(skb, vlan_proto, vlan_tci, mac_len);  	if (err) {  		dev_kfree_skb_any(skb);  		return NULL; @@ -361,6 +385,26 @@ static inline struct sk_buff *vlan_insert_tag(struct sk_buff *skb,  }  /** + * vlan_insert_tag - regular VLAN tag inserting + * @skb: skbuff to tag + * @vlan_proto: VLAN encapsulation protocol + * @vlan_tci: VLAN TCI to insert + * + * Inserts the VLAN tag into @skb as part of the payload + * Returns a VLAN tagged skb. If a new skb is created, @skb is freed. + * + * Following the skb_unshare() example, in case of error, the calling function + * doesn't have to worry about freeing the original skb. + * + * Does not change skb->protocol so this function can be used during receive. + */ +static inline struct sk_buff *vlan_insert_tag(struct sk_buff *skb, +					      __be16 vlan_proto, u16 vlan_tci) +{ +	return vlan_insert_inner_tag(skb, vlan_proto, vlan_tci, ETH_HLEN); +} + +/**   * vlan_insert_tag_set_proto - regular VLAN tag inserting   * @skb: skbuff to tag   * @vlan_proto: VLAN encapsulation protocol diff --git a/include/linux/init.h b/include/linux/init.h index 506a98151131..bc27cf03c41e 100644 --- a/include/linux/init.h +++ b/include/linux/init.h @@ -6,10 +6,10 @@  #include <linux/types.h>  /* Built-in __init functions needn't be compiled with retpoline */ -#if defined(RETPOLINE) && !defined(MODULE) -#define __noretpoline __attribute__((indirect_branch("keep"))) +#if defined(__noretpoline) && !defined(MODULE) +#define __noinitretpoline __noretpoline  #else -#define __noretpoline +#define __noinitretpoline  #endif  /* These macros are used to mark some functions or  @@ -47,7 +47,7 @@  /* These are for everybody (although not all archs will actually     discard it in modules) */ -#define __init		__section(.init.text) __cold  __latent_entropy __noretpoline +#define __init		__section(.init.text) __cold  __latent_entropy __noinitretpoline  #define __initdata	__section(.init.data)  #define __initconst	__section(.init.rodata)  #define __exitdata	__section(.exit.data) diff --git a/include/linux/irqchip/arm-gic-v3.h b/include/linux/irqchip/arm-gic-v3.h index c00c4c33e432..b26eccc78fb1 100644 --- a/include/linux/irqchip/arm-gic-v3.h +++ b/include/linux/irqchip/arm-gic-v3.h @@ -503,6 +503,7 @@  #define ICH_HCR_EN			(1 << 0)  #define ICH_HCR_UIE			(1 << 1) +#define ICH_HCR_NPIE			(1 << 3)  #define ICH_HCR_TC			(1 << 10)  #define ICH_HCR_TALL0			(1 << 11)  #define ICH_HCR_TALL1			(1 << 12) diff --git a/include/linux/irqchip/arm-gic.h b/include/linux/irqchip/arm-gic.h index d3453ee072fc..68d8b1f73682 100644 --- a/include/linux/irqchip/arm-gic.h +++ b/include/linux/irqchip/arm-gic.h @@ -84,6 +84,7 @@  #define GICH_HCR_EN			(1 << 0)  #define GICH_HCR_UIE			(1 << 1) +#define GICH_HCR_NPIE			(1 << 3)  #define GICH_LR_VIRTUALID		(0x3ff << 0)  #define GICH_LR_PHYSID_CPUID_SHIFT	(10) diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h index b6a29c126cc4..b46b541c67c4 100644 --- a/include/linux/jump_label.h +++ b/include/linux/jump_label.h @@ -151,6 +151,7 @@ extern struct jump_entry __start___jump_table[];  extern struct jump_entry __stop___jump_table[];  extern void jump_label_init(void); +extern void jump_label_invalidate_initmem(void);  extern void jump_label_lock(void);  extern void jump_label_unlock(void);  extern void arch_jump_label_transform(struct jump_entry *entry, @@ -198,6 +199,8 @@ static __always_inline void jump_label_init(void)  	static_key_initialized = true;  } +static inline void jump_label_invalidate_initmem(void) {} +  static __always_inline bool static_key_false(struct static_key *key)  {  	if (unlikely(static_key_count(key) > 0)) diff --git a/include/linux/kconfig.h b/include/linux/kconfig.h index fec5076eda91..dcde9471897d 100644 --- a/include/linux/kconfig.h +++ b/include/linux/kconfig.h @@ -4,6 +4,12 @@  #include <generated/autoconf.h> +#ifdef CONFIG_CPU_BIG_ENDIAN +#define __BIG_ENDIAN 4321 +#else +#define __LITTLE_ENDIAN 1234 +#endif +  #define __ARG_PLACEHOLDER_1 0,  #define __take_second_arg(__ignored, val, ...) val @@ -64,4 +70,7 @@   */  #define IS_ENABLED(option) __or(IS_BUILTIN(option), IS_MODULE(option)) +/* Make sure we always have all types and struct attributes defined. */ +#include <linux/compiler_types.h> +  #endif /* __LINUX_KCONFIG_H */ diff --git a/include/linux/kcore.h b/include/linux/kcore.h index 7ff25a808fef..80db19d3a505 100644 --- a/include/linux/kcore.h +++ b/include/linux/kcore.h @@ -10,6 +10,7 @@ enum kcore_type {  	KCORE_VMALLOC,  	KCORE_RAM,  	KCORE_VMEMMAP, +	KCORE_USER,  	KCORE_OTHER,  }; diff --git a/include/linux/kernel.h b/include/linux/kernel.h index ce51455e2adf..3fd291503576 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h @@ -472,6 +472,7 @@ extern bool parse_option_str(const char *str, const char *option);  extern char *next_arg(char *args, char **param, char **val);  extern int core_kernel_text(unsigned long addr); +extern int init_kernel_text(unsigned long addr);  extern int core_kernel_data(unsigned long addr);  extern int __kernel_text_address(unsigned long addr);  extern int kernel_text_address(unsigned long addr); diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index ac0062b74aed..6930c63126c7 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -1105,7 +1105,6 @@ static inline void kvm_irq_routing_update(struct kvm *kvm)  {  }  #endif -void kvm_arch_irq_routing_update(struct kvm *kvm);  static inline int kvm_ioeventfd(struct kvm *kvm, struct kvm_ioeventfd *args)  { @@ -1114,6 +1113,8 @@ static inline int kvm_ioeventfd(struct kvm *kvm, struct kvm_ioeventfd *args)  #endif /* CONFIG_HAVE_KVM_EVENTFD */ +void kvm_arch_irq_routing_update(struct kvm *kvm); +  static inline void kvm_make_request(int req, struct kvm_vcpu *vcpu)  {  	/* @@ -1272,4 +1273,7 @@ static inline long kvm_arch_vcpu_async_ioctl(struct file *filp,  }  #endif /* CONFIG_HAVE_KVM_VCPU_ASYNC_IOCTL */ +void kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm, +		unsigned long start, unsigned long end); +  #endif diff --git a/include/linux/memblock.h b/include/linux/memblock.h index 8be5077efb5f..f92ea7783652 100644 --- a/include/linux/memblock.h +++ b/include/linux/memblock.h @@ -187,7 +187,6 @@ int memblock_search_pfn_nid(unsigned long pfn, unsigned long *start_pfn,  			    unsigned long  *end_pfn);  void __next_mem_pfn_range(int *idx, int nid, unsigned long *out_start_pfn,  			  unsigned long *out_end_pfn, int *out_nid); -unsigned long memblock_next_valid_pfn(unsigned long pfn, unsigned long max_pfn);  /**   * for_each_mem_pfn_range - early memory pfn range iterator diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index 882046863581..c46016bb25eb 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h @@ -523,9 +523,11 @@ static inline void __mod_memcg_state(struct mem_cgroup *memcg,  static inline void mod_memcg_state(struct mem_cgroup *memcg,  				   int idx, int val)  { -	preempt_disable(); +	unsigned long flags; + +	local_irq_save(flags);  	__mod_memcg_state(memcg, idx, val); -	preempt_enable(); +	local_irq_restore(flags);  }  /** @@ -606,9 +608,11 @@ static inline void __mod_lruvec_state(struct lruvec *lruvec,  static inline void mod_lruvec_state(struct lruvec *lruvec,  				    enum node_stat_item idx, int val)  { -	preempt_disable(); +	unsigned long flags; + +	local_irq_save(flags);  	__mod_lruvec_state(lruvec, idx, val); -	preempt_enable(); +	local_irq_restore(flags);  }  static inline void __mod_lruvec_page_state(struct page *page, @@ -630,9 +634,11 @@ static inline void __mod_lruvec_page_state(struct page *page,  static inline void mod_lruvec_page_state(struct page *page,  					 enum node_stat_item idx, int val)  { -	preempt_disable(); +	unsigned long flags; + +	local_irq_save(flags);  	__mod_lruvec_page_state(page, idx, val); -	preempt_enable(); +	local_irq_restore(flags);  }  unsigned long mem_cgroup_soft_limit_reclaim(pg_data_t *pgdat, int order, @@ -659,9 +665,11 @@ static inline void __count_memcg_events(struct mem_cgroup *memcg,  static inline void count_memcg_events(struct mem_cgroup *memcg,  				      int idx, unsigned long count)  { -	preempt_disable(); +	unsigned long flags; + +	local_irq_save(flags);  	__count_memcg_events(memcg, idx, count); -	preempt_enable(); +	local_irq_restore(flags);  }  /* idx can be of type enum memcg_event_item or vm_event_item */ diff --git a/include/linux/mlx5/driver.h b/include/linux/mlx5/driver.h index 6ed79a8a8318..9d3a03364e6e 100644 --- a/include/linux/mlx5/driver.h +++ b/include/linux/mlx5/driver.h @@ -453,8 +453,8 @@ struct mlx5_core_srq {  	struct mlx5_core_rsc_common	common; /* must be first */  	u32		srqn;  	int		max; -	int		max_gs; -	int		max_avail_gather; +	size_t		max_gs; +	size_t		max_avail_gather;  	int		wqe_shift;  	void (*event)	(struct mlx5_core_srq *, enum mlx5_event); diff --git a/include/linux/mm_inline.h b/include/linux/mm_inline.h index c30b32e3c862..10191c28fc04 100644 --- a/include/linux/mm_inline.h +++ b/include/linux/mm_inline.h @@ -127,10 +127,4 @@ static __always_inline enum lru_list page_lru(struct page *page)  #define lru_to_page(head) (list_entry((head)->prev, struct page, lru)) -#ifdef arch_unmap_kpfn -extern void arch_unmap_kpfn(unsigned long pfn); -#else -static __always_inline void arch_unmap_kpfn(unsigned long pfn) { } -#endif -  #endif diff --git a/include/linux/mutex.h b/include/linux/mutex.h index f25c13423bd4..cb3bbed4e633 100644 --- a/include/linux/mutex.h +++ b/include/linux/mutex.h @@ -66,6 +66,11 @@ struct mutex {  #endif  }; +/* + * Internal helper function; C doesn't allow us to hide it :/ + * + * DO NOT USE (outside of mutex code). + */  static inline struct task_struct *__mutex_owner(struct mutex *lock)  {  	return (struct task_struct *)(atomic_long_read(&lock->owner) & ~0x07); diff --git a/include/linux/net.h b/include/linux/net.h index 91216b16feb7..2a0391eea05c 100644 --- a/include/linux/net.h +++ b/include/linux/net.h @@ -222,6 +222,7 @@ enum {  int sock_wake_async(struct socket_wq *sk_wq, int how, int band);  int sock_register(const struct net_proto_family *fam);  void sock_unregister(int family); +bool sock_is_registered(int family);  int __sock_create(struct net *net, int family, int type, int proto,  		  struct socket **res, int kern);  int sock_create(int family, int type, int proto, struct socket **res); diff --git a/include/linux/netfilter/x_tables.h b/include/linux/netfilter/x_tables.h index 1313b35c3ab7..14529511c4b8 100644 --- a/include/linux/netfilter/x_tables.h +++ b/include/linux/netfilter/x_tables.h @@ -285,6 +285,8 @@ unsigned int *xt_alloc_entry_offsets(unsigned int size);  bool xt_find_jump_offset(const unsigned int *offsets,  			 unsigned int target, unsigned int size); +int xt_check_proc_name(const char *name, unsigned int size); +  int xt_check_match(struct xt_mtchk_param *, unsigned int size, u_int8_t proto,  		   bool inv_proto);  int xt_check_target(struct xt_tgchk_param *, unsigned int size, u_int8_t proto, diff --git a/include/linux/nospec.h b/include/linux/nospec.h index b99bced39ac2..e791ebc65c9c 100644 --- a/include/linux/nospec.h +++ b/include/linux/nospec.h @@ -5,6 +5,7 @@  #ifndef _LINUX_NOSPEC_H  #define _LINUX_NOSPEC_H +#include <asm/barrier.h>  /**   * array_index_mask_nospec() - generate a ~0 mask when index < size, 0 otherwise @@ -20,20 +21,6 @@ static inline unsigned long array_index_mask_nospec(unsigned long index,  						    unsigned long size)  {  	/* -	 * Warn developers about inappropriate array_index_nospec() usage. -	 * -	 * Even if the CPU speculates past the WARN_ONCE branch, the -	 * sign bit of @index is taken into account when generating the -	 * mask. -	 * -	 * This warning is compiled out when the compiler can infer that -	 * @index and @size are less than LONG_MAX. -	 */ -	if (WARN_ONCE(index > LONG_MAX || size > LONG_MAX, -			"array_index_nospec() limited to range of [0, LONG_MAX]\n")) -		return 0; - -	/*  	 * Always calculate and emit the mask even if the compiler  	 * thinks the mask is not needed. The compiler does not take  	 * into account the value of @index under speculation. @@ -66,7 +53,6 @@ static inline unsigned long array_index_mask_nospec(unsigned long index,  	BUILD_BUG_ON(sizeof(_i) > sizeof(long));			\  	BUILD_BUG_ON(sizeof(_s) > sizeof(long));			\  									\ -	_i &= _mask;							\ -	_i;								\ +	(typeof(_i)) (_i & _mask);					\  })  #endif /* _LINUX_NOSPEC_H */ diff --git a/include/linux/of_pci.h b/include/linux/of_pci.h index 88865e0ebf4d..091033a6b836 100644 --- a/include/linux/of_pci.h +++ b/include/linux/of_pci.h @@ -13,7 +13,6 @@ struct device_node;  struct device_node *of_pci_find_child_device(struct device_node *parent,  					     unsigned int devfn);  int of_pci_get_devfn(struct device_node *np); -int of_irq_parse_and_map_pci(const struct pci_dev *dev, u8 slot, u8 pin);  int of_pci_parse_bus_range(struct device_node *node, struct resource *res);  int of_get_pci_domain_nr(struct device_node *node);  int of_pci_get_max_link_speed(struct device_node *node); @@ -34,12 +33,6 @@ static inline int of_pci_get_devfn(struct device_node *np)  }  static inline int -of_irq_parse_and_map_pci(const struct pci_dev *dev, u8 slot, u8 pin) -{ -	return 0; -} - -static inline int  of_pci_parse_bus_range(struct device_node *node, struct resource *res)  {  	return -EINVAL; @@ -67,6 +60,16 @@ of_pci_get_max_link_speed(struct device_node *node)  static inline void of_pci_check_probe_only(void) { }  #endif +#if IS_ENABLED(CONFIG_OF_IRQ) +int of_irq_parse_and_map_pci(const struct pci_dev *dev, u8 slot, u8 pin); +#else +static inline int +of_irq_parse_and_map_pci(const struct pci_dev *dev, u8 slot, u8 pin) +{ +	return 0; +} +#endif +  #if defined(CONFIG_OF_ADDRESS)  int of_pci_get_host_bridge_resources(struct device_node *dev,  			unsigned char busno, unsigned char bus_max, diff --git a/include/linux/percpu-refcount.h b/include/linux/percpu-refcount.h index 864d167a1073..009cdf3d65b6 100644 --- a/include/linux/percpu-refcount.h +++ b/include/linux/percpu-refcount.h @@ -30,10 +30,14 @@   * calls io_destroy() or the process exits.   *   * In the aio code, kill_ioctx() is called when we wish to destroy a kioctx; it - * calls percpu_ref_kill(), then hlist_del_rcu() and synchronize_rcu() to remove - * the kioctx from the proccess's list of kioctxs - after that, there can't be - * any new users of the kioctx (from lookup_ioctx()) and it's then safe to drop - * the initial ref with percpu_ref_put(). + * removes the kioctx from the proccess's table of kioctxs and kills percpu_ref. + * After that, there can't be any new users of the kioctx (from lookup_ioctx()) + * and it's then safe to drop the initial ref with percpu_ref_put(). + * + * Note that the free path, free_ioctx(), needs to go through explicit call_rcu() + * to synchronize with RCU protected lookup_ioctx().  percpu_ref operations don't + * imply RCU grace periods of any kind and if a user wants to combine percpu_ref + * with RCU protection, it must be done explicitly.   *   * Code that does a two stage shutdown like this often needs some kind of   * explicit synchronization to ensure the initial refcount can only be dropped @@ -113,8 +117,10 @@ void percpu_ref_reinit(struct percpu_ref *ref);   * Must be used to drop the initial ref on a percpu refcount; must be called   * precisely once before shutdown.   * - * Puts @ref in non percpu mode, then does a call_rcu() before gathering up the - * percpu counters and dropping the initial ref. + * Switches @ref into atomic mode before gathering up the percpu counters + * and dropping the initial ref. + * + * There are no implied RCU grace periods between kill and release.   */  static inline void percpu_ref_kill(struct percpu_ref *ref)  { diff --git a/include/linux/perf/arm_pmu.h b/include/linux/perf/arm_pmu.h index af0f44effd44..40036a57d072 100644 --- a/include/linux/perf/arm_pmu.h +++ b/include/linux/perf/arm_pmu.h @@ -14,26 +14,10 @@  #include <linux/interrupt.h>  #include <linux/perf_event.h> +#include <linux/platform_device.h>  #include <linux/sysfs.h>  #include <asm/cputype.h> -/* - * struct arm_pmu_platdata - ARM PMU platform data - * - * @handle_irq: an optional handler which will be called from the - *	interrupt and passed the address of the low level handler, - *	and can be used to implement any platform specific handling - *	before or after calling it. - * - * @irq_flags: if non-zero, these flags will be passed to request_irq - *             when requesting interrupts for this PMU device. - */ -struct arm_pmu_platdata { -	irqreturn_t (*handle_irq)(int irq, void *dev, -				  irq_handler_t pmu_handler); -	unsigned long irq_flags; -}; -  #ifdef CONFIG_ARM_PMU  /* @@ -92,7 +76,6 @@ enum armpmu_attr_groups {  struct arm_pmu {  	struct pmu	pmu; -	cpumask_t	active_irqs;  	cpumask_t	supported_cpus;  	char		*name;  	irqreturn_t	(*handle_irq)(int irq_num, void *dev); @@ -174,12 +157,11 @@ static inline int arm_pmu_acpi_probe(armpmu_init_fn init_fn) { return 0; }  /* Internal functions only for core arm_pmu code */  struct arm_pmu *armpmu_alloc(void); +struct arm_pmu *armpmu_alloc_atomic(void);  void armpmu_free(struct arm_pmu *pmu);  int armpmu_register(struct arm_pmu *pmu); -int armpmu_request_irqs(struct arm_pmu *armpmu); -void armpmu_free_irqs(struct arm_pmu *armpmu); -int armpmu_request_irq(struct arm_pmu *armpmu, int cpu); -void armpmu_free_irq(struct arm_pmu *armpmu, int cpu); +int armpmu_request_irq(int irq, int cpu); +void armpmu_free_irq(int irq, int cpu);  #define ARMV8_PMU_PDEV_NAME "armv8-pmu" diff --git a/include/linux/phy.h b/include/linux/phy.h index 5a0c3e53e7c2..7c4c2379e010 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h @@ -924,6 +924,7 @@ void phy_device_remove(struct phy_device *phydev);  int phy_init_hw(struct phy_device *phydev);  int phy_suspend(struct phy_device *phydev);  int phy_resume(struct phy_device *phydev); +int __phy_resume(struct phy_device *phydev);  int phy_loopback(struct phy_device *phydev, bool enable);  struct phy_device *phy_attach(struct net_device *dev, const char *bus_id,  			      phy_interface_t interface); @@ -983,6 +984,10 @@ static inline int genphy_no_soft_reset(struct phy_device *phydev)  {  	return 0;  } +int genphy_read_mmd_unsupported(struct phy_device *phdev, int devad, +				u16 regnum); +int genphy_write_mmd_unsupported(struct phy_device *phdev, int devnum, +				 u16 regnum, u16 val);  /* Clause 45 PHY */  int genphy_c45_restart_aneg(struct phy_device *phydev); @@ -1011,7 +1016,6 @@ int phy_driver_register(struct phy_driver *new_driver, struct module *owner);  int phy_drivers_register(struct phy_driver *new_driver, int n,  			 struct module *owner);  void phy_state_machine(struct work_struct *work); -void phy_change(struct phy_device *phydev);  void phy_change_work(struct work_struct *work);  void phy_mac_interrupt(struct phy_device *phydev);  void phy_start_machine(struct phy_device *phydev); diff --git a/include/linux/property.h b/include/linux/property.h index 769d372c1edf..2eea4b310fc2 100644 --- a/include/linux/property.h +++ b/include/linux/property.h @@ -283,7 +283,7 @@ bool device_dma_supported(struct device *dev);  enum dev_dma_attr device_get_dma_attr(struct device *dev); -void *device_get_match_data(struct device *dev); +const void *device_get_match_data(struct device *dev);  int device_get_phy_mode(struct device *dev); diff --git a/include/linux/ptr_ring.h b/include/linux/ptr_ring.h index b884b7794187..e6335227b844 100644 --- a/include/linux/ptr_ring.h +++ b/include/linux/ptr_ring.h @@ -469,7 +469,7 @@ static inline int ptr_ring_consume_batched_bh(struct ptr_ring *r,   */  static inline void **__ptr_ring_init_queue_alloc(unsigned int size, gfp_t gfp)  { -	if (size * sizeof(void *) > KMALLOC_MAX_SIZE) +	if (size > KMALLOC_MAX_SIZE / sizeof(void *))  		return NULL;  	return kvmalloc_array(size, sizeof(void *), gfp | __GFP_ZERO);  } diff --git a/include/linux/rhashtable.h b/include/linux/rhashtable.h index c9df2527e0cd..668a21f04b09 100644 --- a/include/linux/rhashtable.h +++ b/include/linux/rhashtable.h @@ -766,8 +766,10 @@ slow_path:  		if (!key ||  		    (params.obj_cmpfn ?  		     params.obj_cmpfn(&arg, rht_obj(ht, head)) : -		     rhashtable_compare(&arg, rht_obj(ht, head)))) +		     rhashtable_compare(&arg, rht_obj(ht, head)))) { +			pprev = &head->next;  			continue; +		}  		data = rht_obj(ht, head); diff --git a/include/linux/sched/mm.h b/include/linux/sched/mm.h index 1149533aa2fa..9806184bb3d5 100644 --- a/include/linux/sched/mm.h +++ b/include/linux/sched/mm.h @@ -36,7 +36,18 @@ static inline void mmgrab(struct mm_struct *mm)  	atomic_inc(&mm->mm_count);  } -extern void mmdrop(struct mm_struct *mm); +extern void __mmdrop(struct mm_struct *mm); + +static inline void mmdrop(struct mm_struct *mm) +{ +	/* +	 * The implicit full barrier implied by atomic_dec_and_test() is +	 * required by the membarrier system call before returning to +	 * user-space, after storing to rq->curr. +	 */ +	if (unlikely(atomic_dec_and_test(&mm->mm_count))) +		__mmdrop(mm); +}  /**   * mmget() - Pin the address space associated with a &struct mm_struct. diff --git a/include/linux/sched/user.h b/include/linux/sched/user.h index 0dcf4e480ef7..96fe289c4c6e 100644 --- a/include/linux/sched/user.h +++ b/include/linux/sched/user.h @@ -4,6 +4,7 @@  #include <linux/uidgid.h>  #include <linux/atomic.h> +#include <linux/ratelimit.h>  struct key; @@ -41,6 +42,9 @@ struct user_struct {      defined(CONFIG_NET)  	atomic_long_t locked_vm;  #endif + +	/* Miscellaneous per-user rate limit */ +	struct ratelimit_state ratelimit;  };  extern int uids_sysfs_init(void); diff --git a/include/linux/semaphore.h b/include/linux/semaphore.h index dc368b8ce215..11c86fbfeb98 100644 --- a/include/linux/semaphore.h +++ b/include/linux/semaphore.h @@ -4,7 +4,7 @@   *   * Distributed under the terms of the GNU GPL, version 2   * - * Please see kernel/semaphore.c for documentation of these functions + * Please see kernel/locking/semaphore.c for documentation of these functions   */  #ifndef __LINUX_SEMAPHORE_H  #define __LINUX_SEMAPHORE_H diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 5ebc0f869720..99df17109e1b 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -3285,8 +3285,7 @@ int skb_zerocopy(struct sk_buff *to, struct sk_buff *from,  void skb_split(struct sk_buff *skb, struct sk_buff *skb1, const u32 len);  int skb_shift(struct sk_buff *tgt, struct sk_buff *skb, int shiftlen);  void skb_scrub_packet(struct sk_buff *skb, bool xnet); -unsigned int skb_gso_transport_seglen(const struct sk_buff *skb); -bool skb_gso_validate_mtu(const struct sk_buff *skb, unsigned int mtu); +bool skb_gso_validate_network_len(const struct sk_buff *skb, unsigned int mtu);  bool skb_gso_validate_mac_len(const struct sk_buff *skb, unsigned int len);  struct sk_buff *skb_segment(struct sk_buff *skb, netdev_features_t features);  struct sk_buff *skb_vlan_untag(struct sk_buff *skb); @@ -3646,7 +3645,7 @@ static inline bool __skb_checksum_validate_needed(struct sk_buff *skb,  	return true;  } -/* For small packets <= CHECKSUM_BREAK peform checksum complete directly +/* For small packets <= CHECKSUM_BREAK perform checksum complete directly   * in checksum_init.   */  #define CHECKSUM_BREAK 76 @@ -4038,6 +4037,12 @@ static inline bool skb_is_gso_v6(const struct sk_buff *skb)  	return skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6;  } +/* Note: Should be called only if skb_is_gso(skb) is true */ +static inline bool skb_is_gso_sctp(const struct sk_buff *skb) +{ +	return skb_shinfo(skb)->gso_type & SKB_GSO_SCTP; +} +  static inline void skb_gso_reset(struct sk_buff *skb)  {  	skb_shinfo(skb)->gso_size = 0; @@ -4045,6 +4050,22 @@ static inline void skb_gso_reset(struct sk_buff *skb)  	skb_shinfo(skb)->gso_type = 0;  } +static inline void skb_increase_gso_size(struct skb_shared_info *shinfo, +					 u16 increment) +{ +	if (WARN_ON_ONCE(shinfo->gso_size == GSO_BY_FRAGS)) +		return; +	shinfo->gso_size += increment; +} + +static inline void skb_decrease_gso_size(struct skb_shared_info *shinfo, +					 u16 decrement) +{ +	if (WARN_ON_ONCE(shinfo->gso_size == GSO_BY_FRAGS)) +		return; +	shinfo->gso_size -= decrement; +} +  void __skb_warn_lro_forwarding(const struct sk_buff *skb);  static inline bool skb_warn_if_lro(const struct sk_buff *skb) @@ -4104,38 +4125,6 @@ static inline bool skb_head_is_locked(const struct sk_buff *skb)  	return !skb->head_frag || skb_cloned(skb);  } -/** - * skb_gso_network_seglen - Return length of individual segments of a gso packet - * - * @skb: GSO skb - * - * skb_gso_network_seglen is used to determine the real size of the - * individual segments, including Layer3 (IP, IPv6) and L4 headers (TCP/UDP). - * - * The MAC/L2 header is not accounted for. - */ -static inline unsigned int skb_gso_network_seglen(const struct sk_buff *skb) -{ -	unsigned int hdr_len = skb_transport_header(skb) - -			       skb_network_header(skb); -	return hdr_len + skb_gso_transport_seglen(skb); -} - -/** - * skb_gso_mac_seglen - Return length of individual segments of a gso packet - * - * @skb: GSO skb - * - * skb_gso_mac_seglen is used to determine the real size of the - * individual segments, including MAC/L2, Layer3 (IP, IPv6) and L4 - * headers (TCP/UDP). - */ -static inline unsigned int skb_gso_mac_seglen(const struct sk_buff *skb) -{ -	unsigned int hdr_len = skb_transport_header(skb) - skb_mac_header(skb); -	return hdr_len + skb_gso_transport_seglen(skb); -} -  /* Local Checksum Offload.   * Compute outer checksum based on the assumption that the   * inner checksum will be offloaded later. diff --git a/include/linux/swap.h b/include/linux/swap.h index 7b6a59f722a3..a1a3f4ed94ce 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h @@ -337,8 +337,6 @@ extern void deactivate_file_page(struct page *page);  extern void mark_page_lazyfree(struct page *page);  extern void swap_setup(void); -extern void add_page_to_unevictable_list(struct page *page); -  extern void lru_cache_add_active_or_unevictable(struct page *page,  						struct vm_area_struct *vma); diff --git a/include/linux/tty.h b/include/linux/tty.h index 0a6c71e0ad01..47f8af22f216 100644 --- a/include/linux/tty.h +++ b/include/linux/tty.h @@ -364,6 +364,7 @@ struct tty_file_private {  #define TTY_PTY_LOCK 		16	/* pty private */  #define TTY_NO_WRITE_SPLIT 	17	/* Preserve write boundaries to driver */  #define TTY_HUPPED 		18	/* Post driver->hangup() */ +#define TTY_HUPPING		19	/* Hangup in progress */  #define TTY_LDISC_HALTED	22	/* Line discipline is halted */  /* Values for tty->flow_change */ diff --git a/include/linux/u64_stats_sync.h b/include/linux/u64_stats_sync.h index 5bdbd9f49395..07ee0f84a46c 100644 --- a/include/linux/u64_stats_sync.h +++ b/include/linux/u64_stats_sync.h @@ -90,6 +90,28 @@ static inline void u64_stats_update_end(struct u64_stats_sync *syncp)  #endif  } +static inline unsigned long +u64_stats_update_begin_irqsave(struct u64_stats_sync *syncp) +{ +	unsigned long flags = 0; + +#if BITS_PER_LONG==32 && defined(CONFIG_SMP) +	local_irq_save(flags); +	write_seqcount_begin(&syncp->seq); +#endif +	return flags; +} + +static inline void +u64_stats_update_end_irqrestore(struct u64_stats_sync *syncp, +				unsigned long flags) +{ +#if BITS_PER_LONG==32 && defined(CONFIG_SMP) +	write_seqcount_end(&syncp->seq); +	local_irq_restore(flags); +#endif +} +  static inline void u64_stats_update_begin_raw(struct u64_stats_sync *syncp)  {  #if BITS_PER_LONG==32 && defined(CONFIG_SMP) diff --git a/include/linux/usb/quirks.h b/include/linux/usb/quirks.h index f1fcec2fd5f8..b7a99ce56bc9 100644 --- a/include/linux/usb/quirks.h +++ b/include/linux/usb/quirks.h @@ -63,4 +63,7 @@   */  #define USB_QUIRK_DISCONNECT_SUSPEND		BIT(12) +/* Device needs a pause after every control message. */ +#define USB_QUIRK_DELAY_CTRL_MSG		BIT(13) +  #endif /* __LINUX_USB_QUIRKS_H */ diff --git a/include/linux/workqueue.h b/include/linux/workqueue.h index 4a54ef96aff5..0c3301421c57 100644 --- a/include/linux/workqueue.h +++ b/include/linux/workqueue.h @@ -456,7 +456,6 @@ extern int schedule_on_each_cpu(work_func_t func);  int execute_in_process_context(work_func_t fn, struct execute_work *);  extern bool flush_work(struct work_struct *work); -extern bool cancel_work(struct work_struct *work);  extern bool cancel_work_sync(struct work_struct *work);  extern bool flush_delayed_work(struct delayed_work *dwork); @@ -465,6 +464,7 @@ extern bool cancel_delayed_work_sync(struct delayed_work *dwork);  extern void workqueue_set_max_active(struct workqueue_struct *wq,  				     int max_active); +extern struct work_struct *current_work(void);  extern bool current_is_workqueue_rescuer(void);  extern bool workqueue_congested(int cpu, struct workqueue_struct *wq);  extern unsigned int work_busy(struct work_struct *work);  | 

