Skip to content

Commit

Permalink
uml: fix build when SLOB is enabled
Browse files Browse the repository at this point in the history
Reintroduce uml_kmalloc for the benefit of UML libc code.  The
previous tactic of declaring __kmalloc so it could be called directly
from the libc side of the house turned out to be getting too intimate
with slab, and it doesn't work with slob.

So, the uml_kmalloc wrapper is back.  It calls kmalloc or whatever
that translates into, and libc code calls it.

kfree is left alone since that still works, leaving a somewhat
inconsistent API.

Signed-off-by: Jeff Dike <[email protected]>
Cc: WANG Cong <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
cfd-36 authored and torvalds committed May 13, 2008
1 parent 484f1e2 commit 43f5b30
Show file tree
Hide file tree
Showing 17 changed files with 28 additions and 24 deletions.
1 change: 1 addition & 0 deletions arch/um/drivers/chan_user.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include <termios.h>
#include <sys/ioctl.h>
#include "chan_user.h"
#include "kern_constants.h"
#include "os.h"
#include "um_malloc.h"
#include "user.h"
Expand Down
2 changes: 1 addition & 1 deletion arch/um/drivers/cow_sys.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

static inline void *cow_malloc(int size)
{
return kmalloc(size, UM_GFP_KERNEL);
return uml_kmalloc(size, UM_GFP_KERNEL);
}

static inline void cow_free(void *ptr)
Expand Down
4 changes: 2 additions & 2 deletions arch/um/drivers/daemon_user.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ static struct sockaddr_un *new_addr(void *name, int len)
{
struct sockaddr_un *sun;

sun = kmalloc(sizeof(struct sockaddr_un), UM_GFP_KERNEL);
sun = uml_kmalloc(sizeof(struct sockaddr_un), UM_GFP_KERNEL);
if (sun == NULL) {
printk(UM_KERN_ERR "new_addr: allocation of sockaddr_un "
"failed\n");
Expand Down Expand Up @@ -83,7 +83,7 @@ static int connect_to_switch(struct daemon_data *pri)
goto out_close;
}

sun = kmalloc(sizeof(struct sockaddr_un), UM_GFP_KERNEL);
sun = uml_kmalloc(sizeof(struct sockaddr_un), UM_GFP_KERNEL);
if (sun == NULL) {
printk(UM_KERN_ERR "new_addr: allocation of sockaddr_un "
"failed\n");
Expand Down
2 changes: 1 addition & 1 deletion arch/um/drivers/fd.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ static void *fd_init(char *str, int device, const struct chan_opts *opts)
return NULL;
}

data = kmalloc(sizeof(*data), UM_GFP_KERNEL);
data = uml_kmalloc(sizeof(*data), UM_GFP_KERNEL);
if (data == NULL)
return NULL;

Expand Down
3 changes: 2 additions & 1 deletion arch/um/drivers/mcast_user.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include <unistd.h>
#include <errno.h>
#include <netinet/in.h>
#include "kern_constants.h"
#include "mcast.h"
#include "net_user.h"
#include "um_malloc.h"
Expand All @@ -24,7 +25,7 @@ static struct sockaddr_in *new_addr(char *addr, unsigned short port)
{
struct sockaddr_in *sin;

sin = kmalloc(sizeof(struct sockaddr_in), UM_GFP_KERNEL);
sin = uml_kmalloc(sizeof(struct sockaddr_in), UM_GFP_KERNEL);
if (sin == NULL) {
printk(UM_KERN_ERR "new_addr: allocation of sockaddr_in "
"failed\n");
Expand Down
2 changes: 1 addition & 1 deletion arch/um/drivers/net_user.c
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,7 @@ static void change(char *dev, char *what, unsigned char *addr,
netmask[2], netmask[3]);

output_len = UM_KERN_PAGE_SIZE;
output = kmalloc(output_len, UM_GFP_KERNEL);
output = uml_kmalloc(output_len, UM_GFP_KERNEL);
if (output == NULL)
printk(UM_KERN_ERR "change : failed to allocate output "
"buffer\n");
Expand Down
2 changes: 1 addition & 1 deletion arch/um/drivers/port_user.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ static void *port_init(char *str, int device, const struct chan_opts *opts)
if (kern_data == NULL)
return NULL;

data = kmalloc(sizeof(*data), UM_GFP_KERNEL);
data = uml_kmalloc(sizeof(*data), UM_GFP_KERNEL);
if (data == NULL)
goto err;

Expand Down
2 changes: 1 addition & 1 deletion arch/um/drivers/pty.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ static void *pty_chan_init(char *str, int device, const struct chan_opts *opts)
{
struct pty_chan *data;

data = kmalloc(sizeof(*data), UM_GFP_KERNEL);
data = uml_kmalloc(sizeof(*data), UM_GFP_KERNEL);
if (data == NULL)
return NULL;

Expand Down
2 changes: 1 addition & 1 deletion arch/um/drivers/slip_user.c
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ static int slip_tramp(char **argv, int fd)
pid = err;

output_len = UM_KERN_PAGE_SIZE;
output = kmalloc(output_len, UM_GFP_KERNEL);
output = uml_kmalloc(output_len, UM_GFP_KERNEL);
if (output == NULL) {
printk(UM_KERN_ERR "slip_tramp : failed to allocate output "
"buffer\n");
Expand Down
2 changes: 1 addition & 1 deletion arch/um/drivers/tty.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ static void *tty_chan_init(char *str, int device, const struct chan_opts *opts)
}
str++;

data = kmalloc(sizeof(*data), UM_GFP_KERNEL);
data = uml_kmalloc(sizeof(*data), UM_GFP_KERNEL);
if (data == NULL)
return NULL;
*data = ((struct tty_chan) { .dev = str,
Expand Down
2 changes: 1 addition & 1 deletion arch/um/drivers/xterm.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ static void *xterm_init(char *str, int device, const struct chan_opts *opts)
{
struct xterm_chan *data;

data = kmalloc(sizeof(*data), UM_GFP_KERNEL);
data = uml_kmalloc(sizeof(*data), UM_GFP_KERNEL);
if (data == NULL)
return NULL;
*data = ((struct xterm_chan) { .pid = -1,
Expand Down
9 changes: 3 additions & 6 deletions arch/um/include/um_malloc.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,12 @@

#include "kern_constants.h"

extern void *__kmalloc(int size, int flags);
static inline void *kmalloc(int size, int flags)
{
return __kmalloc(size, flags);
}

extern void *uml_kmalloc(int size, int flags);
extern void kfree(const void *ptr);

extern void *vmalloc(unsigned long size);
extern void vfree(void *ptr);

#endif /* __UM_MALLOC_H__ */


5 changes: 5 additions & 0 deletions arch/um/kernel/mem.c
Original file line number Diff line number Diff line change
Expand Up @@ -375,3 +375,8 @@ pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address)
return pmd;
}
#endif

void *uml_kmalloc(int size, int flags)
{
return kmalloc(size, flags);
}
4 changes: 2 additions & 2 deletions arch/um/os-Linux/drivers/ethertap_user.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ static void etap_change(int op, unsigned char *addr, unsigned char *netmask,
return;
}

output = kmalloc(UM_KERN_PAGE_SIZE, UM_GFP_KERNEL);
output = uml_kmalloc(UM_KERN_PAGE_SIZE, UM_GFP_KERNEL);
if (output == NULL)
printk(UM_KERN_ERR "etap_change : Failed to allocate output "
"buffer\n");
Expand Down Expand Up @@ -165,7 +165,7 @@ static int etap_open(void *data)
err = etap_tramp(pri->dev_name, pri->gate_addr, control_fds[0],
control_fds[1], data_fds[0], data_fds[1]);
output_len = UM_KERN_PAGE_SIZE;
output = kmalloc(output_len, UM_GFP_KERNEL);
output = uml_kmalloc(output_len, UM_GFP_KERNEL);
read_output(control_fds[0], output, output_len);

if (output == NULL)
Expand Down
4 changes: 2 additions & 2 deletions arch/um/os-Linux/helper.c
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,8 @@ int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv)
data.pre_data = pre_data;
data.argv = argv;
data.fd = fds[1];
data.buf = __cant_sleep() ? kmalloc(PATH_MAX, UM_GFP_ATOMIC) :
kmalloc(PATH_MAX, UM_GFP_KERNEL);
data.buf = __cant_sleep() ? uml_kmalloc(PATH_MAX, UM_GFP_ATOMIC) :
uml_kmalloc(PATH_MAX, UM_GFP_KERNEL);
pid = clone(helper_child, (void *) sp, CLONE_VM, &data);
if (pid < 0) {
ret = -errno;
Expand Down
2 changes: 1 addition & 1 deletion arch/um/os-Linux/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ void *__wrap_malloc(int size)
return __real_malloc(size);
else if (size <= UM_KERN_PAGE_SIZE)
/* finding contiguous pages can be hard*/
ret = kmalloc(size, UM_GFP_KERNEL);
ret = uml_kmalloc(size, UM_GFP_KERNEL);
else ret = vmalloc(size);

/*
Expand Down
4 changes: 2 additions & 2 deletions arch/um/os-Linux/sigio.c
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ static int need_poll(struct pollfds *polls, int n)
if (n <= polls->size)
return 0;

new = kmalloc(n * sizeof(struct pollfd), UM_GFP_ATOMIC);
new = uml_kmalloc(n * sizeof(struct pollfd), UM_GFP_ATOMIC);
if (new == NULL) {
printk(UM_KERN_ERR "need_poll : failed to allocate new "
"pollfds\n");
Expand Down Expand Up @@ -243,7 +243,7 @@ static struct pollfd *setup_initial_poll(int fd)
{
struct pollfd *p;

p = kmalloc(sizeof(struct pollfd), UM_GFP_KERNEL);
p = uml_kmalloc(sizeof(struct pollfd), UM_GFP_KERNEL);
if (p == NULL) {
printk(UM_KERN_ERR "setup_initial_poll : failed to allocate "
"poll\n");
Expand Down

0 comments on commit 43f5b30

Please sign in to comment.