Merge branch 'akpm' (Andrew's patch-bomb)
Merge misc patches from Andrew Morton: - the "misc" tree - stuff from all over the map - checkpatch updates - fatfs - kmod changes - procfs - cpumask - UML - kexec - mqueue - rapidio - pidns - some checkpoint-restore feature work. Reluctantly. Most of it delayed a release. I'm still rather worried that we don't have a clear roadmap to completion for this work. * emailed from Andrew Morton <akpm@linux-foundation.org>: (78 patches) kconfig: update compression algorithm info c/r: prctl: add ability to set new mm_struct::exe_file c/r: prctl: extend PR_SET_MM to set up more mm_struct entries c/r: procfs: add arg_start/end, env_start/end and exit_code members to /proc/$pid/stat syscalls, x86: add __NR_kcmp syscall fs, proc: introduce /proc/<pid>/task/<tid>/children entry sysctl: make kernel.ns_last_pid control dependent on CHECKPOINT_RESTORE aio/vfs: cleanup of rw_copy_check_uvector() and compat_rw_copy_check_uvector() eventfd: change int to __u64 in eventfd_signal() fs/nls: add Apple NLS pidns: make killed children autoreap pidns: use task_active_pid_ns in do_notify_parent rapidio/tsi721: add DMA engine support rapidio: add DMA engine support for RIO data transfers ipc/mqueue: add rbtree node caching support tools/selftests: add mq_perf_tests ipc/mqueue: strengthen checks on mqueue creation ipc/mqueue: correct mq_attr_ok test ipc/mqueue: improve performance of send/recv selftests: add mq_open_tests ...
This commit is contained in:
@@ -226,6 +226,7 @@ header-y += kdev_t.h
|
||||
header-y += kernel.h
|
||||
header-y += kernelcapi.h
|
||||
header-y += kernel-page-flags.h
|
||||
header-y += kexec.h
|
||||
header-y += keyboard.h
|
||||
header-y += keyctl.h
|
||||
header-y += l2tp.h
|
||||
|
@@ -577,8 +577,7 @@ extern ssize_t compat_rw_copy_check_uvector(int type,
|
||||
const struct compat_iovec __user *uvector,
|
||||
unsigned long nr_segs,
|
||||
unsigned long fast_segs, struct iovec *fast_pointer,
|
||||
struct iovec **ret_pointer,
|
||||
int check_access);
|
||||
struct iovec **ret_pointer);
|
||||
|
||||
extern void __user *compat_alloc_user_space(unsigned long len);
|
||||
|
||||
|
@@ -177,6 +177,7 @@ extern void put_online_cpus(void);
|
||||
#define hotcpu_notifier(fn, pri) cpu_notifier(fn, pri)
|
||||
#define register_hotcpu_notifier(nb) register_cpu_notifier(nb)
|
||||
#define unregister_hotcpu_notifier(nb) unregister_cpu_notifier(nb)
|
||||
void clear_tasks_mm_cpumask(int cpu);
|
||||
int cpu_down(unsigned int cpu);
|
||||
|
||||
#ifdef CONFIG_ARCH_CPU_PROBE_RELEASE
|
||||
|
@@ -277,17 +277,13 @@ static inline void put_cred(const struct cred *_cred)
|
||||
* @task: The task to query
|
||||
*
|
||||
* Access the objective credentials of a task. The caller must hold the RCU
|
||||
* readlock or the task must be dead and unable to change its own credentials.
|
||||
* readlock.
|
||||
*
|
||||
* The result of this function should not be passed directly to get_cred();
|
||||
* rather get_task_cred() should be used instead.
|
||||
*/
|
||||
#define __task_cred(task) \
|
||||
({ \
|
||||
const struct task_struct *__t = (task); \
|
||||
rcu_dereference_check(__t->real_cred, \
|
||||
task_is_dead(__t)); \
|
||||
})
|
||||
#define __task_cred(task) \
|
||||
rcu_dereference((task)->real_cred)
|
||||
|
||||
/**
|
||||
* get_current_cred - Get the current task's subjective credentials
|
||||
|
@@ -635,6 +635,18 @@ static inline struct dma_async_tx_descriptor *dmaengine_prep_slave_sg(
|
||||
dir, flags, NULL);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_RAPIDIO_DMA_ENGINE
|
||||
struct rio_dma_ext;
|
||||
static inline struct dma_async_tx_descriptor *dmaengine_prep_rio_sg(
|
||||
struct dma_chan *chan, struct scatterlist *sgl, unsigned int sg_len,
|
||||
enum dma_transfer_direction dir, unsigned long flags,
|
||||
struct rio_dma_ext *rio_ext)
|
||||
{
|
||||
return chan->device->device_prep_slave_sg(chan, sgl, sg_len,
|
||||
dir, flags, rio_ext);
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline struct dma_async_tx_descriptor *dmaengine_prep_dma_cyclic(
|
||||
struct dma_chan *chan, dma_addr_t buf_addr, size_t buf_len,
|
||||
size_t period_len, enum dma_transfer_direction dir)
|
||||
|
@@ -34,7 +34,7 @@ void eventfd_ctx_put(struct eventfd_ctx *ctx);
|
||||
struct file *eventfd_fget(int fd);
|
||||
struct eventfd_ctx *eventfd_ctx_fdget(int fd);
|
||||
struct eventfd_ctx *eventfd_ctx_fileget(struct file *file);
|
||||
int eventfd_signal(struct eventfd_ctx *ctx, int n);
|
||||
__u64 eventfd_signal(struct eventfd_ctx *ctx, __u64 n);
|
||||
ssize_t eventfd_ctx_read(struct eventfd_ctx *ctx, int no_wait, __u64 *cnt);
|
||||
int eventfd_ctx_remove_wait_queue(struct eventfd_ctx *ctx, wait_queue_t *wait,
|
||||
__u64 *cnt);
|
||||
|
@@ -173,6 +173,15 @@ struct inodes_stat_t {
|
||||
#define WRITE_FUA (WRITE | REQ_SYNC | REQ_NOIDLE | REQ_FUA)
|
||||
#define WRITE_FLUSH_FUA (WRITE | REQ_SYNC | REQ_NOIDLE | REQ_FLUSH | REQ_FUA)
|
||||
|
||||
|
||||
/*
|
||||
* Flag for rw_copy_check_uvector and compat_rw_copy_check_uvector
|
||||
* that indicates that they should check the contents of the iovec are
|
||||
* valid, but not check the memory that the iovec elements
|
||||
* points too.
|
||||
*/
|
||||
#define CHECK_IOVEC_ONLY -1
|
||||
|
||||
#define SEL_IN 1
|
||||
#define SEL_OUT 2
|
||||
#define SEL_EX 4
|
||||
@@ -1690,8 +1699,7 @@ struct seq_file;
|
||||
ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector,
|
||||
unsigned long nr_segs, unsigned long fast_segs,
|
||||
struct iovec *fast_pointer,
|
||||
struct iovec **ret_pointer,
|
||||
int check_access);
|
||||
struct iovec **ret_pointer);
|
||||
|
||||
extern ssize_t vfs_read(struct file *, char __user *, size_t, loff_t *);
|
||||
extern ssize_t vfs_write(struct file *, const char __user *, size_t, loff_t *);
|
||||
|
@@ -62,6 +62,8 @@ struct ipc_namespace {
|
||||
unsigned int mq_queues_max; /* initialized to DFLT_QUEUESMAX */
|
||||
unsigned int mq_msg_max; /* initialized to DFLT_MSGMAX */
|
||||
unsigned int mq_msgsize_max; /* initialized to DFLT_MSGSIZEMAX */
|
||||
unsigned int mq_msg_default;
|
||||
unsigned int mq_msgsize_default;
|
||||
|
||||
/* user_ns which owns the ipc ns */
|
||||
struct user_namespace *user_ns;
|
||||
@@ -90,11 +92,41 @@ static inline void shm_destroy_orphaned(struct ipc_namespace *ns) {}
|
||||
|
||||
#ifdef CONFIG_POSIX_MQUEUE
|
||||
extern int mq_init_ns(struct ipc_namespace *ns);
|
||||
/* default values */
|
||||
#define DFLT_QUEUESMAX 256 /* max number of message queues */
|
||||
#define DFLT_MSGMAX 10 /* max number of messages in each queue */
|
||||
#define HARD_MSGMAX (32768*sizeof(void *)/4)
|
||||
#define DFLT_MSGSIZEMAX 8192 /* max message size */
|
||||
/*
|
||||
* POSIX Message Queue default values:
|
||||
*
|
||||
* MIN_*: Lowest value an admin can set the maximum unprivileged limit to
|
||||
* DFLT_*MAX: Default values for the maximum unprivileged limits
|
||||
* DFLT_{MSG,MSGSIZE}: Default values used when the user doesn't supply
|
||||
* an attribute to the open call and the queue must be created
|
||||
* HARD_*: Highest value the maximums can be set to. These are enforced
|
||||
* on CAP_SYS_RESOURCE apps as well making them inviolate (so make them
|
||||
* suitably high)
|
||||
*
|
||||
* POSIX Requirements:
|
||||
* Per app minimum openable message queues - 8. This does not map well
|
||||
* to the fact that we limit the number of queues on a per namespace
|
||||
* basis instead of a per app basis. So, make the default high enough
|
||||
* that no given app should have a hard time opening 8 queues.
|
||||
* Minimum maximum for HARD_MSGMAX - 32767. I bumped this to 65536.
|
||||
* Minimum maximum for HARD_MSGSIZEMAX - POSIX is silent on this. However,
|
||||
* we have run into a situation where running applications in the wild
|
||||
* require this to be at least 5MB, and preferably 10MB, so I set the
|
||||
* value to 16MB in hopes that this user is the worst of the bunch and
|
||||
* the new maximum will handle anyone else. I may have to revisit this
|
||||
* in the future.
|
||||
*/
|
||||
#define MIN_QUEUESMAX 1
|
||||
#define DFLT_QUEUESMAX 256
|
||||
#define HARD_QUEUESMAX 1024
|
||||
#define MIN_MSGMAX 1
|
||||
#define DFLT_MSG 10U
|
||||
#define DFLT_MSGMAX 10
|
||||
#define HARD_MSGMAX 65536
|
||||
#define MIN_MSGSIZEMAX 128
|
||||
#define DFLT_MSGSIZE 8192U
|
||||
#define DFLT_MSGSIZEMAX 8192
|
||||
#define HARD_MSGSIZEMAX (16*1024*1024)
|
||||
#else
|
||||
static inline int mq_init_ns(struct ipc_namespace *ns) { return 0; }
|
||||
#endif
|
||||
|
17
include/linux/kcmp.h
Normal file
17
include/linux/kcmp.h
Normal file
@@ -0,0 +1,17 @@
|
||||
#ifndef _LINUX_KCMP_H
|
||||
#define _LINUX_KCMP_H
|
||||
|
||||
/* Comparison type */
|
||||
enum kcmp_type {
|
||||
KCMP_FILE,
|
||||
KCMP_VM,
|
||||
KCMP_FILES,
|
||||
KCMP_FS,
|
||||
KCMP_SIGHAND,
|
||||
KCMP_IO,
|
||||
KCMP_SYSVSEM,
|
||||
|
||||
KCMP_TYPES,
|
||||
};
|
||||
|
||||
#endif /* _LINUX_KCMP_H */
|
@@ -35,6 +35,7 @@
|
||||
#define LLONG_MAX ((long long)(~0ULL>>1))
|
||||
#define LLONG_MIN (-LLONG_MAX - 1)
|
||||
#define ULLONG_MAX (~0ULL)
|
||||
#define SIZE_MAX (~(size_t)0)
|
||||
|
||||
#define STACK_MAGIC 0xdeadbeef
|
||||
|
||||
|
@@ -1,8 +1,58 @@
|
||||
#ifndef LINUX_KEXEC_H
|
||||
#define LINUX_KEXEC_H
|
||||
|
||||
#ifdef CONFIG_KEXEC
|
||||
/* kexec system call - It loads the new kernel to boot into.
|
||||
* kexec does not sync, or unmount filesystems so if you need
|
||||
* that to happen you need to do that yourself.
|
||||
*/
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
/* kexec flags for different usage scenarios */
|
||||
#define KEXEC_ON_CRASH 0x00000001
|
||||
#define KEXEC_PRESERVE_CONTEXT 0x00000002
|
||||
#define KEXEC_ARCH_MASK 0xffff0000
|
||||
|
||||
/* These values match the ELF architecture values.
|
||||
* Unless there is a good reason that should continue to be the case.
|
||||
*/
|
||||
#define KEXEC_ARCH_DEFAULT ( 0 << 16)
|
||||
#define KEXEC_ARCH_386 ( 3 << 16)
|
||||
#define KEXEC_ARCH_X86_64 (62 << 16)
|
||||
#define KEXEC_ARCH_PPC (20 << 16)
|
||||
#define KEXEC_ARCH_PPC64 (21 << 16)
|
||||
#define KEXEC_ARCH_IA_64 (50 << 16)
|
||||
#define KEXEC_ARCH_ARM (40 << 16)
|
||||
#define KEXEC_ARCH_S390 (22 << 16)
|
||||
#define KEXEC_ARCH_SH (42 << 16)
|
||||
#define KEXEC_ARCH_MIPS_LE (10 << 16)
|
||||
#define KEXEC_ARCH_MIPS ( 8 << 16)
|
||||
|
||||
/* The artificial cap on the number of segments passed to kexec_load. */
|
||||
#define KEXEC_SEGMENT_MAX 16
|
||||
|
||||
#ifndef __KERNEL__
|
||||
/*
|
||||
* This structure is used to hold the arguments that are used when
|
||||
* loading kernel binaries.
|
||||
*/
|
||||
struct kexec_segment {
|
||||
const void *buf;
|
||||
size_t bufsz;
|
||||
const void *mem;
|
||||
size_t memsz;
|
||||
};
|
||||
|
||||
/* Load a new kernel image as described by the kexec_segment array
|
||||
* consisting of passed number of segments at the entry-point address.
|
||||
* The flags allow different useage types.
|
||||
*/
|
||||
extern int kexec_load(void *, size_t, struct kexec_segment *,
|
||||
unsigned long int);
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#ifdef CONFIG_KEXEC
|
||||
#include <linux/list.h>
|
||||
#include <linux/linkage.h>
|
||||
#include <linux/compat.h>
|
||||
@@ -67,11 +117,10 @@ typedef unsigned long kimage_entry_t;
|
||||
#define IND_DONE 0x4
|
||||
#define IND_SOURCE 0x8
|
||||
|
||||
#define KEXEC_SEGMENT_MAX 16
|
||||
struct kexec_segment {
|
||||
void __user *buf;
|
||||
size_t bufsz;
|
||||
unsigned long mem; /* User space sees this as a (void *) ... */
|
||||
unsigned long mem;
|
||||
size_t memsz;
|
||||
};
|
||||
|
||||
@@ -175,25 +224,6 @@ extern struct kimage *kexec_crash_image;
|
||||
#define kexec_flush_icache_page(page)
|
||||
#endif
|
||||
|
||||
#define KEXEC_ON_CRASH 0x00000001
|
||||
#define KEXEC_PRESERVE_CONTEXT 0x00000002
|
||||
#define KEXEC_ARCH_MASK 0xffff0000
|
||||
|
||||
/* These values match the ELF architecture values.
|
||||
* Unless there is a good reason that should continue to be the case.
|
||||
*/
|
||||
#define KEXEC_ARCH_DEFAULT ( 0 << 16)
|
||||
#define KEXEC_ARCH_386 ( 3 << 16)
|
||||
#define KEXEC_ARCH_X86_64 (62 << 16)
|
||||
#define KEXEC_ARCH_PPC (20 << 16)
|
||||
#define KEXEC_ARCH_PPC64 (21 << 16)
|
||||
#define KEXEC_ARCH_IA_64 (50 << 16)
|
||||
#define KEXEC_ARCH_ARM (40 << 16)
|
||||
#define KEXEC_ARCH_S390 (22 << 16)
|
||||
#define KEXEC_ARCH_SH (42 << 16)
|
||||
#define KEXEC_ARCH_MIPS_LE (10 << 16)
|
||||
#define KEXEC_ARCH_MIPS ( 8 << 16)
|
||||
|
||||
/* List of defined/legal kexec flags */
|
||||
#ifndef CONFIG_KEXEC_JUMP
|
||||
#define KEXEC_FLAGS KEXEC_ON_CRASH
|
||||
@@ -228,4 +258,5 @@ struct task_struct;
|
||||
static inline void crash_kexec(struct pt_regs *regs) { }
|
||||
static inline int kexec_should_crash(struct task_struct *p) { return 0; }
|
||||
#endif /* CONFIG_KEXEC */
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* LINUX_KEXEC_H */
|
||||
|
@@ -66,40 +66,10 @@ struct subprocess_info {
|
||||
void *data;
|
||||
};
|
||||
|
||||
/* Allocate a subprocess_info structure */
|
||||
struct subprocess_info *call_usermodehelper_setup(char *path, char **argv,
|
||||
char **envp, gfp_t gfp_mask);
|
||||
|
||||
/* Set various pieces of state into the subprocess_info structure */
|
||||
void call_usermodehelper_setfns(struct subprocess_info *info,
|
||||
int (*init)(struct subprocess_info *info, struct cred *new),
|
||||
void (*cleanup)(struct subprocess_info *info),
|
||||
void *data);
|
||||
|
||||
/* Actually execute the sub-process */
|
||||
int call_usermodehelper_exec(struct subprocess_info *info, int wait);
|
||||
|
||||
/* Free the subprocess_info. This is only needed if you're not going
|
||||
to call call_usermodehelper_exec */
|
||||
void call_usermodehelper_freeinfo(struct subprocess_info *info);
|
||||
|
||||
static inline int
|
||||
extern int
|
||||
call_usermodehelper_fns(char *path, char **argv, char **envp, int wait,
|
||||
int (*init)(struct subprocess_info *info, struct cred *new),
|
||||
void (*cleanup)(struct subprocess_info *), void *data)
|
||||
{
|
||||
struct subprocess_info *info;
|
||||
gfp_t gfp_mask = (wait == UMH_NO_WAIT) ? GFP_ATOMIC : GFP_KERNEL;
|
||||
|
||||
info = call_usermodehelper_setup(path, argv, envp, gfp_mask);
|
||||
|
||||
if (info == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
call_usermodehelper_setfns(info, init, cleanup, data);
|
||||
|
||||
return call_usermodehelper_exec(info, wait);
|
||||
}
|
||||
void (*cleanup)(struct subprocess_info *), void *data);
|
||||
|
||||
static inline int
|
||||
call_usermodehelper(char *path, char **argv, char **envp, int wait)
|
||||
|
@@ -21,8 +21,9 @@
|
||||
#define CT_LE_W(v) cpu_to_le16(v)
|
||||
#define CT_LE_L(v) cpu_to_le32(v)
|
||||
|
||||
#define MSDOS_ROOT_INO 1 /* The root inode number */
|
||||
#define MSDOS_FSINFO_INO 2 /* Used for managing the FSINFO block */
|
||||
|
||||
#define MSDOS_ROOT_INO 1 /* == MINIX_ROOT_INO */
|
||||
#define MSDOS_DIR_BITS 5 /* log2(sizeof(struct msdos_dir_entry)) */
|
||||
|
||||
/* directory limit */
|
||||
|
@@ -113,6 +113,12 @@
|
||||
# define PR_SET_MM_START_STACK 5
|
||||
# define PR_SET_MM_START_BRK 6
|
||||
# define PR_SET_MM_BRK 7
|
||||
# define PR_SET_MM_ARG_START 8
|
||||
# define PR_SET_MM_ARG_END 9
|
||||
# define PR_SET_MM_ENV_START 10
|
||||
# define PR_SET_MM_ENV_END 11
|
||||
# define PR_SET_MM_AUXV 12
|
||||
# define PR_SET_MM_EXE_FILE 13
|
||||
|
||||
/*
|
||||
* Set specific pid that is allowed to ptrace the current task.
|
||||
|
@@ -20,6 +20,9 @@
|
||||
#include <linux/errno.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/rio_regs.h>
|
||||
#ifdef CONFIG_RAPIDIO_DMA_ENGINE
|
||||
#include <linux/dmaengine.h>
|
||||
#endif
|
||||
|
||||
#define RIO_NO_HOPCOUNT -1
|
||||
#define RIO_INVALID_DESTID 0xffff
|
||||
@@ -254,6 +257,9 @@ struct rio_mport {
|
||||
u32 phys_efptr;
|
||||
unsigned char name[40];
|
||||
void *priv; /* Master port private data */
|
||||
#ifdef CONFIG_RAPIDIO_DMA_ENGINE
|
||||
struct dma_device dma;
|
||||
#endif
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -395,6 +401,47 @@ union rio_pw_msg {
|
||||
u32 raw[RIO_PW_MSG_SIZE/sizeof(u32)];
|
||||
};
|
||||
|
||||
#ifdef CONFIG_RAPIDIO_DMA_ENGINE
|
||||
|
||||
/**
|
||||
* enum rio_write_type - RIO write transaction types used in DMA transfers
|
||||
*
|
||||
* Note: RapidIO specification defines write (NWRITE) and
|
||||
* write-with-response (NWRITE_R) data transfer operations.
|
||||
* Existing DMA controllers that service RapidIO may use one of these operations
|
||||
* for entire data transfer or their combination with only the last data packet
|
||||
* requires response.
|
||||
*/
|
||||
enum rio_write_type {
|
||||
RDW_DEFAULT, /* default method used by DMA driver */
|
||||
RDW_ALL_NWRITE, /* all packets use NWRITE */
|
||||
RDW_ALL_NWRITE_R, /* all packets use NWRITE_R */
|
||||
RDW_LAST_NWRITE_R, /* last packet uses NWRITE_R, others - NWRITE */
|
||||
};
|
||||
|
||||
struct rio_dma_ext {
|
||||
u16 destid;
|
||||
u64 rio_addr; /* low 64-bits of 66-bit RapidIO address */
|
||||
u8 rio_addr_u; /* upper 2-bits of 66-bit RapidIO address */
|
||||
enum rio_write_type wr_type; /* preferred RIO write operation type */
|
||||
};
|
||||
|
||||
struct rio_dma_data {
|
||||
/* Local data (as scatterlist) */
|
||||
struct scatterlist *sg; /* I/O scatter list */
|
||||
unsigned int sg_len; /* size of scatter list */
|
||||
/* Remote device address (flat buffer) */
|
||||
u64 rio_addr; /* low 64-bits of 66-bit RapidIO address */
|
||||
u8 rio_addr_u; /* upper 2-bits of 66-bit RapidIO address */
|
||||
enum rio_write_type wr_type; /* preferred RIO write operation type */
|
||||
};
|
||||
|
||||
static inline struct rio_mport *dma_to_mport(struct dma_device *ddev)
|
||||
{
|
||||
return container_of(ddev, struct rio_mport, dma);
|
||||
}
|
||||
#endif /* CONFIG_RAPIDIO_DMA_ENGINE */
|
||||
|
||||
/* Architecture and hardware-specific functions */
|
||||
extern int rio_register_mport(struct rio_mport *);
|
||||
extern int rio_open_inb_mbox(struct rio_mport *, void *, int, int);
|
||||
|
@@ -377,6 +377,15 @@ void rio_unregister_driver(struct rio_driver *);
|
||||
struct rio_dev *rio_dev_get(struct rio_dev *);
|
||||
void rio_dev_put(struct rio_dev *);
|
||||
|
||||
#ifdef CONFIG_RAPIDIO_DMA_ENGINE
|
||||
extern struct dma_chan *rio_request_dma(struct rio_dev *rdev);
|
||||
extern void rio_release_dma(struct dma_chan *dchan);
|
||||
extern struct dma_async_tx_descriptor *rio_dma_prep_slave_sg(
|
||||
struct rio_dev *rdev, struct dma_chan *dchan,
|
||||
struct rio_dma_data *data,
|
||||
enum dma_transfer_direction direction, unsigned long flags);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* rio_name - Get the unique RIO device identifier
|
||||
* @rdev: RIO device
|
||||
|
@@ -242,7 +242,7 @@ size_t ksize(const void *);
|
||||
*/
|
||||
static inline void *kmalloc_array(size_t n, size_t size, gfp_t flags)
|
||||
{
|
||||
if (size != 0 && n > ULONG_MAX / size)
|
||||
if (size != 0 && n > SIZE_MAX / size)
|
||||
return NULL;
|
||||
return __kmalloc(n * size, flags);
|
||||
}
|
||||
|
@@ -858,4 +858,6 @@ asmlinkage long sys_process_vm_writev(pid_t pid,
|
||||
unsigned long riovcnt,
|
||||
unsigned long flags);
|
||||
|
||||
asmlinkage long sys_kcmp(pid_t pid1, pid_t pid2, int type,
|
||||
unsigned long idx1, unsigned long idx2);
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user