uml: fix build when SLOB is enabled
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 <jdike@linux.intel.com> Cc: WANG Cong <xiyou.wangcong@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
484f1e2c1e
commit
43f5b3085f
17 changed files with 28 additions and 24 deletions
|
@ -11,6 +11,7 @@
|
||||||
#include <termios.h>
|
#include <termios.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include "chan_user.h"
|
#include "chan_user.h"
|
||||||
|
#include "kern_constants.h"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "um_malloc.h"
|
#include "um_malloc.h"
|
||||||
#include "user.h"
|
#include "user.h"
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
static inline void *cow_malloc(int size)
|
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)
|
static inline void cow_free(void *ptr)
|
||||||
|
|
|
@ -34,7 +34,7 @@ static struct sockaddr_un *new_addr(void *name, int len)
|
||||||
{
|
{
|
||||||
struct sockaddr_un *sun;
|
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) {
|
if (sun == NULL) {
|
||||||
printk(UM_KERN_ERR "new_addr: allocation of sockaddr_un "
|
printk(UM_KERN_ERR "new_addr: allocation of sockaddr_un "
|
||||||
"failed\n");
|
"failed\n");
|
||||||
|
@ -83,7 +83,7 @@ static int connect_to_switch(struct daemon_data *pri)
|
||||||
goto out_close;
|
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) {
|
if (sun == NULL) {
|
||||||
printk(UM_KERN_ERR "new_addr: allocation of sockaddr_un "
|
printk(UM_KERN_ERR "new_addr: allocation of sockaddr_un "
|
||||||
"failed\n");
|
"failed\n");
|
||||||
|
|
|
@ -40,7 +40,7 @@ static void *fd_init(char *str, int device, const struct chan_opts *opts)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
data = kmalloc(sizeof(*data), UM_GFP_KERNEL);
|
data = uml_kmalloc(sizeof(*data), UM_GFP_KERNEL);
|
||||||
if (data == NULL)
|
if (data == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
|
#include "kern_constants.h"
|
||||||
#include "mcast.h"
|
#include "mcast.h"
|
||||||
#include "net_user.h"
|
#include "net_user.h"
|
||||||
#include "um_malloc.h"
|
#include "um_malloc.h"
|
||||||
|
@ -24,7 +25,7 @@ static struct sockaddr_in *new_addr(char *addr, unsigned short port)
|
||||||
{
|
{
|
||||||
struct sockaddr_in *sin;
|
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) {
|
if (sin == NULL) {
|
||||||
printk(UM_KERN_ERR "new_addr: allocation of sockaddr_in "
|
printk(UM_KERN_ERR "new_addr: allocation of sockaddr_in "
|
||||||
"failed\n");
|
"failed\n");
|
||||||
|
|
|
@ -222,7 +222,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 = kmalloc(output_len, UM_GFP_KERNEL);
|
output = uml_kmalloc(output_len, UM_GFP_KERNEL);
|
||||||
if (output == NULL)
|
if (output == NULL)
|
||||||
printk(UM_KERN_ERR "change : failed to allocate output "
|
printk(UM_KERN_ERR "change : failed to allocate output "
|
||||||
"buffer\n");
|
"buffer\n");
|
||||||
|
|
|
@ -47,7 +47,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 = kmalloc(sizeof(*data), UM_GFP_KERNEL);
|
data = uml_kmalloc(sizeof(*data), UM_GFP_KERNEL);
|
||||||
if (data == NULL)
|
if (data == NULL)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
|
|
|
@ -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 = kmalloc(sizeof(*data), UM_GFP_KERNEL);
|
data = uml_kmalloc(sizeof(*data), UM_GFP_KERNEL);
|
||||||
if (data == NULL)
|
if (data == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
|
|
@ -96,7 +96,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 = kmalloc(output_len, UM_GFP_KERNEL);
|
output = uml_kmalloc(output_len, UM_GFP_KERNEL);
|
||||||
if (output == NULL) {
|
if (output == NULL) {
|
||||||
printk(UM_KERN_ERR "slip_tramp : failed to allocate output "
|
printk(UM_KERN_ERR "slip_tramp : failed to allocate output "
|
||||||
"buffer\n");
|
"buffer\n");
|
||||||
|
|
|
@ -29,7 +29,7 @@ static void *tty_chan_init(char *str, int device, const struct chan_opts *opts)
|
||||||
}
|
}
|
||||||
str++;
|
str++;
|
||||||
|
|
||||||
data = kmalloc(sizeof(*data), UM_GFP_KERNEL);
|
data = uml_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,
|
||||||
|
|
|
@ -30,7 +30,7 @@ static void *xterm_init(char *str, int device, const struct chan_opts *opts)
|
||||||
{
|
{
|
||||||
struct xterm_chan *data;
|
struct xterm_chan *data;
|
||||||
|
|
||||||
data = kmalloc(sizeof(*data), UM_GFP_KERNEL);
|
data = uml_kmalloc(sizeof(*data), UM_GFP_KERNEL);
|
||||||
if (data == NULL)
|
if (data == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
*data = ((struct xterm_chan) { .pid = -1,
|
*data = ((struct xterm_chan) { .pid = -1,
|
||||||
|
|
|
@ -8,15 +8,12 @@
|
||||||
|
|
||||||
#include "kern_constants.h"
|
#include "kern_constants.h"
|
||||||
|
|
||||||
extern void *__kmalloc(int size, int flags);
|
extern void *uml_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 *vmalloc(unsigned long 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__ */
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -375,3 +375,8 @@ pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address)
|
||||||
return pmd;
|
return pmd;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void *uml_kmalloc(int size, int flags)
|
||||||
|
{
|
||||||
|
return kmalloc(size, flags);
|
||||||
|
}
|
||||||
|
|
|
@ -52,7 +52,7 @@ static void etap_change(int op, unsigned char *addr, unsigned char *netmask,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
output = kmalloc(UM_KERN_PAGE_SIZE, UM_GFP_KERNEL);
|
output = uml_kmalloc(UM_KERN_PAGE_SIZE, UM_GFP_KERNEL);
|
||||||
if (output == NULL)
|
if (output == NULL)
|
||||||
printk(UM_KERN_ERR "etap_change : Failed to allocate output "
|
printk(UM_KERN_ERR "etap_change : Failed to allocate output "
|
||||||
"buffer\n");
|
"buffer\n");
|
||||||
|
@ -165,7 +165,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 = kmalloc(output_len, UM_GFP_KERNEL);
|
output = uml_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)
|
||||||
|
|
|
@ -71,8 +71,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() ? kmalloc(PATH_MAX, UM_GFP_ATOMIC) :
|
data.buf = __cant_sleep() ? uml_kmalloc(PATH_MAX, UM_GFP_ATOMIC) :
|
||||||
kmalloc(PATH_MAX, UM_GFP_KERNEL);
|
uml_kmalloc(PATH_MAX, UM_GFP_KERNEL);
|
||||||
pid = clone(helper_child, (void *) sp, CLONE_VM, &data);
|
pid = clone(helper_child, (void *) sp, CLONE_VM, &data);
|
||||||
if (pid < 0) {
|
if (pid < 0) {
|
||||||
ret = -errno;
|
ret = -errno;
|
||||||
|
|
|
@ -199,7 +199,7 @@ 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 = kmalloc(size, UM_GFP_KERNEL);
|
ret = uml_kmalloc(size, UM_GFP_KERNEL);
|
||||||
else ret = vmalloc(size);
|
else ret = vmalloc(size);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -109,7 +109,7 @@ static int need_poll(struct pollfds *polls, int n)
|
||||||
if (n <= polls->size)
|
if (n <= polls->size)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
new = kmalloc(n * sizeof(struct pollfd), UM_GFP_ATOMIC);
|
new = uml_kmalloc(n * sizeof(struct pollfd), UM_GFP_ATOMIC);
|
||||||
if (new == NULL) {
|
if (new == NULL) {
|
||||||
printk(UM_KERN_ERR "need_poll : failed to allocate new "
|
printk(UM_KERN_ERR "need_poll : failed to allocate new "
|
||||||
"pollfds\n");
|
"pollfds\n");
|
||||||
|
@ -243,7 +243,7 @@ static struct pollfd *setup_initial_poll(int fd)
|
||||||
{
|
{
|
||||||
struct pollfd *p;
|
struct pollfd *p;
|
||||||
|
|
||||||
p = kmalloc(sizeof(struct pollfd), UM_GFP_KERNEL);
|
p = uml_kmalloc(sizeof(struct pollfd), UM_GFP_KERNEL);
|
||||||
if (p == NULL) {
|
if (p == NULL) {
|
||||||
printk(UM_KERN_ERR "setup_initial_poll : failed to allocate "
|
printk(UM_KERN_ERR "setup_initial_poll : failed to allocate "
|
||||||
"poll\n");
|
"poll\n");
|
||||||
|
|
Loading…
Reference in a new issue