Applied assortment of Arch Linux ARM patches
This commit is contained in:
		
							parent
							
								
									25c6d769f4
								
							
						
					
					
						commit
						4822424518
					
				| @ -45,7 +45,7 @@ void *return_address(unsigned int); | |||||||
| 
 | 
 | ||||||
| #else | #else | ||||||
| 
 | 
 | ||||||
| extern inline void *return_address(unsigned int level) | static inline void *return_address(unsigned int level) | ||||||
| { | { | ||||||
| 	return NULL; | 	return NULL; | ||||||
| } | } | ||||||
|  | |||||||
| @ -15,7 +15,7 @@ | |||||||
| 
 | 
 | ||||||
| #include <uapi/asm/unistd.h> | #include <uapi/asm/unistd.h> | ||||||
| 
 | 
 | ||||||
| #define __NR_syscalls  (384) | #define __NR_syscalls  (388) | ||||||
| #define __ARM_NR_cmpxchg		(__ARM_NR_BASE+0x00fff0) | #define __ARM_NR_cmpxchg		(__ARM_NR_BASE+0x00fff0) | ||||||
| 
 | 
 | ||||||
| #define __ARCH_WANT_STAT64 | #define __ARCH_WANT_STAT64 | ||||||
|  | |||||||
| @ -410,6 +410,7 @@ | |||||||
| #define __NR_sched_getattr		(__NR_SYSCALL_BASE+381) | #define __NR_sched_getattr		(__NR_SYSCALL_BASE+381) | ||||||
| #define __NR_renameat2			(__NR_SYSCALL_BASE+382) | #define __NR_renameat2			(__NR_SYSCALL_BASE+382) | ||||||
| #define __NR_seccomp			(__NR_SYSCALL_BASE+383) | #define __NR_seccomp			(__NR_SYSCALL_BASE+383) | ||||||
|  | #define __NR_getrandom			(__NR_SYSCALL_BASE+384) | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * This may need to be greater than __NR_last_syscall+1 in order to |  * This may need to be greater than __NR_last_syscall+1 in order to | ||||||
|  | |||||||
| @ -393,6 +393,7 @@ | |||||||
| 		CALL(sys_ni_syscall) /* CALL(sys_sched_getattr) */ | 		CALL(sys_ni_syscall) /* CALL(sys_sched_getattr) */ | ||||||
| 		CALL(sys_ni_syscall) /* CALL(sys_renameat2) */ | 		CALL(sys_ni_syscall) /* CALL(sys_renameat2) */ | ||||||
| 		CALL(sys_seccomp) | 		CALL(sys_seccomp) | ||||||
|  | 		CALL(sys_getrandom) | ||||||
| #ifndef syscalls_counted | #ifndef syscalls_counted | ||||||
| .equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls | .equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls | ||||||
| #define syscalls_counted | #define syscalls_counted | ||||||
|  | |||||||
| @ -63,10 +63,12 @@ void *return_address(unsigned int level) | |||||||
| #warning "TODO: return_address should use unwind tables" | #warning "TODO: return_address should use unwind tables" | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | /*
 | ||||||
| void *return_address(unsigned int level) | void *return_address(unsigned int level) | ||||||
| { | { | ||||||
| 	return NULL; | 	return NULL; | ||||||
| } | } | ||||||
|  | */ | ||||||
| 
 | 
 | ||||||
| #endif /* if defined(CONFIG_FRAME_POINTER) && !defined(CONFIG_ARM_UNWIND) / else */ | #endif /* if defined(CONFIG_FRAME_POINTER) && !defined(CONFIG_ARM_UNWIND) / else */ | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -361,3 +361,4 @@ | |||||||
| 352	i386	sched_getattr		sys_ni_syscall | 352	i386	sched_getattr		sys_ni_syscall | ||||||
| 353	i386	renameat2		sys_ni_syscall | 353	i386	renameat2		sys_ni_syscall | ||||||
| 354	i386	seccomp			sys_seccomp | 354	i386	seccomp			sys_seccomp | ||||||
|  | 355	i386	getrandom		sys_getrandom | ||||||
|  | |||||||
| @ -324,6 +324,7 @@ | |||||||
| 315	common	sched_getattr		sys_ni_syscall | 315	common	sched_getattr		sys_ni_syscall | ||||||
| 316	common	renameat2		sys_ni_syscall | 316	common	renameat2		sys_ni_syscall | ||||||
| 317	common	seccomp			sys_seccomp | 317	common	seccomp			sys_seccomp | ||||||
|  | 318	common	getrandom		sys_getrandom | ||||||
| 
 | 
 | ||||||
| # | # | ||||||
| # x32-specific system call numbers start at 512 to avoid cache impact | # x32-specific system call numbers start at 512 to avoid cache impact | ||||||
|  | |||||||
| @ -23,14 +23,16 @@ static int regcache_rbtree_write(struct regmap *map, unsigned int reg, | |||||||
| static int regcache_rbtree_exit(struct regmap *map); | static int regcache_rbtree_exit(struct regmap *map); | ||||||
| 
 | 
 | ||||||
| struct regcache_rbtree_node { | struct regcache_rbtree_node { | ||||||
| 	/* the actual rbtree node holding this block */ |  | ||||||
| 	struct rb_node node; |  | ||||||
| 	/* base register handled by this block */ |  | ||||||
| 	unsigned int base_reg; |  | ||||||
| 	/* block of adjacent registers */ | 	/* block of adjacent registers */ | ||||||
| 	void *block; | 	void *block; | ||||||
|  | 	/* Which registers are present */ | ||||||
|  | 	long *cache_present; | ||||||
|  | 	/* base register handled by this block */ | ||||||
|  | 	unsigned int base_reg; | ||||||
| 	/* number of registers available in the block */ | 	/* number of registers available in the block */ | ||||||
| 	unsigned int blklen; | 	unsigned int blklen; | ||||||
|  | 	/* the actual rbtree node holding this block */ | ||||||
|  | 	struct rb_node node; | ||||||
| } __attribute__ ((packed)); | } __attribute__ ((packed)); | ||||||
| 
 | 
 | ||||||
| struct regcache_rbtree_ctx { | struct regcache_rbtree_ctx { | ||||||
|  | |||||||
| @ -265,6 +265,9 @@ | |||||||
| #include <asm/irq.h> | #include <asm/irq.h> | ||||||
| #include <asm/irq_regs.h> | #include <asm/irq_regs.h> | ||||||
| #include <asm/io.h> | #include <asm/io.h> | ||||||
|  | #include <linux/syscalls.h> | ||||||
|  | #include <linux/completion.h> | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| #define CREATE_TRACE_POINTS | #define CREATE_TRACE_POINTS | ||||||
| #include <trace/events/random.h> | #include <trace/events/random.h> | ||||||
| @ -397,6 +400,7 @@ static struct poolinfo { | |||||||
|  */ |  */ | ||||||
| static DECLARE_WAIT_QUEUE_HEAD(random_read_wait); | static DECLARE_WAIT_QUEUE_HEAD(random_read_wait); | ||||||
| static DECLARE_WAIT_QUEUE_HEAD(random_write_wait); | static DECLARE_WAIT_QUEUE_HEAD(random_write_wait); | ||||||
|  | static DECLARE_WAIT_QUEUE_HEAD(urandom_init_wait); | ||||||
| static struct fasync_struct *fasync; | static struct fasync_struct *fasync; | ||||||
| 
 | 
 | ||||||
| static bool debug; | static bool debug; | ||||||
| @ -606,8 +610,11 @@ retry: | |||||||
| 
 | 
 | ||||||
| 	if (!r->initialized && nbits > 0) { | 	if (!r->initialized && nbits > 0) { | ||||||
| 		r->entropy_total += nbits; | 		r->entropy_total += nbits; | ||||||
| 		if (r->entropy_total > 128) | 		if (r->entropy_total > 128) { | ||||||
| 			r->initialized = 1; | 			r->initialized = 1; | ||||||
|  | 			if (r == &nonblocking_pool) | ||||||
|  | 				prandom_reseed_late(); | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	trace_credit_entropy_bits(r->name, nbits, entropy_count, | 	trace_credit_entropy_bits(r->name, nbits, entropy_count, | ||||||
| @ -1015,13 +1022,14 @@ static ssize_t extract_entropy_user(struct entropy_store *r, void __user *buf, | |||||||
| { | { | ||||||
| 	ssize_t ret = 0, i; | 	ssize_t ret = 0, i; | ||||||
| 	__u8 tmp[EXTRACT_SIZE]; | 	__u8 tmp[EXTRACT_SIZE]; | ||||||
|  |     int large_request = (nbytes > 256); | ||||||
| 
 | 
 | ||||||
| 	trace_extract_entropy_user(r->name, nbytes, r->entropy_count, _RET_IP_); | 	trace_extract_entropy_user(r->name, nbytes, r->entropy_count, _RET_IP_); | ||||||
| 	xfer_secondary_pool(r, nbytes); | 	xfer_secondary_pool(r, nbytes); | ||||||
| 	nbytes = account(r, nbytes, 0, 0); | 	nbytes = account(r, nbytes, 0, 0); | ||||||
| 
 | 
 | ||||||
| 	while (nbytes) { | 	while (nbytes) { | ||||||
| 		if (need_resched()) { | 		if (large_request && need_resched()) { | ||||||
| 			if (signal_pending(current)) { | 			if (signal_pending(current)) { | ||||||
| 				if (ret == 0) | 				if (ret == 0) | ||||||
| 					ret = -ERESTARTSYS; | 					ret = -ERESTARTSYS; | ||||||
| @ -1155,8 +1163,7 @@ void rand_initialize_disk(struct gendisk *disk) | |||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| static ssize_t | static ssize_t | ||||||
| random_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos) | _random_read(int nonblock, char __user *buf, size_t nbytes){ | ||||||
| { |  | ||||||
| 	ssize_t n, retval = 0, count = 0; | 	ssize_t n, retval = 0, count = 0; | ||||||
| 
 | 
 | ||||||
| 	if (nbytes == 0) | 	if (nbytes == 0) | ||||||
| @ -1180,7 +1187,7 @@ random_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos) | |||||||
| 			  n*8, (nbytes-n)*8); | 			  n*8, (nbytes-n)*8); | ||||||
| 
 | 
 | ||||||
| 		if (n == 0) { | 		if (n == 0) { | ||||||
| 			if (file->f_flags & O_NONBLOCK) { | 			if (nonblock) { | ||||||
| 				retval = -EAGAIN; | 				retval = -EAGAIN; | ||||||
| 				break; | 				break; | ||||||
| 			} | 			} | ||||||
| @ -1211,6 +1218,12 @@ random_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos) | |||||||
| 	return (count ? count : retval); | 	return (count ? count : retval); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static ssize_t | ||||||
|  | random_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos) | ||||||
|  | { | ||||||
|  | 	return _random_read(file->f_flags & O_NONBLOCK, buf, nbytes); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static ssize_t | static ssize_t | ||||||
| urandom_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos) | urandom_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos) | ||||||
| { | { | ||||||
| @ -1337,6 +1350,29 @@ const struct file_operations urandom_fops = { | |||||||
| 	.llseek = noop_llseek, | 	.llseek = noop_llseek, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | SYSCALL_DEFINE3(getrandom, char __user *, buf, size_t, count, | ||||||
|  | 		unsigned int, flags) | ||||||
|  | { | ||||||
|  | 	if (flags & ~(GRND_NONBLOCK|GRND_RANDOM)) | ||||||
|  | 		return -EINVAL; | ||||||
|  | 
 | ||||||
|  | 	if (count > INT_MAX) | ||||||
|  | 		count = INT_MAX; | ||||||
|  | 
 | ||||||
|  | 	if (flags & GRND_RANDOM) | ||||||
|  | 		return _random_read(flags & GRND_NONBLOCK, buf, count); | ||||||
|  | 
 | ||||||
|  | 	if (unlikely(nonblocking_pool.initialized == 0)) { | ||||||
|  | 		if (flags & GRND_NONBLOCK) | ||||||
|  | 			return -EAGAIN; | ||||||
|  | 		wait_event_interruptible(urandom_init_wait, | ||||||
|  | 					 nonblocking_pool.initialized); | ||||||
|  | 		if (signal_pending(current)) | ||||||
|  | 			return -ERESTARTSYS; | ||||||
|  | 	} | ||||||
|  | 	return urandom_read(NULL, buf, count, NULL); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /***************************************************************
 | /***************************************************************
 | ||||||
|  * Random UUID interface |  * Random UUID interface | ||||||
|  * |  * | ||||||
|  | |||||||
| @ -6212,7 +6212,7 @@ static int update_array_info(struct mddev *mddev, mdu_array_info_t *info) | |||||||
| 	    mddev->ctime         != info->ctime         || | 	    mddev->ctime         != info->ctime         || | ||||||
| 	    mddev->level         != info->level         || | 	    mddev->level         != info->level         || | ||||||
| /*	    mddev->layout        != info->layout        || */ | /*	    mddev->layout        != info->layout        || */ | ||||||
| 	    !mddev->persistent	 != info->not_persistent|| | 	    mddev->persistent	 == info->not_persistent|| | ||||||
| 	    mddev->chunk_sectors != info->chunk_size >> 9 || | 	    mddev->chunk_sectors != info->chunk_size >> 9 || | ||||||
| 	    /* ignore bottom 8 bits of state, and allow SB_BITMAP_PRESENT to change */ | 	    /* ignore bottom 8 bits of state, and allow SB_BITMAP_PRESENT to change */ | ||||||
| 	    ((state^info->state) & 0xfffffe00) | 	    ((state^info->state) & 0xfffffe00) | ||||||
|  | |||||||
| @ -1530,7 +1530,7 @@ static void imon_incoming_packet(struct imon_context *ictx, | |||||||
| 	if (kc == KEY_KEYBOARD && !ictx->release_code) { | 	if (kc == KEY_KEYBOARD && !ictx->release_code) { | ||||||
| 		ictx->last_keycode = kc; | 		ictx->last_keycode = kc; | ||||||
| 		if (!nomouse) { | 		if (!nomouse) { | ||||||
| 			ictx->pad_mouse = ~(ictx->pad_mouse) & 0x1; | 			ictx->pad_mouse = !ictx->pad_mouse; | ||||||
| 			dev_dbg(dev, "toggling to %s mode\n", | 			dev_dbg(dev, "toggling to %s mode\n", | ||||||
| 				ictx->pad_mouse ? "mouse" : "keyboard"); | 				ictx->pad_mouse ? "mouse" : "keyboard"); | ||||||
| 			spin_unlock_irqrestore(&ictx->kc_lock, flags); | 			spin_unlock_irqrestore(&ictx->kc_lock, flags); | ||||||
|  | |||||||
| @ -67,7 +67,7 @@ static int ec_get_version(struct cros_ec_device *ec, char *str, int maxlen) | |||||||
| 	} | 	} | ||||||
| 	if (resp.current_image >= ARRAY_SIZE(current_image_name)) | 	if (resp.current_image >= ARRAY_SIZE(current_image_name)) | ||||||
| 		resp.current_image = 3; /* invalid */ | 		resp.current_image = 3; /* invalid */ | ||||||
| 	snprintf(str, maxlen, "%s\n%s\n%s\n\%s\n", CROS_EC_DEV_VERSION, | 	snprintf(str, maxlen, "%s\n%s\n%s\n%s\n", CROS_EC_DEV_VERSION, | ||||||
| 		 resp.version_string_ro, resp.version_string_rw, | 		 resp.version_string_ro, resp.version_string_rw, | ||||||
| 		 current_image_name[resp.current_image]); | 		 current_image_name[resp.current_image]); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -244,7 +244,7 @@ static ssize_t store_rgb(struct device *dev, struct device_attribute *attr, | |||||||
| 	return (ok && i == 0) ? count : -EINVAL; | 	return (ok && i == 0) ? count : -EINVAL; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static const char const *seqname[] = { | static const char *seqname[] = { | ||||||
| 	"ERROR", "S5", "S3", "S0", "S5S3", "S3S0", | 	"ERROR", "S5", "S3", "S0", "S5S3", "S3S0", | ||||||
| 	"S0S3", "S3S5", "STOP", "RUN", "PULSE", "TEST", "KONAMI", | 	"S0S3", "S3S5", "STOP", "RUN", "PULSE", "TEST", "KONAMI", | ||||||
| }; | }; | ||||||
|  | |||||||
| @ -537,21 +537,6 @@ static void mwifiex_fw_dpc(const struct firmware *firmware, void *context) | |||||||
| 		goto err_add_intf; | 		goto err_add_intf; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/* Create AP interface by default */ |  | ||||||
| 	if (!mwifiex_add_virtual_intf(adapter->wiphy, "uap%d", |  | ||||||
| 				      NL80211_IFTYPE_AP, NULL, NULL)) { |  | ||||||
| 		mwifiex_dbg(adapter, ERROR, |  | ||||||
| 			    "cannot create default AP interface\n"); |  | ||||||
| 		goto err_add_intf; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	/* Create P2P interface by default */ |  | ||||||
| 	if (!mwifiex_add_virtual_intf(adapter->wiphy, "p2p%d", |  | ||||||
| 				      NL80211_IFTYPE_P2P_CLIENT, NULL, NULL)) { |  | ||||||
| 		mwifiex_dbg(adapter, ERROR, |  | ||||||
| 			    "cannot create default P2P interface\n"); |  | ||||||
| 		goto err_add_intf; |  | ||||||
| 	} |  | ||||||
| 	rtnl_unlock(); | 	rtnl_unlock(); | ||||||
| 
 | 
 | ||||||
| 	mwifiex_drv_get_driver_version(adapter, fmt, sizeof(fmt) - 1); | 	mwifiex_drv_get_driver_version(adapter, fmt, sizeof(fmt) - 1); | ||||||
|  | |||||||
| @ -30,9 +30,9 @@ | |||||||
| #include "main.h" | #include "main.h" | ||||||
| 
 | 
 | ||||||
| #define SD8786_DEFAULT_FW_NAME "mrvl/sd8786_uapsta.bin" | #define SD8786_DEFAULT_FW_NAME "mrvl/sd8786_uapsta.bin" | ||||||
| #define SD8787_DEFAULT_FW_NAME "mrvl/sd8787_uapsta.bin" | #define SD8787_DEFAULT_FW_NAME "mrvl/sd8787_uapsta_cros.bin" | ||||||
| #define SD8797_DEFAULT_FW_NAME "mrvl/sd8797_uapsta.bin" | #define SD8797_DEFAULT_FW_NAME "mrvl/sd8797_uapsta_cros.bin" | ||||||
| #define SD8897_DEFAULT_FW_NAME "mrvl/sd8897_uapsta.bin" | #define SD8897_DEFAULT_FW_NAME "mrvl/sd8897_uapsta_cros.bin" | ||||||
| 
 | 
 | ||||||
| #define BLOCK_MODE	1 | #define BLOCK_MODE	1 | ||||||
| #define BYTE_MODE	0 | #define BYTE_MODE	0 | ||||||
|  | |||||||
| @ -309,7 +309,6 @@ static void zd1201_usbrx(struct urb *urb) | |||||||
| 	if (data[urb->actual_length-1] == ZD1201_PACKET_RXDATA) { | 	if (data[urb->actual_length-1] == ZD1201_PACKET_RXDATA) { | ||||||
| 		int datalen = urb->actual_length-1; | 		int datalen = urb->actual_length-1; | ||||||
| 		unsigned short len, fc, seq; | 		unsigned short len, fc, seq; | ||||||
| 		struct hlist_node *node; |  | ||||||
| 
 | 
 | ||||||
| 		len = ntohs(*(__be16 *)&data[datalen-2]); | 		len = ntohs(*(__be16 *)&data[datalen-2]); | ||||||
| 		if (len>datalen) | 		if (len>datalen) | ||||||
| @ -362,7 +361,7 @@ static void zd1201_usbrx(struct urb *urb) | |||||||
| 				hlist_add_head(&frag->fnode, &zd->fraglist); | 				hlist_add_head(&frag->fnode, &zd->fraglist); | ||||||
| 				goto resubmit; | 				goto resubmit; | ||||||
| 			} | 			} | ||||||
| 			hlist_for_each_entry(frag, node, &zd->fraglist, fnode) | 			hlist_for_each_entry(frag, &zd->fraglist, fnode) | ||||||
| 				if (frag->seq == (seq&IEEE80211_SCTL_SEQ)) | 				if (frag->seq == (seq&IEEE80211_SCTL_SEQ)) | ||||||
| 					break; | 					break; | ||||||
| 			if (!frag) | 			if (!frag) | ||||||
| @ -1831,14 +1830,14 @@ err_zd: | |||||||
| static void zd1201_disconnect(struct usb_interface *interface) | static void zd1201_disconnect(struct usb_interface *interface) | ||||||
| { | { | ||||||
| 	struct zd1201 *zd = usb_get_intfdata(interface); | 	struct zd1201 *zd = usb_get_intfdata(interface); | ||||||
| 	struct hlist_node *node, *node2; | 	struct hlist_node *node2; | ||||||
| 	struct zd1201_frag *frag; | 	struct zd1201_frag *frag; | ||||||
| 
 | 
 | ||||||
| 	if (!zd) | 	if (!zd) | ||||||
| 		return; | 		return; | ||||||
| 	usb_set_intfdata(interface, NULL); | 	usb_set_intfdata(interface, NULL); | ||||||
| 
 | 
 | ||||||
| 	hlist_for_each_entry_safe(frag, node, node2, &zd->fraglist, fnode) { | 	hlist_for_each_entry_safe(frag, node2, &zd->fraglist, fnode) { | ||||||
| 		hlist_del_init(&frag->fnode); | 		hlist_del_init(&frag->fnode); | ||||||
| 		kfree_skb(frag->skb); | 		kfree_skb(frag->skb); | ||||||
| 		kfree(frag); | 		kfree(frag); | ||||||
|  | |||||||
| @ -77,7 +77,7 @@ | |||||||
| #define CONT_MODE_IR			2 | #define CONT_MODE_IR			2 | ||||||
| #define CONT_MODE_PROX			3 | #define CONT_MODE_PROX			3 | ||||||
| 
 | 
 | ||||||
| static const char const *isl29018_cont_modes[] = { | static const char *isl29018_cont_modes[] = { | ||||||
| 	"once", | 	"once", | ||||||
| 	"als", | 	"als", | ||||||
| 	"ir", | 	"ir", | ||||||
|  | |||||||
| @ -767,30 +767,35 @@ static int plugimage(struct imgchunk *fchunk, unsigned int nfchunks, | |||||||
| static int read_cardpda(struct pda *pda, wlandevice_t *wlandev) | static int read_cardpda(struct pda *pda, wlandevice_t *wlandev) | ||||||
| { | { | ||||||
| 	int result = 0; | 	int result = 0; | ||||||
| 	struct p80211msg_p2req_readpda msg; | 	struct p80211msg_p2req_readpda *msg; | ||||||
|  | 
 | ||||||
|  | 	msg = kzalloc(sizeof(*msg), GFP_KERNEL); | ||||||
|  | 	if (!msg) | ||||||
|  | 		return -ENOMEM; | ||||||
| 
 | 
 | ||||||
| 	/* set up the msg */ | 	/* set up the msg */ | ||||||
| 	msg.msgcode = DIDmsg_p2req_readpda; | 	msg->msgcode = DIDmsg_p2req_readpda; | ||||||
| 	msg.msglen = sizeof(msg); | 	msg->msglen = sizeof(msg); | ||||||
| 	strcpy(msg.devname, wlandev->name); | 	strcpy(msg->devname, wlandev->name); | ||||||
| 	msg.pda.did = DIDmsg_p2req_readpda_pda; | 	msg->pda.did = DIDmsg_p2req_readpda_pda; | ||||||
| 	msg.pda.len = HFA384x_PDA_LEN_MAX; | 	msg->pda.len = HFA384x_PDA_LEN_MAX; | ||||||
| 	msg.pda.status = P80211ENUM_msgitem_status_no_value; | 	msg->pda.status = P80211ENUM_msgitem_status_no_value; | ||||||
| 	msg.resultcode.did = DIDmsg_p2req_readpda_resultcode; | 	msg->resultcode.did = DIDmsg_p2req_readpda_resultcode; | ||||||
| 	msg.resultcode.len = sizeof(u32); | 	msg->resultcode.len = sizeof(u32); | ||||||
| 	msg.resultcode.status = P80211ENUM_msgitem_status_no_value; | 	msg->resultcode.status = P80211ENUM_msgitem_status_no_value; | ||||||
| 
 | 
 | ||||||
| 	if (prism2mgmt_readpda(wlandev, &msg) != 0) { | 	if (prism2mgmt_readpda(wlandev, msg) != 0) { | ||||||
| 		/* prism2mgmt_readpda prints an errno if appropriate */ | 		/* prism2mgmt_readpda prints an errno if appropriate */ | ||||||
| 		result = -1; | 		result = -1; | ||||||
| 	} else if (msg.resultcode.data == P80211ENUM_resultcode_success) { | 	} else if (msg->resultcode.data == P80211ENUM_resultcode_success) { | ||||||
| 		memcpy(pda->buf, msg.pda.data, HFA384x_PDA_LEN_MAX); | 		memcpy(pda->buf, msg->pda.data, HFA384x_PDA_LEN_MAX); | ||||||
| 		result = mkpdrlist(pda); | 		result = mkpdrlist(pda); | ||||||
| 	} else { | 	} else { | ||||||
| 		/* resultcode must've been something other than success */ | 		/* resultcode must've been something other than success */ | ||||||
| 		result = -1; | 		result = -1; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	kfree(msg); | ||||||
| 	return result; | 	return result; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1406,7 +1406,7 @@ static int soctherm_init_platform_data(struct platform_device *pdev) | |||||||
| 		therm = &plat_data->therm[tsensor2therm_map[i]]; | 		therm = &plat_data->therm[tsensor2therm_map[i]]; | ||||||
| 		s = &plat_data->sensor_data[i]; | 		s = &plat_data->sensor_data[i]; | ||||||
| 		s->sensor_enable = s->zone_enable; | 		s->sensor_enable = s->zone_enable; | ||||||
| 		s->sensor_enable = s->sensor_enable ?: therm->zone_enable; | 		s->sensor_enable = s->sensor_enable ? s->sensor_enable : therm->zone_enable; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/* Pdiv */ | 	/* Pdiv */ | ||||||
|  | |||||||
| @ -1129,7 +1129,7 @@ void fb_edid_add_monspecs(unsigned char *edid, struct fb_monspecs *specs) | |||||||
| 
 | 
 | ||||||
| 	for (i = 0; i < (128 - edid[2]) / DETAILED_TIMING_DESCRIPTION_SIZE; | 	for (i = 0; i < (128 - edid[2]) / DETAILED_TIMING_DESCRIPTION_SIZE; | ||||||
| 	     i++, block += DETAILED_TIMING_DESCRIPTION_SIZE) | 	     i++, block += DETAILED_TIMING_DESCRIPTION_SIZE) | ||||||
| 		if (PIXEL_CLOCK) | 		if (PIXEL_CLOCK != 0) | ||||||
| 			edt[num++] = block - edid; | 			edt[num++] = block - edid; | ||||||
| 
 | 
 | ||||||
| 	/* Yikes, EDID data is totally useless */ | 	/* Yikes, EDID data is totally useless */ | ||||||
|  | |||||||
| @ -387,7 +387,7 @@ static void remove_dir(struct dentry * d) | |||||||
| 	if (d->d_inode) | 	if (d->d_inode) | ||||||
| 		simple_rmdir(parent->d_inode,d); | 		simple_rmdir(parent->d_inode,d); | ||||||
| 
 | 
 | ||||||
| 	pr_debug(" o %s removing done (%d)\n",d->d_name.name, d->d_count); | 	pr_debug(" o %s removing done (%d)\n",d->d_name.name, d->d_lockref.count); | ||||||
| 
 | 
 | ||||||
| 	dput(parent); | 	dput(parent); | ||||||
| } | } | ||||||
|  | |||||||
| @ -1024,15 +1024,14 @@ killed: | |||||||
| 	return -EAGAIN; | 	return -EAGAIN; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| char *get_task_comm(char *buf, struct task_struct *tsk) | char *__get_task_comm(char *buf, size_t buf_size, struct task_struct *tsk) | ||||||
| { | { | ||||||
| 	/* buf must be at least sizeof(tsk->comm) in size */ |  | ||||||
| 	task_lock(tsk); | 	task_lock(tsk); | ||||||
| 	strncpy(buf, tsk->comm, sizeof(tsk->comm)); | 	strncpy(buf, tsk->comm, buf_size); | ||||||
| 	task_unlock(tsk); | 	task_unlock(tsk); | ||||||
| 	return buf; | 	return buf; | ||||||
| } | } | ||||||
| EXPORT_SYMBOL_GPL(get_task_comm); | EXPORT_SYMBOL_GPL(__get_task_comm); | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * These functions flushes out all traces of the currently running executable |  * These functions flushes out all traces of the currently running executable | ||||||
|  | |||||||
| @ -241,7 +241,7 @@ static int copy_name(char *buffer, const char *xattr_name, int name_len) | |||||||
| 	int offset = 0; | 	int offset = 0; | ||||||
| 
 | 
 | ||||||
| 	if (is_osx_xattr(xattr_name)) { | 	if (is_osx_xattr(xattr_name)) { | ||||||
| 		strncpy(buffer, XATTR_MAC_OSX_PREFIX, XATTR_MAC_OSX_PREFIX_LEN); | 		memcpy(buffer, XATTR_MAC_OSX_PREFIX, XATTR_MAC_OSX_PREFIX_LEN); | ||||||
| 		offset += XATTR_MAC_OSX_PREFIX_LEN; | 		offset += XATTR_MAC_OSX_PREFIX_LEN; | ||||||
| 		len += XATTR_MAC_OSX_PREFIX_LEN; | 		len += XATTR_MAC_OSX_PREFIX_LEN; | ||||||
| 	} | 	} | ||||||
|  | |||||||
| @ -1373,27 +1373,29 @@ static int nfs_volume_list_show(struct seq_file *m, void *v) | |||||||
| { | { | ||||||
| 	struct nfs_server *server; | 	struct nfs_server *server; | ||||||
| 	struct nfs_client *clp; | 	struct nfs_client *clp; | ||||||
| 	char dev[8], fsid[17]; | 	char dev[13];	// 8 for 2^24, 1 for ':', 3 for 2^8, 1 for '\0'
 | ||||||
|  | 	char fsid[34];	// 2 * 16 for %llx, 1 for ':', 1 for '\0'
 | ||||||
| 	struct nfs_net *nn = net_generic(m->private, nfs_net_id); | 	struct nfs_net *nn = net_generic(m->private, nfs_net_id); | ||||||
| 
 | 
 | ||||||
| 	/* display header on line 1 */ | 	/* display header on line 1 */ | ||||||
| 	if (v == &nn->nfs_volume_list) { | 	if (v == &nn->nfs_volume_list) { | ||||||
| 		seq_puts(m, "NV SERVER   PORT DEV     FSID              FSC\n"); | 		seq_puts(m, "NV SERVER   PORT DEV          FSID" | ||||||
|  | 			    "                              FSC\n"); | ||||||
| 		return 0; | 		return 0; | ||||||
| 	} | 	} | ||||||
| 	/* display one transport per line on subsequent lines */ | 	/* display one transport per line on subsequent lines */ | ||||||
| 	server = list_entry(v, struct nfs_server, master_link); | 	server = list_entry(v, struct nfs_server, master_link); | ||||||
| 	clp = server->nfs_client; | 	clp = server->nfs_client; | ||||||
| 
 | 
 | ||||||
| 	snprintf(dev, 8, "%u:%u", | 	snprintf(dev, sizeof(dev), "%u:%u", | ||||||
| 		 MAJOR(server->s_dev), MINOR(server->s_dev)); | 		 MAJOR(server->s_dev), MINOR(server->s_dev)); | ||||||
| 
 | 
 | ||||||
| 	snprintf(fsid, 17, "%llx:%llx", | 	snprintf(fsid, sizeof(fsid), "%llx:%llx", | ||||||
| 		 (unsigned long long) server->fsid.major, | 		 (unsigned long long) server->fsid.major, | ||||||
| 		 (unsigned long long) server->fsid.minor); | 		 (unsigned long long) server->fsid.minor); | ||||||
| 
 | 
 | ||||||
| 	rcu_read_lock(); | 	rcu_read_lock(); | ||||||
| 	seq_printf(m, "v%u %s %s %-7s %-17s %s\n", | 	seq_printf(m, "v%u %s %s %-12s %-33s %s\n", | ||||||
| 		   clp->rpc_ops->version, | 		   clp->rpc_ops->version, | ||||||
| 		   rpc_peeraddr2str(clp->cl_rpcclient, RPC_DISPLAY_HEX_ADDR), | 		   rpc_peeraddr2str(clp->cl_rpcclient, RPC_DISPLAY_HEX_ADDR), | ||||||
| 		   rpc_peeraddr2str(clp->cl_rpcclient, RPC_DISPLAY_HEX_PORT), | 		   rpc_peeraddr2str(clp->cl_rpcclient, RPC_DISPLAY_HEX_PORT), | ||||||
|  | |||||||
| @ -5,9 +5,9 @@ | |||||||
| /*
 | /*
 | ||||||
|  * Common definitions for all gcc versions go here. |  * Common definitions for all gcc versions go here. | ||||||
|  */ |  */ | ||||||
| #define GCC_VERSION (__GNUC__ * 10000 \ | #define GCC_VERSION (__GNUC__ * 10000		\ | ||||||
| 		   + __GNUC_MINOR__ * 100 \ | 		     + __GNUC_MINOR__ * 100	\ | ||||||
| 		   + __GNUC_PATCHLEVEL__) | 		     + __GNUC_PATCHLEVEL__) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| /* Optimization barrier */ | /* Optimization barrier */ | ||||||
| @ -32,51 +32,63 @@ | |||||||
|  * the inline assembly constraint from =g to =r, in this particular |  * the inline assembly constraint from =g to =r, in this particular | ||||||
|  * case either is valid. |  * case either is valid. | ||||||
|  */ |  */ | ||||||
| #define RELOC_HIDE(ptr, off)					\ | #define RELOC_HIDE(ptr, off)						\ | ||||||
|   ({ unsigned long __ptr;					\ | ({									\ | ||||||
|     __asm__ ("" : "=r"(__ptr) : "0"(ptr));		\ | 	unsigned long __ptr;						\ | ||||||
|     (typeof(ptr)) (__ptr + (off)); }) | 	__asm__ ("" : "=r"(__ptr) : "0"(ptr));				\ | ||||||
|  | 	(typeof(ptr)) (__ptr + (off));					\ | ||||||
|  | }) | ||||||
|  | 
 | ||||||
|  | /* Make the optimizer believe the variable can be manipulated arbitrarily. */ | ||||||
|  | #define OPTIMIZER_HIDE_VAR(var)						\ | ||||||
|  | 	__asm__ ("" : "=r" (var) : "0" (var)) | ||||||
| 
 | 
 | ||||||
| #ifdef __CHECKER__ | #ifdef __CHECKER__ | ||||||
| #define __must_be_array(arr) 0 | #define __must_be_array(a)	0 | ||||||
| #else | #else | ||||||
| /* &a[0] degrades to a pointer: a different type from an array */ | /* &a[0] degrades to a pointer: a different type from an array */ | ||||||
| #define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0])) | #define __must_be_array(a)	BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0])) | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * Force always-inline if the user requests it so via the .config, |  * Force always-inline if the user requests it so via the .config, | ||||||
|  * or if gcc is too old: |  * or if gcc is too old: | ||||||
|  */ |  */ | ||||||
| #if !defined(CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING) || \ | #if !defined(CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING) ||		\ | ||||||
|     !defined(CONFIG_OPTIMIZE_INLINING) || (__GNUC__ < 4) |     !defined(CONFIG_OPTIMIZE_INLINING) || (__GNUC__ < 4) | ||||||
| # define inline		inline		__attribute__((always_inline)) notrace | #define inline		inline		__attribute__((always_inline)) notrace | ||||||
| # define __inline__	__inline__	__attribute__((always_inline)) notrace | #define __inline__	__inline__	__attribute__((always_inline)) notrace | ||||||
| # define __inline	__inline	__attribute__((always_inline)) notrace | #define __inline	__inline	__attribute__((always_inline)) notrace | ||||||
| #else | #else | ||||||
| /* A lot of inline functions can cause havoc with function tracing */ | /* A lot of inline functions can cause havoc with function tracing */ | ||||||
| # define inline		inline		notrace | #define inline		inline		notrace | ||||||
| # define __inline__	__inline__	notrace | #define __inline__	__inline__	notrace | ||||||
| # define __inline	__inline	notrace | #define __inline	__inline	notrace | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #define __deprecated			__attribute__((deprecated)) | #define __always_inline	inline __attribute__((always_inline)) | ||||||
| #define __packed			__attribute__((packed)) | #define  noinline	__attribute__((noinline)) | ||||||
| #define __weak				__attribute__((weak)) | 
 | ||||||
|  | #define __deprecated	__attribute__((deprecated)) | ||||||
|  | #define __packed	__attribute__((packed)) | ||||||
|  | #define __weak		__attribute__((weak)) | ||||||
|  | #define __alias(symbol)	__attribute__((alias(#symbol))) | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * it doesn't make sense on ARM (currently the only user of __naked) to trace |  * it doesn't make sense on ARM (currently the only user of __naked) | ||||||
|  * naked functions because then mcount is called without stack and frame pointer |  * to trace naked functions because then mcount is called without | ||||||
|  * being set up and there is no chance to restore the lr register to the value |  * stack and frame pointer being set up and there is no chance to | ||||||
|  * before mcount was called. |  * restore the lr register to the value before mcount was called. | ||||||
|  * |  * | ||||||
|  * The asm() bodies of naked functions often depend on standard calling conventions, |  * The asm() bodies of naked functions often depend on standard calling | ||||||
|  * therefore they must be noinline and noclone.  GCC 4.[56] currently fail to enforce |  * conventions, therefore they must be noinline and noclone. | ||||||
|  * this, so we must do so ourselves.  See GCC PR44290. |  * | ||||||
|  |  * GCC 4.[56] currently fail to enforce this, so we must do so ourselves. | ||||||
|  |  * See GCC PR44290. | ||||||
|  */ |  */ | ||||||
| #define __naked				__attribute__((naked)) noinline __noclone notrace | #define __naked		__attribute__((naked)) noinline __noclone notrace | ||||||
| 
 | 
 | ||||||
| #define __noreturn			__attribute__((noreturn)) | #define __noreturn	__attribute__((noreturn)) | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * From the GCC manual: |  * From the GCC manual: | ||||||
| @ -88,19 +100,149 @@ | |||||||
|  * would be. |  * would be. | ||||||
|  * [...] |  * [...] | ||||||
|  */ |  */ | ||||||
| #define __pure				__attribute__((pure)) | #define __pure			__attribute__((pure)) | ||||||
| #define __aligned(x)			__attribute__((aligned(x))) | #define __aligned(x)		__attribute__((aligned(x))) | ||||||
| #define __printf(a, b)			__attribute__((format(printf, a, b))) | #define __printf(a, b)		__attribute__((format(printf, a, b))) | ||||||
| #define __scanf(a, b)			__attribute__((format(scanf, a, b))) | #define __scanf(a, b)		__attribute__((format(scanf, a, b))) | ||||||
| #define  noinline			__attribute__((noinline)) | #define __attribute_const__	__attribute__((__const__)) | ||||||
| #define __attribute_const__		__attribute__((__const__)) | #define __maybe_unused		__attribute__((unused)) | ||||||
| #define __maybe_unused			__attribute__((unused)) | #define __always_unused		__attribute__((unused)) | ||||||
| #define __always_unused			__attribute__((unused)) |  | ||||||
| 
 | 
 | ||||||
| #define __gcc_header(x) #x | /* gcc version specific checks */ | ||||||
| #define _gcc_header(x) __gcc_header(linux/compiler-gcc##x.h) | 
 | ||||||
| #define gcc_header(x) _gcc_header(x) | #if GCC_VERSION < 30200 | ||||||
| #include gcc_header(__GNUC__) | # error Sorry, your compiler is too old - please upgrade it. | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if GCC_VERSION < 30300 | ||||||
|  | # define __used			__attribute__((__unused__)) | ||||||
|  | #else | ||||||
|  | # define __used			__attribute__((__used__)) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifdef CONFIG_GCOV_KERNEL | ||||||
|  | # if GCC_VERSION < 30400 | ||||||
|  | #   error "GCOV profiling support for gcc versions below 3.4 not included" | ||||||
|  | # endif /* __GNUC_MINOR__ */ | ||||||
|  | #endif /* CONFIG_GCOV_KERNEL */ | ||||||
|  | 
 | ||||||
|  | #if GCC_VERSION >= 30400 | ||||||
|  | #define __must_check		__attribute__((warn_unused_result)) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if GCC_VERSION >= 40000 | ||||||
|  | 
 | ||||||
|  | /* GCC 4.1.[01] miscompiles __weak */ | ||||||
|  | #ifdef __KERNEL__ | ||||||
|  | # if GCC_VERSION >= 40100 &&  GCC_VERSION <= 40101 | ||||||
|  | #  error Your version of gcc miscompiles the __weak directive | ||||||
|  | # endif | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #define __used			__attribute__((__used__)) | ||||||
|  | #define __compiler_offsetof(a, b)					\ | ||||||
|  | 	__builtin_offsetof(a, b) | ||||||
|  | 
 | ||||||
|  | #if GCC_VERSION >= 40100 && GCC_VERSION < 40600 | ||||||
|  | # define __compiletime_object_size(obj) __builtin_object_size(obj, 0) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if GCC_VERSION >= 40300 | ||||||
|  | /* Mark functions as cold. gcc will assume any path leading to a call
 | ||||||
|  |  * to them will be unlikely.  This means a lot of manual unlikely()s | ||||||
|  |  * are unnecessary now for any paths leading to the usual suspects | ||||||
|  |  * like BUG(), printk(), panic() etc. [but let's keep them for now for | ||||||
|  |  * older compilers] | ||||||
|  |  * | ||||||
|  |  * Early snapshots of gcc 4.3 don't support this and we can't detect this | ||||||
|  |  * in the preprocessor, but we can live with this because they're unreleased. | ||||||
|  |  * Maketime probing would be overkill here. | ||||||
|  |  * | ||||||
|  |  * gcc also has a __attribute__((__hot__)) to move hot functions into | ||||||
|  |  * a special section, but I don't see any sense in this right now in | ||||||
|  |  * the kernel context | ||||||
|  |  */ | ||||||
|  | #define __cold			__attribute__((__cold__)) | ||||||
|  | 
 | ||||||
|  | #define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__) | ||||||
|  | 
 | ||||||
|  | #ifndef __CHECKER__ | ||||||
|  | # define __compiletime_warning(message) __attribute__((warning(message))) | ||||||
|  | # define __compiletime_error(message) __attribute__((error(message))) | ||||||
|  | #endif /* __CHECKER__ */ | ||||||
|  | #endif /* GCC_VERSION >= 40300 */ | ||||||
|  | 
 | ||||||
|  | #if GCC_VERSION >= 40500 | ||||||
|  | /*
 | ||||||
|  |  * Mark a position in code as unreachable.  This can be used to | ||||||
|  |  * suppress control flow warnings after asm blocks that transfer | ||||||
|  |  * control elsewhere. | ||||||
|  |  * | ||||||
|  |  * Early snapshots of gcc 4.5 don't support this and we can't detect | ||||||
|  |  * this in the preprocessor, but we can live with this because they're | ||||||
|  |  * unreleased.  Really, we need to have autoconf for the kernel. | ||||||
|  |  */ | ||||||
|  | #define unreachable() __builtin_unreachable() | ||||||
|  | 
 | ||||||
|  | /* Mark a function definition as prohibited from being cloned. */ | ||||||
|  | #define __noclone	__attribute__((__noclone__, __optimize__("no-tracer"))) | ||||||
|  | 
 | ||||||
|  | #endif /* GCC_VERSION >= 40500 */ | ||||||
|  | 
 | ||||||
|  | #if GCC_VERSION >= 40600 | ||||||
|  | /*
 | ||||||
|  |  * When used with Link Time Optimization, gcc can optimize away C functions or | ||||||
|  |  * variables which are referenced only from assembly code.  __visible tells the | ||||||
|  |  * optimizer that something else uses this function or variable, thus preventing | ||||||
|  |  * this. | ||||||
|  |  */ | ||||||
|  | #define __visible	__attribute__((externally_visible)) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if GCC_VERSION >= 40900 && !defined(__CHECKER__) | ||||||
|  | /*
 | ||||||
|  |  * __assume_aligned(n, k): Tell the optimizer that the returned | ||||||
|  |  * pointer can be assumed to be k modulo n. The second argument is | ||||||
|  |  * optional (default 0), so we use a variadic macro to make the | ||||||
|  |  * shorthand. | ||||||
|  |  * | ||||||
|  |  * Beware: Do not apply this to functions which may return | ||||||
|  |  * ERR_PTRs. Also, it is probably unwise to apply it to functions | ||||||
|  |  * returning extra information in the low bits (but in that case the | ||||||
|  |  * compiler should see some alignment anyway, when the return value is | ||||||
|  |  * massaged by 'flags = ptr & 3; ptr &= ~3;'). | ||||||
|  |  */ | ||||||
|  | #define __assume_aligned(a, ...) __attribute__((__assume_aligned__(a, ## __VA_ARGS__))) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * GCC 'asm goto' miscompiles certain code sequences: | ||||||
|  |  * | ||||||
|  |  *   http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670
 | ||||||
|  |  * | ||||||
|  |  * Work it around via a compiler barrier quirk suggested by Jakub Jelinek. | ||||||
|  |  * | ||||||
|  |  * (asm goto is automatically volatile - the naming reflects this.) | ||||||
|  |  */ | ||||||
|  | #define asm_volatile_goto(x...)	do { asm goto(x); asm (""); } while (0) | ||||||
|  | 
 | ||||||
|  | #ifdef CONFIG_ARCH_USE_BUILTIN_BSWAP | ||||||
|  | #if GCC_VERSION >= 40400 | ||||||
|  | #define __HAVE_BUILTIN_BSWAP32__ | ||||||
|  | #define __HAVE_BUILTIN_BSWAP64__ | ||||||
|  | #endif | ||||||
|  | #if GCC_VERSION >= 40800 | ||||||
|  | #define __HAVE_BUILTIN_BSWAP16__ | ||||||
|  | #endif | ||||||
|  | #endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP */ | ||||||
|  | 
 | ||||||
|  | #if GCC_VERSION >= 50000 | ||||||
|  | #define KASAN_ABI_VERSION 4 | ||||||
|  | #elif GCC_VERSION >= 40902 | ||||||
|  | #define KASAN_ABI_VERSION 3 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif	/* gcc version >= 40000 specific checks */ | ||||||
| 
 | 
 | ||||||
| #if !defined(__noclone) | #if !defined(__noclone) | ||||||
| #define __noclone	/* not needed */ | #define __noclone	/* not needed */ | ||||||
| @ -111,5 +253,3 @@ | |||||||
|  * code |  * code | ||||||
|  */ |  */ | ||||||
| #define uninitialized_var(x) x = x | #define uninitialized_var(x) x = x | ||||||
| 
 |  | ||||||
| #define __always_inline		inline __attribute__((always_inline)) |  | ||||||
|  | |||||||
| @ -1,23 +0,0 @@ | |||||||
| #ifndef __LINUX_COMPILER_H |  | ||||||
| #error "Please don't include <linux/compiler-gcc3.h> directly, include <linux/compiler.h> instead." |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| #if GCC_VERSION < 30200 |  | ||||||
| # error Sorry, your compiler is too old - please upgrade it. |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| #if GCC_VERSION >= 30300 |  | ||||||
| # define __used			__attribute__((__used__)) |  | ||||||
| #else |  | ||||||
| # define __used			__attribute__((__unused__)) |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| #if GCC_VERSION >= 30400 |  | ||||||
| #define __must_check		__attribute__((warn_unused_result)) |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| #ifdef CONFIG_GCOV_KERNEL |  | ||||||
| # if GCC_VERSION < 30400 |  | ||||||
| #   error "GCOV profiling support for gcc versions below 3.4 not included" |  | ||||||
| # endif /* __GNUC_MINOR__ */ |  | ||||||
| #endif /* CONFIG_GCOV_KERNEL */ |  | ||||||
| @ -1,92 +0,0 @@ | |||||||
| #ifndef __LINUX_COMPILER_H |  | ||||||
| #error "Please don't include <linux/compiler-gcc4.h> directly, include <linux/compiler.h> instead." |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| /* GCC 4.1.[01] miscompiles __weak */ |  | ||||||
| #ifdef __KERNEL__ |  | ||||||
| # if GCC_VERSION >= 40100 &&  GCC_VERSION <= 40101 |  | ||||||
| #  error Your version of gcc miscompiles the __weak directive |  | ||||||
| # endif |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| #define __used			__attribute__((__used__)) |  | ||||||
| #define __must_check 		__attribute__((warn_unused_result)) |  | ||||||
| #define __compiler_offsetof(a,b) __builtin_offsetof(a,b) |  | ||||||
| 
 |  | ||||||
| #if GCC_VERSION >= 40100 && GCC_VERSION < 40600 |  | ||||||
| # define __compiletime_object_size(obj) __builtin_object_size(obj, 0) |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| #if GCC_VERSION >= 40300 |  | ||||||
| /* Mark functions as cold. gcc will assume any path leading to a call
 |  | ||||||
|    to them will be unlikely.  This means a lot of manual unlikely()s |  | ||||||
|    are unnecessary now for any paths leading to the usual suspects |  | ||||||
|    like BUG(), printk(), panic() etc. [but let's keep them for now for |  | ||||||
|    older compilers] |  | ||||||
| 
 |  | ||||||
|    Early snapshots of gcc 4.3 don't support this and we can't detect this |  | ||||||
|    in the preprocessor, but we can live with this because they're unreleased. |  | ||||||
|    Maketime probing would be overkill here. |  | ||||||
| 
 |  | ||||||
|    gcc also has a __attribute__((__hot__)) to move hot functions into |  | ||||||
|    a special section, but I don't see any sense in this right now in |  | ||||||
|    the kernel context */ |  | ||||||
| #define __cold			__attribute__((__cold__)) |  | ||||||
| 
 |  | ||||||
| #define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__) |  | ||||||
| 
 |  | ||||||
| #ifndef __CHECKER__ |  | ||||||
| # define __compiletime_warning(message) __attribute__((warning(message))) |  | ||||||
| # define __compiletime_error(message) __attribute__((error(message))) |  | ||||||
| #endif /* __CHECKER__ */ |  | ||||||
| #endif /* GCC_VERSION >= 40300 */ |  | ||||||
| 
 |  | ||||||
| #if GCC_VERSION >= 40500 |  | ||||||
| /*
 |  | ||||||
|  * Mark a position in code as unreachable.  This can be used to |  | ||||||
|  * suppress control flow warnings after asm blocks that transfer |  | ||||||
|  * control elsewhere. |  | ||||||
|  * |  | ||||||
|  * Early snapshots of gcc 4.5 don't support this and we can't detect |  | ||||||
|  * this in the preprocessor, but we can live with this because they're |  | ||||||
|  * unreleased.  Really, we need to have autoconf for the kernel. |  | ||||||
|  */ |  | ||||||
| #define unreachable() __builtin_unreachable() |  | ||||||
| 
 |  | ||||||
| /* Mark a function definition as prohibited from being cloned. */ |  | ||||||
| #define __noclone	__attribute__((__noclone__)) |  | ||||||
| 
 |  | ||||||
| #endif /* GCC_VERSION >= 40500 */ |  | ||||||
| 
 |  | ||||||
| #if GCC_VERSION >= 40600 |  | ||||||
| /*
 |  | ||||||
|  * Tell the optimizer that something else uses this function or variable. |  | ||||||
|  */ |  | ||||||
| #define __visible __attribute__((externally_visible)) |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| /*
 |  | ||||||
|  * GCC 'asm goto' miscompiles certain code sequences: |  | ||||||
|  * |  | ||||||
|  *   http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670
 |  | ||||||
|  * |  | ||||||
|  * Work it around via a compiler barrier quirk suggested by Jakub Jelinek. |  | ||||||
|  * Fixed in GCC 4.8.2 and later versions. |  | ||||||
|  * |  | ||||||
|  * (asm goto is automatically volatile - the naming reflects this.) |  | ||||||
|  */ |  | ||||||
| #if GCC_VERSION <= 40801 |  | ||||||
| # define asm_volatile_goto(x...)	do { asm goto(x); asm (""); } while (0) |  | ||||||
| #else |  | ||||||
| # define asm_volatile_goto(x...)	do { asm goto(x); } while (0) |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| #ifdef CONFIG_ARCH_USE_BUILTIN_BSWAP |  | ||||||
| #if GCC_VERSION >= 40400 |  | ||||||
| #define __HAVE_BUILTIN_BSWAP32__ |  | ||||||
| #define __HAVE_BUILTIN_BSWAP64__ |  | ||||||
| #endif |  | ||||||
| #if GCC_VERSION >= 40800 || (defined(__powerpc__) && GCC_VERSION >= 40600) |  | ||||||
| #define __HAVE_BUILTIN_BSWAP16__ |  | ||||||
| #endif |  | ||||||
| #endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP */ |  | ||||||
| @ -95,7 +95,7 @@ struct elevator_type | |||||||
| 	struct module *elevator_owner; | 	struct module *elevator_owner; | ||||||
| 
 | 
 | ||||||
| 	/* managed by elevator core */ | 	/* managed by elevator core */ | ||||||
| 	char icq_cache_name[ELV_NAME_MAX + 5];	/* elvname + "_io_cq" */ | 	char icq_cache_name[ELV_NAME_MAX + 6];	/* elvname + "_io_cq" */ | ||||||
| 	struct list_head list; | 	struct list_head list; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -15,12 +15,6 @@ | |||||||
| #include <linux/types.h> | #include <linux/types.h> | ||||||
| #include <linux/bitops.h> | #include <linux/bitops.h> | ||||||
| 
 | 
 | ||||||
| /*
 |  | ||||||
|  * deal with unrepresentable constant logarithms |  | ||||||
|  */ |  | ||||||
| extern __attribute__((const, noreturn)) |  | ||||||
| int ____ilog2_NaN(void); |  | ||||||
| 
 |  | ||||||
| /*
 | /*
 | ||||||
|  * non-constant log of base 2 calculators |  * non-constant log of base 2 calculators | ||||||
|  * - the arch may override these in asm/bitops.h if they can be implemented |  * - the arch may override these in asm/bitops.h if they can be implemented | ||||||
| @ -43,19 +37,23 @@ int __ilog2_u64(u64 n) | |||||||
| } | } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| /*
 | /**
 | ||||||
|  *  Determine whether some value is a power of two, where zero is |  * is_power_of_2() - check if a value is a power of two | ||||||
|  |  * @n: the value to check | ||||||
|  |  * | ||||||
|  |  * Determine whether some value is a power of two, where zero is | ||||||
|  * *not* considered a power of two. |  * *not* considered a power of two. | ||||||
|  |  * Return: true if @n is a power of 2, otherwise false. | ||||||
|  */ |  */ | ||||||
| 
 |  | ||||||
| static inline __attribute__((const)) | static inline __attribute__((const)) | ||||||
| bool is_power_of_2(unsigned long n) | bool is_power_of_2(unsigned long n) | ||||||
| { | { | ||||||
| 	return (n != 0 && ((n & (n - 1)) == 0)); | 	return (n != 0 && ((n & (n - 1)) == 0)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /*
 | /**
 | ||||||
|  * round up to nearest power of two |  * __roundup_pow_of_two() - round up to nearest power of two | ||||||
|  |  * @n: value to round up | ||||||
|  */ |  */ | ||||||
| static inline __attribute__((const)) | static inline __attribute__((const)) | ||||||
| unsigned long __roundup_pow_of_two(unsigned long n) | unsigned long __roundup_pow_of_two(unsigned long n) | ||||||
| @ -63,8 +61,9 @@ unsigned long __roundup_pow_of_two(unsigned long n) | |||||||
| 	return 1UL << fls_long(n - 1); | 	return 1UL << fls_long(n - 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /*
 | /**
 | ||||||
|  * round down to nearest power of two |  * __rounddown_pow_of_two() - round down to nearest power of two | ||||||
|  |  * @n: value to round down | ||||||
|  */ |  */ | ||||||
| static inline __attribute__((const)) | static inline __attribute__((const)) | ||||||
| unsigned long __rounddown_pow_of_two(unsigned long n) | unsigned long __rounddown_pow_of_two(unsigned long n) | ||||||
| @ -73,19 +72,16 @@ unsigned long __rounddown_pow_of_two(unsigned long n) | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * ilog2 - log of base 2 of 32-bit or a 64-bit unsigned value |  * const_ilog2 - log base 2 of 32-bit or a 64-bit constant unsigned value | ||||||
|  * @n - parameter |  * @n: parameter | ||||||
|  * |  * | ||||||
|  * constant-capable log of base 2 calculation |  * Use this where sparse expects a true constant expression, e.g. for array | ||||||
|  * - this can be used to initialise global variables from constant data, hence |  * indices. | ||||||
|  *   the massive ternary operator construction |  | ||||||
|  * |  | ||||||
|  * selects the appropriately-sized optimised version depending on sizeof(n) |  | ||||||
|  */ |  */ | ||||||
| #define ilog2(n)				\ | #define const_ilog2(n)				\ | ||||||
| (						\ | (						\ | ||||||
| 	__builtin_constant_p(n) ? (		\ | 	__builtin_constant_p(n) ? (		\ | ||||||
| 		(n) < 1 ? ____ilog2_NaN() :	\ | 		(n) < 2 ? 0 :			\ | ||||||
| 		(n) & (1ULL << 63) ? 63 :	\ | 		(n) & (1ULL << 63) ? 63 :	\ | ||||||
| 		(n) & (1ULL << 62) ? 62 :	\ | 		(n) & (1ULL << 62) ? 62 :	\ | ||||||
| 		(n) & (1ULL << 61) ? 61 :	\ | 		(n) & (1ULL << 61) ? 61 :	\ | ||||||
| @ -148,18 +144,31 @@ unsigned long __rounddown_pow_of_two(unsigned long n) | |||||||
| 		(n) & (1ULL <<  4) ?  4 :	\ | 		(n) & (1ULL <<  4) ?  4 :	\ | ||||||
| 		(n) & (1ULL <<  3) ?  3 :	\ | 		(n) & (1ULL <<  3) ?  3 :	\ | ||||||
| 		(n) & (1ULL <<  2) ?  2 :	\ | 		(n) & (1ULL <<  2) ?  2 :	\ | ||||||
| 		(n) & (1ULL <<  1) ?  1 :	\ | 		1) :				\ | ||||||
| 		(n) & (1ULL <<  0) ?  0 :	\ | 	-1) | ||||||
| 		____ilog2_NaN()			\ | 
 | ||||||
| 				   ) :		\ | /**
 | ||||||
| 	(sizeof(n) <= 4) ?			\ |  * ilog2 - log base 2 of 32-bit or a 64-bit unsigned value | ||||||
| 	__ilog2_u32(n) :			\ |  * @n: parameter | ||||||
| 	__ilog2_u64(n)				\ |  * | ||||||
|  |  * constant-capable log of base 2 calculation | ||||||
|  |  * - this can be used to initialise global variables from constant data, hence | ||||||
|  |  * the massive ternary operator construction | ||||||
|  |  * | ||||||
|  |  * selects the appropriately-sized optimised version depending on sizeof(n) | ||||||
|  |  */ | ||||||
|  | #define ilog2(n) \ | ||||||
|  | ( \ | ||||||
|  | 	__builtin_constant_p(n) ?	\ | ||||||
|  | 	const_ilog2(n) :		\ | ||||||
|  | 	(sizeof(n) <= 4) ?		\ | ||||||
|  | 	__ilog2_u32(n) :		\ | ||||||
|  | 	__ilog2_u64(n)			\ | ||||||
|  ) |  ) | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * roundup_pow_of_two - round the given value up to nearest power of two |  * roundup_pow_of_two - round the given value up to nearest power of two | ||||||
|  * @n - parameter |  * @n: parameter | ||||||
|  * |  * | ||||||
|  * round the given value up to the nearest power of two |  * round the given value up to the nearest power of two | ||||||
|  * - the result is undefined when n == 0 |  * - the result is undefined when n == 0 | ||||||
| @ -176,7 +185,7 @@ unsigned long __rounddown_pow_of_two(unsigned long n) | |||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * rounddown_pow_of_two - round the given value down to nearest power of two |  * rounddown_pow_of_two - round the given value down to nearest power of two | ||||||
|  * @n - parameter |  * @n: parameter | ||||||
|  * |  * | ||||||
|  * round the given value down to the nearest power of two |  * round the given value down to the nearest power of two | ||||||
|  * - the result is undefined when n == 0 |  * - the result is undefined when n == 0 | ||||||
| @ -189,6 +198,12 @@ unsigned long __rounddown_pow_of_two(unsigned long n) | |||||||
| 	__rounddown_pow_of_two(n)		\ | 	__rounddown_pow_of_two(n)		\ | ||||||
|  ) |  ) | ||||||
| 
 | 
 | ||||||
|  | static inline __attribute_const__ | ||||||
|  | int __order_base_2(unsigned long n) | ||||||
|  | { | ||||||
|  | 	return n > 1 ? ilog2(n - 1) + 1 : 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /**
 | /**
 | ||||||
|  * order_base_2 - calculate the (rounded up) base 2 order of the argument |  * order_base_2 - calculate the (rounded up) base 2 order of the argument | ||||||
|  * @n: parameter |  * @n: parameter | ||||||
| @ -202,7 +217,11 @@ unsigned long __rounddown_pow_of_two(unsigned long n) | |||||||
|  *  ob2(5) = 3 |  *  ob2(5) = 3 | ||||||
|  *  ... and so on. |  *  ... and so on. | ||||||
|  */ |  */ | ||||||
| 
 | #define order_base_2(n)				\ | ||||||
| #define order_base_2(n) ilog2(roundup_pow_of_two(n)) | (						\ | ||||||
| 
 | 	__builtin_constant_p(n) ? (		\ | ||||||
|  | 		((n) == 0 || (n) == 1) ? 0 :	\ | ||||||
|  | 		ilog2((n) - 1) + 1) :		\ | ||||||
|  | 	__order_base_2(n)			\ | ||||||
|  | ) | ||||||
| #endif /* _LINUX_LOG2_H */ | #endif /* _LINUX_LOG2_H */ | ||||||
|  | |||||||
| @ -29,6 +29,7 @@ unsigned long randomize_range(unsigned long start, unsigned long end, unsigned l | |||||||
| u32 prandom_u32(void); | u32 prandom_u32(void); | ||||||
| void prandom_bytes(void *buf, int nbytes); | void prandom_bytes(void *buf, int nbytes); | ||||||
| void prandom_seed(u32 seed); | void prandom_seed(u32 seed); | ||||||
|  | void prandom_reseed_late(void); | ||||||
| 
 | 
 | ||||||
| u32 prandom_u32_state(struct rnd_state *); | u32 prandom_u32_state(struct rnd_state *); | ||||||
| void prandom_bytes_state(struct rnd_state *state, void *buf, int nbytes); | void prandom_bytes_state(struct rnd_state *state, void *buf, int nbytes); | ||||||
| @ -50,9 +51,9 @@ static inline void prandom_seed_state(struct rnd_state *state, u64 seed) | |||||||
| { | { | ||||||
| 	u32 i = (seed >> 32) ^ (seed << 10) ^ seed; | 	u32 i = (seed >> 32) ^ (seed << 10) ^ seed; | ||||||
| 
 | 
 | ||||||
| 	state->s1 = __seed(i, 1); | 	state->s1 = __seed(i, 2); | ||||||
| 	state->s2 = __seed(i, 7); | 	state->s2 = __seed(i, 8); | ||||||
| 	state->s3 = __seed(i, 15); | 	state->s3 = __seed(i, 16); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #ifdef CONFIG_ARCH_RANDOM | #ifdef CONFIG_ARCH_RANDOM | ||||||
|  | |||||||
| @ -2151,7 +2151,11 @@ struct task_struct *fork_idle(int); | |||||||
| extern pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags); | extern pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags); | ||||||
| 
 | 
 | ||||||
| extern void set_task_comm(struct task_struct *tsk, char *from); | extern void set_task_comm(struct task_struct *tsk, char *from); | ||||||
| extern char *get_task_comm(char *to, struct task_struct *tsk); | extern char *__get_task_comm(char *to, size_t len, struct task_struct *tsk); | ||||||
|  | #define get_task_comm(buf, tsk) ({			\ | ||||||
|  | 	BUILD_BUG_ON(sizeof(buf) != TASK_COMM_LEN);	\ | ||||||
|  | 	__get_task_comm(buf, sizeof(buf), tsk);		\ | ||||||
|  | }) | ||||||
| 
 | 
 | ||||||
| #ifdef CONFIG_SMP | #ifdef CONFIG_SMP | ||||||
| void scheduler_ipi(void); | void scheduler_ipi(void); | ||||||
|  | |||||||
| @ -848,4 +848,7 @@ asmlinkage long sys_kcmp(pid_t pid1, pid_t pid2, int type, | |||||||
| asmlinkage long sys_finit_module(int fd, const char __user *uargs, int flags); | asmlinkage long sys_finit_module(int fd, const char __user *uargs, int flags); | ||||||
| asmlinkage long sys_seccomp(unsigned int op, unsigned int flags, | asmlinkage long sys_seccomp(unsigned int op, unsigned int flags, | ||||||
| 			    const char __user *uargs); | 			    const char __user *uargs); | ||||||
|  | asmlinkage long sys_getrandom(char __user *buf, size_t count, | ||||||
|  | 			      unsigned int flags); | ||||||
|  | 
 | ||||||
| #endif | #endif | ||||||
|  | |||||||
| @ -702,9 +702,11 @@ __SYSCALL(__NR_renameat2, sys_renameat2) | |||||||
|  */ |  */ | ||||||
| #define __NR_seccomp 277 | #define __NR_seccomp 277 | ||||||
| __SYSCALL(__NR_seccomp, sys_seccomp) | __SYSCALL(__NR_seccomp, sys_seccomp) | ||||||
|  | #define __NR_getrandom 278 | ||||||
|  | __SYSCALL(__NR_getrandom, sys_getrandom) | ||||||
| 
 | 
 | ||||||
| #undef __NR_syscalls | #undef __NR_syscalls | ||||||
| #define __NR_syscalls 278 | #define __NR_syscalls 279 | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * All syscalls below here should go away really, |  * All syscalls below here should go away really, | ||||||
|  | |||||||
| @ -44,6 +44,15 @@ struct rnd_state { | |||||||
| 	__u32 s1, s2, s3; | 	__u32 s1, s2, s3; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | /*
 | ||||||
|  |  * Flags for getrandom(2) | ||||||
|  |  * | ||||||
|  |  * GRND_NONBLOCK	Don't block and return EAGAIN instead | ||||||
|  |  * GRND_RANDOM		Use the /dev/random pool instead of /dev/urandom | ||||||
|  |  */ | ||||||
|  | #define GRND_NONBLOCK	0x0001 | ||||||
|  | #define GRND_RANDOM	0x0002 | ||||||
|  | 
 | ||||||
| /* Exported functions */ | /* Exported functions */ | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -51,7 +51,7 @@ static const unsigned char lzop_magic[] = { | |||||||
| #define HEADER_SIZE_MIN       (9 + 7     + 4 + 8     + 1       + 4) | #define HEADER_SIZE_MIN       (9 + 7     + 4 + 8     + 1       + 4) | ||||||
| #define HEADER_SIZE_MAX       (9 + 7 + 1 + 8 + 8 + 4 + 1 + 255 + 4) | #define HEADER_SIZE_MAX       (9 + 7 + 1 + 8 + 8 + 4 + 1 + 255 + 4) | ||||||
| 
 | 
 | ||||||
| STATIC inline int INIT parse_header(u8 *input, int *skip, int in_len) | static inline int INIT parse_header(u8 *input, int *skip, int in_len) | ||||||
| { | { | ||||||
| 	int l; | 	int l; | ||||||
| 	u8 *parse = input; | 	u8 *parse = input; | ||||||
|  | |||||||
| @ -38,6 +38,7 @@ | |||||||
| #include <linux/export.h> | #include <linux/export.h> | ||||||
| #include <linux/jiffies.h> | #include <linux/jiffies.h> | ||||||
| #include <linux/random.h> | #include <linux/random.h> | ||||||
|  | #include <linux/timer.h> | ||||||
| 
 | 
 | ||||||
| static DEFINE_PER_CPU(struct rnd_state, net_rand_state); | static DEFINE_PER_CPU(struct rnd_state, net_rand_state); | ||||||
| 
 | 
 | ||||||
| @ -141,7 +142,8 @@ void prandom_seed(u32 entropy) | |||||||
| 	 */ | 	 */ | ||||||
| 	for_each_possible_cpu (i) { | 	for_each_possible_cpu (i) { | ||||||
| 		struct rnd_state *state = &per_cpu(net_rand_state, i); | 		struct rnd_state *state = &per_cpu(net_rand_state, i); | ||||||
| 		state->s1 = __seed(state->s1 ^ entropy, 1); | 		state->s1 = __seed(state->s1 ^ entropy, 2); | ||||||
|  | 		prandom_u32_state(state); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| EXPORT_SYMBOL(prandom_seed); | EXPORT_SYMBOL(prandom_seed); | ||||||
| @ -158,9 +160,9 @@ static int __init prandom_init(void) | |||||||
| 		struct rnd_state *state = &per_cpu(net_rand_state,i); | 		struct rnd_state *state = &per_cpu(net_rand_state,i); | ||||||
| 
 | 
 | ||||||
| #define LCG(x)	((x) * 69069)	/* super-duper LCG */ | #define LCG(x)	((x) * 69069)	/* super-duper LCG */ | ||||||
| 		state->s1 = __seed(LCG(i + jiffies), 1); | 		state->s1 = __seed(LCG(i + jiffies), 2); | ||||||
| 		state->s2 = __seed(LCG(state->s1), 7); | 		state->s2 = __seed(LCG(state->s1), 8); | ||||||
| 		state->s3 = __seed(LCG(state->s2), 15); | 		state->s3 = __seed(LCG(state->s2), 16); | ||||||
| 
 | 
 | ||||||
| 		/* "warm it up" */ | 		/* "warm it up" */ | ||||||
| 		prandom_u32_state(state); | 		prandom_u32_state(state); | ||||||
| @ -174,26 +176,69 @@ static int __init prandom_init(void) | |||||||
| } | } | ||||||
| core_initcall(prandom_init); | core_initcall(prandom_init); | ||||||
| 
 | 
 | ||||||
|  | static void __prandom_timer(unsigned long dontcare); | ||||||
|  | static DEFINE_TIMER(seed_timer, __prandom_timer, 0, 0); | ||||||
|  | 
 | ||||||
|  | static void __prandom_timer(unsigned long dontcare) | ||||||
|  | { | ||||||
|  | 	u32 entropy; | ||||||
|  | 
 | ||||||
|  | 	get_random_bytes(&entropy, sizeof(entropy)); | ||||||
|  | 	prandom_seed(entropy); | ||||||
|  | 	/* reseed every ~60 seconds, in [40 .. 80) interval with slack */ | ||||||
|  | 	seed_timer.expires = jiffies + (40 * HZ + (prandom_u32() % (40 * HZ))); | ||||||
|  | 	add_timer(&seed_timer); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void prandom_start_seed_timer(void) | ||||||
|  | { | ||||||
|  | 	set_timer_slack(&seed_timer, HZ); | ||||||
|  | 	seed_timer.expires = jiffies + 40 * HZ; | ||||||
|  | 	add_timer(&seed_timer); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /*
 | /*
 | ||||||
|  *	Generate better values after random number generator |  *	Generate better values after random number generator | ||||||
|  *	is fully initialized. |  *	is fully initialized. | ||||||
|  */ |  */ | ||||||
| static int __init prandom_reseed(void) | static void __prandom_reseed(bool late) | ||||||
| { | { | ||||||
| 	int i; | 	int i; | ||||||
|  | 	unsigned long flags; | ||||||
|  | 	static bool latch = false; | ||||||
|  | 	static DEFINE_SPINLOCK(lock); | ||||||
|  | 
 | ||||||
|  | 	/* only allow initial seeding (late == false) once */ | ||||||
|  | 	spin_lock_irqsave(&lock, flags); | ||||||
|  | 	if (latch && !late) | ||||||
|  | 		goto out; | ||||||
|  | 	latch = true; | ||||||
| 
 | 
 | ||||||
| 	for_each_possible_cpu(i) { | 	for_each_possible_cpu(i) { | ||||||
| 		struct rnd_state *state = &per_cpu(net_rand_state,i); | 		struct rnd_state *state = &per_cpu(net_rand_state,i); | ||||||
| 		u32 seeds[3]; | 		u32 seeds[3]; | ||||||
| 
 | 
 | ||||||
| 		get_random_bytes(&seeds, sizeof(seeds)); | 		get_random_bytes(&seeds, sizeof(seeds)); | ||||||
| 		state->s1 = __seed(seeds[0], 1); | 		state->s1 = __seed(seeds[0], 2); | ||||||
| 		state->s2 = __seed(seeds[1], 7); | 		state->s2 = __seed(seeds[1], 8); | ||||||
| 		state->s3 = __seed(seeds[2], 15); | 		state->s3 = __seed(seeds[2], 16); | ||||||
| 
 | 
 | ||||||
| 		/* mix it in */ | 		/* mix it in */ | ||||||
| 		prandom_u32_state(state); | 		prandom_u32_state(state); | ||||||
| 	} | 	} | ||||||
|  | out: | ||||||
|  | 	spin_unlock_irqrestore(&lock, flags); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void prandom_reseed_late(void) | ||||||
|  | { | ||||||
|  | 	__prandom_reseed(true); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static int __init prandom_reseed(void) | ||||||
|  | { | ||||||
|  | 	__prandom_reseed(false); | ||||||
|  | 	prandom_start_seed_timer(); | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| late_initcall(prandom_reseed); | late_initcall(prandom_reseed); | ||||||
|  | |||||||
| @ -523,7 +523,7 @@ __vma_address(struct page *page, struct vm_area_struct *vma) | |||||||
| 	return vma->vm_start + ((pgoff - vma->vm_pgoff) << PAGE_SHIFT); | 	return vma->vm_start + ((pgoff - vma->vm_pgoff) << PAGE_SHIFT); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| inline unsigned long | static inline unsigned long | ||||||
| vma_address(struct page *page, struct vm_area_struct *vma) | vma_address(struct page *page, struct vm_area_struct *vma) | ||||||
| { | { | ||||||
| 	unsigned long address = __vma_address(page, vma); | 	unsigned long address = __vma_address(page, vma); | ||||||
|  | |||||||
| @ -338,7 +338,8 @@ static netdev_tx_t vti_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | |||||||
| 			   be32_to_cpu(tunnel->parms.o_key), RT_TOS(tos), | 			   be32_to_cpu(tunnel->parms.o_key), RT_TOS(tos), | ||||||
| 			   RT_SCOPE_UNIVERSE, | 			   RT_SCOPE_UNIVERSE, | ||||||
| 			   IPPROTO_IPIP, 0, | 			   IPPROTO_IPIP, 0, | ||||||
| 			   dst, tiph->saddr, 0, 0); | 			   dst, tiph->saddr, 0, 0, | ||||||
|  | 			   sock_net_uid(dev_net(dev), NULL)); | ||||||
| 	rt = ip_route_output_key(dev_net(dev), &fl4); | 	rt = ip_route_output_key(dev_net(dev), &fl4); | ||||||
| 	if (IS_ERR(rt)) { | 	if (IS_ERR(rt)) { | ||||||
| 		dev->stats.tx_carrier_errors++; | 		dev->stats.tx_carrier_errors++; | ||||||
| @ -404,7 +405,8 @@ static int vti_tunnel_bind_dev(struct net_device *dev) | |||||||
| 				   be32_to_cpu(tunnel->parms.i_key), | 				   be32_to_cpu(tunnel->parms.i_key), | ||||||
| 				   RT_TOS(iph->tos), RT_SCOPE_UNIVERSE, | 				   RT_TOS(iph->tos), RT_SCOPE_UNIVERSE, | ||||||
| 				   IPPROTO_IPIP, 0, | 				   IPPROTO_IPIP, 0, | ||||||
| 				   iph->daddr, iph->saddr, 0, 0); | 				   iph->daddr, iph->saddr, 0, 0, | ||||||
|  | 				   sock_net_uid(dev_net(dev), NULL)); | ||||||
| 		rt = ip_route_output_key(dev_net(dev), &fl4); | 		rt = ip_route_output_key(dev_net(dev), &fl4); | ||||||
| 		if (!IS_ERR(rt)) { | 		if (!IS_ERR(rt)) { | ||||||
| 			tdev = rt->dst.dev; | 			tdev = rt->dst.dev; | ||||||
|  | |||||||
| @ -83,7 +83,7 @@ nfnl_cthelper_parse_tuple(struct nf_conntrack_tuple *tuple, | |||||||
| static int | static int | ||||||
| nfnl_cthelper_from_nlattr(struct nlattr *attr, struct nf_conn *ct) | nfnl_cthelper_from_nlattr(struct nlattr *attr, struct nf_conn *ct) | ||||||
| { | { | ||||||
| 	const struct nf_conn_help *help = nfct_help(ct); | 	struct nf_conn_help *help = nfct_help(ct); | ||||||
| 
 | 
 | ||||||
| 	if (attr == NULL) | 	if (attr == NULL) | ||||||
| 		return -EINVAL; | 		return -EINVAL; | ||||||
| @ -91,7 +91,7 @@ nfnl_cthelper_from_nlattr(struct nlattr *attr, struct nf_conn *ct) | |||||||
| 	if (help->helper->data_len == 0) | 	if (help->helper->data_len == 0) | ||||||
| 		return -EINVAL; | 		return -EINVAL; | ||||||
| 
 | 
 | ||||||
| 	memcpy(&help->data, nla_data(attr), help->helper->data_len); | 	memcpy(help->data, nla_data(attr), help->helper->data_len); | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user