uml: Eliminate kernel allocator wrappers

UML had two wrapper procedures for kmalloc, um_kmalloc and um_kmalloc_atomic
because the flag constants weren't available in userspace code.
kern_constants.h had made kernel constants available for a long time, so there
is no need for these wrappers any more.  Rather, userspace code calls kmalloc
directly with the userspace versions of the gfp flags.

kmalloc isn't a real procedure, so I had to essentially copy the inline
wrapper around __kmalloc.

vmalloc also had its own wrapper for no good reason.  This is now gone.

Signed-off-by: Jeff Dike <jdike@linux.intel.com>
Cc: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Jeff Dike 2007-07-15 23:38:56 -07:00 committed by Linus Torvalds
parent c43990162f
commit e4c4bf9968
17 changed files with 30 additions and 38 deletions

View file

@ -8,7 +8,7 @@
static inline void *cow_malloc(int size) static inline void *cow_malloc(int size)
{ {
return um_kmalloc(size); return kmalloc(size, UM_GFP_KERNEL);
} }
static inline void cow_free(void *ptr) static inline void cow_free(void *ptr)

View file

@ -35,7 +35,7 @@ static struct sockaddr_un *new_addr(void *name, int len)
{ {
struct sockaddr_un *sun; struct sockaddr_un *sun;
sun = um_kmalloc(sizeof(struct sockaddr_un)); sun = kmalloc(sizeof(struct sockaddr_un), UM_GFP_KERNEL);
if(sun == NULL){ if(sun == NULL){
printk("new_addr: allocation of sockaddr_un failed\n"); printk("new_addr: allocation of sockaddr_un failed\n");
return NULL; return NULL;
@ -83,7 +83,7 @@ static int connect_to_switch(struct daemon_data *pri)
goto out_close; goto out_close;
} }
sun = um_kmalloc(sizeof(struct sockaddr_un)); sun = kmalloc(sizeof(struct sockaddr_un), UM_GFP_KERNEL);
if(sun == NULL){ if(sun == NULL){
printk("new_addr: allocation of sockaddr_un failed\n"); printk("new_addr: allocation of sockaddr_un failed\n");
err = -ENOMEM; err = -ENOMEM;

View file

@ -37,7 +37,7 @@ static void *fd_init(char *str, int device, const struct chan_opts *opts)
printk("fd_init : couldn't parse file descriptor '%s'\n", str); printk("fd_init : couldn't parse file descriptor '%s'\n", str);
return(NULL); return(NULL);
} }
data = um_kmalloc(sizeof(*data)); data = kmalloc(sizeof(*data), UM_GFP_KERNEL);
if(data == NULL) return(NULL); if(data == NULL) return(NULL);
*data = ((struct fd_chan) { .fd = n, *data = ((struct fd_chan) { .fd = n,
.raw = opts->raw }); .raw = opts->raw });

View file

@ -30,7 +30,7 @@ static struct sockaddr_in *new_addr(char *addr, unsigned short port)
{ {
struct sockaddr_in *sin; struct sockaddr_in *sin;
sin = um_kmalloc(sizeof(struct sockaddr_in)); sin = kmalloc(sizeof(struct sockaddr_in), UM_GFP_KERNEL);
if(sin == NULL){ if(sin == NULL){
printk("new_addr: allocation of sockaddr_in failed\n"); printk("new_addr: allocation of sockaddr_in failed\n");
return NULL; return NULL;

View file

@ -217,7 +217,7 @@ static void change(char *dev, char *what, unsigned char *addr,
netmask[2], netmask[3]); netmask[2], netmask[3]);
output_len = UM_KERN_PAGE_SIZE; output_len = UM_KERN_PAGE_SIZE;
output = um_kmalloc(output_len); output = kmalloc(output_len, UM_GFP_KERNEL);
if(output == NULL) if(output == NULL)
printk("change : failed to allocate output buffer\n"); printk("change : failed to allocate output buffer\n");

View file

@ -50,7 +50,7 @@ static void *port_init(char *str, int device, const struct chan_opts *opts)
if(kern_data == NULL) if(kern_data == NULL)
return NULL; return NULL;
data = um_kmalloc(sizeof(*data)); data = kmalloc(sizeof(*data), UM_GFP_KERNEL);
if(data == NULL) if(data == NULL)
goto err; goto err;

View file

@ -29,7 +29,7 @@ static void *pty_chan_init(char *str, int device, const struct chan_opts *opts)
{ {
struct pty_chan *data; struct pty_chan *data;
data = um_kmalloc(sizeof(*data)); data = kmalloc(sizeof(*data), UM_GFP_KERNEL);
if (data == NULL) if (data == NULL)
return NULL; return NULL;

View file

@ -91,7 +91,7 @@ static int slip_tramp(char **argv, int fd)
pid = err; pid = err;
output_len = UM_KERN_PAGE_SIZE; output_len = UM_KERN_PAGE_SIZE;
output = um_kmalloc(output_len); output = kmalloc(output_len, UM_GFP_KERNEL);
if(output == NULL){ if(output == NULL){
printk("slip_tramp : failed to allocate output buffer\n"); printk("slip_tramp : failed to allocate output buffer\n");
os_kill_process(pid, 1); os_kill_process(pid, 1);

View file

@ -29,7 +29,7 @@ static void *tty_chan_init(char *str, int device, const struct chan_opts *opts)
} }
str++; str++;
data = um_kmalloc(sizeof(*data)); data = kmalloc(sizeof(*data), UM_GFP_KERNEL);
if(data == NULL) if(data == NULL)
return NULL; return NULL;
*data = ((struct tty_chan) { .dev = str, *data = ((struct tty_chan) { .dev = str,

View file

@ -27,6 +27,9 @@ DEFINE(UM_ELFCLASS64, ELFCLASS64);
DEFINE(UM_NR_CPUS, NR_CPUS); DEFINE(UM_NR_CPUS, NR_CPUS);
DEFINE(UM_GFP_KERNEL, GFP_KERNEL);
DEFINE(UM_GFP_ATOMIC, GFP_ATOMIC);
/* For crypto assembler code. */ /* For crypto assembler code. */
DEFINE(crypto_tfm_ctx_offset, offsetof(struct crypto_tfm, __crt_ctx)); DEFINE(crypto_tfm_ctx_offset, offsetof(struct crypto_tfm, __crt_ctx));

View file

@ -6,11 +6,17 @@
#ifndef __UM_MALLOC_H__ #ifndef __UM_MALLOC_H__
#define __UM_MALLOC_H__ #define __UM_MALLOC_H__
extern void *um_kmalloc(int size); #include "kern_constants.h"
extern void *um_kmalloc_atomic(int size);
extern void *__kmalloc(int size, int flags);
static inline void *kmalloc(int size, int flags)
{
return __kmalloc(size, flags);
}
extern void kfree(const void *ptr); extern void kfree(const void *ptr);
extern void *um_vmalloc(int size); extern void *vmalloc(unsigned long size);
extern void vfree(void *ptr); extern void vfree(void *ptr);
#endif /* __UM_MALLOC_H__ */ #endif /* __UM_MALLOC_H__ */

View file

@ -30,7 +30,6 @@
#include "irq_kern.h" #include "irq_kern.h"
#include "os.h" #include "os.h"
#include "sigio.h" #include "sigio.h"
#include "um_malloc.h"
#include "misc_constants.h" #include "misc_constants.h"
#include "as-layout.h" #include "as-layout.h"

View file

@ -46,7 +46,6 @@
#include "mode.h" #include "mode.h"
#include "mode_kern.h" #include "mode_kern.h"
#include "choose-mode.h" #include "choose-mode.h"
#include "um_malloc.h"
/* This is a per-cpu array. A processor only modifies its entry and it only /* This is a per-cpu array. A processor only modifies its entry and it only
* cares about its entry, so it's OK if another processor is modifying its * cares about its entry, so it's OK if another processor is modifying its
@ -262,21 +261,6 @@ void dump_thread(struct pt_regs *regs, struct user *u)
{ {
} }
void *um_kmalloc(int size)
{
return kmalloc(size, GFP_KERNEL);
}
void *um_kmalloc_atomic(int size)
{
return kmalloc(size, GFP_ATOMIC);
}
void *um_vmalloc(int size)
{
return vmalloc(size);
}
int __cant_sleep(void) { int __cant_sleep(void) {
return in_atomic() || irqs_disabled() || in_interrupt(); return in_atomic() || irqs_disabled() || in_interrupt();
/* Is in_interrupt() really needed? */ /* Is in_interrupt() really needed? */

View file

@ -54,7 +54,7 @@ static void etap_change(int op, unsigned char *addr, unsigned char *netmask,
return; return;
} }
output = um_kmalloc(UM_KERN_PAGE_SIZE); output = kmalloc(UM_KERN_PAGE_SIZE, UM_GFP_KERNEL);
if(output == NULL) if(output == NULL)
printk("etap_change : Failed to allocate output buffer\n"); printk("etap_change : Failed to allocate output buffer\n");
read_output(fd, output, UM_KERN_PAGE_SIZE); read_output(fd, output, UM_KERN_PAGE_SIZE);
@ -166,7 +166,7 @@ static int etap_open(void *data)
err = etap_tramp(pri->dev_name, pri->gate_addr, control_fds[0], err = etap_tramp(pri->dev_name, pri->gate_addr, control_fds[0],
control_fds[1], data_fds[0], data_fds[1]); control_fds[1], data_fds[0], data_fds[1]);
output_len = UM_KERN_PAGE_SIZE; output_len = UM_KERN_PAGE_SIZE;
output = um_kmalloc(output_len); output = kmalloc(output_len, UM_GFP_KERNEL);
read_output(control_fds[0], output, output_len); read_output(control_fds[0], output, output_len);
if(output == NULL) if(output == NULL)

View file

@ -72,8 +72,8 @@ int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv)
data.pre_data = pre_data; data.pre_data = pre_data;
data.argv = argv; data.argv = argv;
data.fd = fds[1]; data.fd = fds[1];
data.buf = __cant_sleep() ? um_kmalloc_atomic(PATH_MAX) : data.buf = __cant_sleep() ? kmalloc(PATH_MAX, UM_GFP_ATOMIC) :
um_kmalloc(PATH_MAX); kmalloc(PATH_MAX, UM_GFP_KERNEL);
pid = clone(helper_child, (void *) sp, CLONE_VM | SIGCHLD, &data); pid = clone(helper_child, (void *) sp, CLONE_VM | SIGCHLD, &data);
if (pid < 0) { if (pid < 0) {
ret = -errno; ret = -errno;

View file

@ -235,8 +235,8 @@ void *__wrap_malloc(int size)
return __real_malloc(size); return __real_malloc(size);
else if(size <= UM_KERN_PAGE_SIZE) else if(size <= UM_KERN_PAGE_SIZE)
/* finding contiguous pages can be hard*/ /* finding contiguous pages can be hard*/
ret = um_kmalloc(size); ret = kmalloc(size, UM_GFP_KERNEL);
else ret = um_vmalloc(size); else ret = vmalloc(size);
/* glibc people insist that if malloc fails, errno should be /* glibc people insist that if malloc fails, errno should be
* set by malloc as well. So we do. * set by malloc as well. So we do.

View file

@ -105,7 +105,7 @@ static int need_poll(struct pollfds *polls, int n)
if(n <= polls->size) if(n <= polls->size)
return 0; return 0;
new = um_kmalloc_atomic(n * sizeof(struct pollfd)); new = kmalloc(n * sizeof(struct pollfd), UM_GFP_ATOMIC);
if(new == NULL){ if(new == NULL){
printk("need_poll : failed to allocate new pollfds\n"); printk("need_poll : failed to allocate new pollfds\n");
return -ENOMEM; return -ENOMEM;
@ -233,7 +233,7 @@ static struct pollfd *setup_initial_poll(int fd)
{ {
struct pollfd *p; struct pollfd *p;
p = um_kmalloc(sizeof(struct pollfd)); p = kmalloc(sizeof(struct pollfd), UM_GFP_KERNEL);
if (p == NULL) { if (p == NULL) {
printk("setup_initial_poll : failed to allocate poll\n"); printk("setup_initial_poll : failed to allocate poll\n");
return NULL; return NULL;