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