Applied assortment of Arch Linux ARM patches

This commit is contained in:
Nathan 2025-04-07 00:16:08 -05:00
parent 25c6d769f4
commit 4822424518
39 changed files with 419 additions and 275 deletions

View File

@ -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;
} }

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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 */

View File

@ -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

View File

@ -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

View File

@ -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 {

View File

@ -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
* *

View File

@ -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)

View File

@ -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);

View File

@ -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]);

View File

@ -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",
}; };

View File

@ -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);

View File

@ -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

View File

@ -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);

View File

@ -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",

View File

@ -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;
} }

View File

@ -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 */

View File

@ -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 */

View File

@ -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);
} }

View File

@ -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

View File

@ -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;
} }

View File

@ -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),

View File

@ -33,12 +33,18 @@
* case either is valid. * case either is valid.
*/ */
#define RELOC_HIDE(ptr, off) \ #define RELOC_HIDE(ptr, off) \
({ unsigned long __ptr; \ ({ \
unsigned long __ptr; \
__asm__ ("" : "=r"(__ptr) : "0"(ptr)); \ __asm__ ("" : "=r"(__ptr) : "0"(ptr)); \
(typeof(ptr)) (__ptr + (off)); }) (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]))
@ -50,29 +56,35 @@
*/ */
#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 __always_inline inline __attribute__((always_inline))
#define noinline __attribute__((noinline))
#define __deprecated __attribute__((deprecated)) #define __deprecated __attribute__((deprecated))
#define __packed __attribute__((packed)) #define __packed __attribute__((packed))
#define __weak __attribute__((weak)) #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
@ -92,15 +104,145 @@
#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))

View File

@ -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 */

View File

@ -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 */

View File

@ -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;
}; };

View File

@ -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
/* /**
* 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 * 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,10 +144,23 @@ 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() \
) : \ /**
* ilog2 - log base 2 of 32-bit or a 64-bit unsigned value
* @n: parameter
*
* 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) ? \ (sizeof(n) <= 4) ? \
__ilog2_u32(n) : \ __ilog2_u32(n) : \
__ilog2_u64(n) \ __ilog2_u64(n) \
@ -159,7 +168,7 @@ unsigned long __rounddown_pow_of_two(unsigned long 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 */

View File

@ -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

View File

@ -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);

View File

@ -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

View File

@ -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,

View File

@ -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 */

View File

@ -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;

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -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;
} }