Commit 983dfa4b authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'for-linus-5.2-rc1' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/rw/uml

Pull UML updates from Richard Weinberger:

 - Kconfig cleanups

 - Fix cpu_all_mask() usage

 - Various bug fixes

* tag 'for-linus-5.2-rc1' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/rw/uml:
  um: irq: don't set the chip for all irqs
  um: define set_pte_at() as a static inline function, not a macro
  um: remove uses of variable length arrays
  um: remove unused variable
  uml: fix a boot splat wrt use of cpu_all_mask
  um: Do not unlock mutex that is not hold.
  hostfs: fix mismatch between link_file definition and declaration
  arch: um: drivers: Kconfig: pedantic formatting
  arch: um: Kconfig: pedantic indention cleanups
  um: Revert to using stack for pt_regs in signal handling
parents 47782361 1987b1b8
...@@ -80,46 +80,46 @@ config LD_SCRIPT_DYN ...@@ -80,46 +80,46 @@ config LD_SCRIPT_DYN
bool bool
default y default y
depends on !LD_SCRIPT_STATIC depends on !LD_SCRIPT_STATIC
select MODULE_REL_CRCS if MODVERSIONS select MODULE_REL_CRCS if MODVERSIONS
config HOSTFS config HOSTFS
tristate "Host filesystem" tristate "Host filesystem"
help help
While the User-Mode Linux port uses its own root file system for While the User-Mode Linux port uses its own root file system for
booting and normal file access, this module lets the UML user booting and normal file access, this module lets the UML user
access files stored on the host. It does not require any access files stored on the host. It does not require any
network connection between the Host and UML. An example use of network connection between the Host and UML. An example use of
this might be: this might be:
mount none /tmp/fromhost -t hostfs -o /tmp/umlshare mount none /tmp/fromhost -t hostfs -o /tmp/umlshare
where /tmp/fromhost is an empty directory inside UML and where /tmp/fromhost is an empty directory inside UML and
/tmp/umlshare is a directory on the host with files the UML user /tmp/umlshare is a directory on the host with files the UML user
wishes to access. wishes to access.
For more information, see For more information, see
<http://user-mode-linux.sourceforge.net/hostfs.html>. <http://user-mode-linux.sourceforge.net/hostfs.html>.
If you'd like to be able to work with files stored on the host, If you'd like to be able to work with files stored on the host,
say Y or M here; otherwise say N. say Y or M here; otherwise say N.
config MCONSOLE config MCONSOLE
bool "Management console" bool "Management console"
depends on PROC_FS depends on PROC_FS
default y default y
help help
The user mode linux management console is a low-level interface to The user mode linux management console is a low-level interface to
the kernel, somewhat like the i386 SysRq interface. Since there is the kernel, somewhat like the i386 SysRq interface. Since there is
a full-blown operating system running under every user mode linux a full-blown operating system running under every user mode linux
instance, there is much greater flexibility possible than with the instance, there is much greater flexibility possible than with the
SysRq mechanism. SysRq mechanism.
If you answer 'Y' to this option, to use this feature, you need the If you answer 'Y' to this option, to use this feature, you need the
mconsole client (called uml_mconsole) which is present in CVS in mconsole client (called uml_mconsole) which is present in CVS in
2.4.5-9um and later (path /tools/mconsole), and is also in the 2.4.5-9um and later (path /tools/mconsole), and is also in the
distribution RPM package in 2.4.6 and later. distribution RPM package in 2.4.6 and later.
It is safe to say 'Y' here. It is safe to say 'Y' here.
config MAGIC_SYSRQ config MAGIC_SYSRQ
bool "Magic SysRq key" bool "Magic SysRq key"
...@@ -142,13 +142,17 @@ config MAGIC_SYSRQ ...@@ -142,13 +142,17 @@ config MAGIC_SYSRQ
config KERNEL_STACK_ORDER config KERNEL_STACK_ORDER
int "Kernel stack size order" int "Kernel stack size order"
default 1 if 64BIT default 2 if 64BIT
range 1 10 if 64BIT range 2 10 if 64BIT
default 0 if !64BIT default 1 if !64BIT
help help
This option determines the size of UML kernel stacks. They will This option determines the size of UML kernel stacks. They will
be 1 << order pages. The default is OK unless you're running Valgrind be 1 << order pages. The default is OK unless you're running Valgrind
on UML, in which case, set this to 3. on UML, in which case, set this to 3.
It is possible to reduce the stack to 1 for 64BIT and 0 for 32BIT on
older (pre-2017) CPUs. It is not recommended on newer CPUs due to the
increase in the size of the state which needs to be saved when handling
signals.
config MMAPPER config MMAPPER
tristate "iomem emulation driver" tristate "iomem emulation driver"
......
This diff is collapsed.
...@@ -276,14 +276,14 @@ static int ubd_setup_common(char *str, int *index_out, char **error_out) ...@@ -276,14 +276,14 @@ static int ubd_setup_common(char *str, int *index_out, char **error_out)
str++; str++;
if(!strcmp(str, "sync")){ if(!strcmp(str, "sync")){
global_openflags = of_sync(global_openflags); global_openflags = of_sync(global_openflags);
goto out1; return err;
} }
err = -EINVAL; err = -EINVAL;
major = simple_strtoul(str, &end, 0); major = simple_strtoul(str, &end, 0);
if((*end != '\0') || (end == str)){ if((*end != '\0') || (end == str)){
*error_out = "Didn't parse major number"; *error_out = "Didn't parse major number";
goto out1; return err;
} }
mutex_lock(&ubd_lock); mutex_lock(&ubd_lock);
......
...@@ -263,7 +263,12 @@ static inline void set_pte(pte_t *pteptr, pte_t pteval) ...@@ -263,7 +263,12 @@ static inline void set_pte(pte_t *pteptr, pte_t pteval)
*pteptr = pte_mknewpage(*pteptr); *pteptr = pte_mknewpage(*pteptr);
if(pte_present(*pteptr)) *pteptr = pte_mknewprot(*pteptr); if(pte_present(*pteptr)) *pteptr = pte_mknewprot(*pteptr);
} }
#define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval)
static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,
pte_t *pteptr, pte_t pteval)
{
set_pte(pteptr, pteval);
}
#define __HAVE_ARCH_PTE_SAME #define __HAVE_ARCH_PTE_SAME
static inline int pte_same(pte_t pte_a, pte_t pte_b) static inline int pte_same(pte_t pte_a, pte_t pte_b)
......
...@@ -479,7 +479,7 @@ void __init init_IRQ(void) ...@@ -479,7 +479,7 @@ void __init init_IRQ(void)
irq_set_chip_and_handler(TIMER_IRQ, &SIGVTALRM_irq_type, handle_edge_irq); irq_set_chip_and_handler(TIMER_IRQ, &SIGVTALRM_irq_type, handle_edge_irq);
for (i = 1; i < NR_IRQS; i++) for (i = 1; i < LAST_IRQ; i++)
irq_set_chip_and_handler(i, &normal_irq_type, handle_edge_irq); irq_set_chip_and_handler(i, &normal_irq_type, handle_edge_irq);
/* Initialize EPOLL Loop */ /* Initialize EPOLL Loop */
os_setup_epoll(); os_setup_epoll();
......
...@@ -59,7 +59,6 @@ static pte_t *maybe_map(unsigned long virt, int is_write) ...@@ -59,7 +59,6 @@ static pte_t *maybe_map(unsigned long virt, int is_write)
static int do_op_one_page(unsigned long addr, int len, int is_write, static int do_op_one_page(unsigned long addr, int len, int is_write,
int (*op)(unsigned long addr, int len, void *arg), void *arg) int (*op)(unsigned long addr, int len, void *arg), void *arg)
{ {
jmp_buf buf;
struct page *page; struct page *page;
pte_t *pte; pte_t *pte;
int n; int n;
......
...@@ -56,7 +56,7 @@ static int itimer_one_shot(struct clock_event_device *evt) ...@@ -56,7 +56,7 @@ static int itimer_one_shot(struct clock_event_device *evt)
static struct clock_event_device timer_clockevent = { static struct clock_event_device timer_clockevent = {
.name = "posix-timer", .name = "posix-timer",
.rating = 250, .rating = 250,
.cpumask = cpu_all_mask, .cpumask = cpu_possible_mask,
.features = CLOCK_EVT_FEAT_PERIODIC | .features = CLOCK_EVT_FEAT_PERIODIC |
CLOCK_EVT_FEAT_ONESHOT, CLOCK_EVT_FEAT_ONESHOT,
.set_state_shutdown = itimer_shutdown, .set_state_shutdown = itimer_shutdown,
......
...@@ -31,29 +31,23 @@ void (*sig_info[NSIG])(int, struct siginfo *, struct uml_pt_regs *) = { ...@@ -31,29 +31,23 @@ void (*sig_info[NSIG])(int, struct siginfo *, struct uml_pt_regs *) = {
static void sig_handler_common(int sig, struct siginfo *si, mcontext_t *mc) static void sig_handler_common(int sig, struct siginfo *si, mcontext_t *mc)
{ {
struct uml_pt_regs *r; struct uml_pt_regs r;
int save_errno = errno; int save_errno = errno;
r = uml_kmalloc(sizeof(struct uml_pt_regs), UM_GFP_ATOMIC); r.is_user = 0;
if (!r)
panic("out of memory");
r->is_user = 0;
if (sig == SIGSEGV) { if (sig == SIGSEGV) {
/* For segfaults, we want the data from the sigcontext. */ /* For segfaults, we want the data from the sigcontext. */
get_regs_from_mc(r, mc); get_regs_from_mc(&r, mc);
GET_FAULTINFO_FROM_MC(r->faultinfo, mc); GET_FAULTINFO_FROM_MC(r.faultinfo, mc);
} }
/* enable signals if sig isn't IRQ signal */ /* enable signals if sig isn't IRQ signal */
if ((sig != SIGIO) && (sig != SIGWINCH) && (sig != SIGALRM)) if ((sig != SIGIO) && (sig != SIGWINCH) && (sig != SIGALRM))
unblock_signals(); unblock_signals();
(*sig_info[sig])(sig, si, r); (*sig_info[sig])(sig, si, &r);
errno = save_errno; errno = save_errno;
free(r);
} }
/* /*
...@@ -91,17 +85,11 @@ void sig_handler(int sig, struct siginfo *si, mcontext_t *mc) ...@@ -91,17 +85,11 @@ void sig_handler(int sig, struct siginfo *si, mcontext_t *mc)
static void timer_real_alarm_handler(mcontext_t *mc) static void timer_real_alarm_handler(mcontext_t *mc)
{ {
struct uml_pt_regs *regs; struct uml_pt_regs regs;
regs = uml_kmalloc(sizeof(struct uml_pt_regs), UM_GFP_ATOMIC);
if (!regs)
panic("out of memory");
if (mc != NULL) if (mc != NULL)
get_regs_from_mc(regs, mc); get_regs_from_mc(&regs, mc);
timer_handler(SIGALRM, NULL, regs); timer_handler(SIGALRM, NULL, &regs);
free(regs);
} }
void timer_alarm_handler(int sig, struct siginfo *unused_si, mcontext_t *mc) void timer_alarm_handler(int sig, struct siginfo *unused_si, mcontext_t *mc)
......
...@@ -135,12 +135,18 @@ static int remove_files_and_dir(char *dir) ...@@ -135,12 +135,18 @@ static int remove_files_and_dir(char *dir)
*/ */
static inline int is_umdir_used(char *dir) static inline int is_umdir_used(char *dir)
{ {
char file[strlen(uml_dir) + UMID_LEN + sizeof("/pid\0")]; char pid[sizeof("nnnnn\0")], *end, *file;
char pid[sizeof("nnnnn\0")], *end;
int dead, fd, p, n, err; int dead, fd, p, n, err;
size_t filelen;
n = snprintf(file, sizeof(file), "%s/pid", dir); err = asprintf(&file, "%s/pid", dir);
if (n >= sizeof(file)) { if (err < 0)
return 0;
filelen = strlen(file);
n = snprintf(file, filelen, "%s/pid", dir);
if (n >= filelen) {
printk(UM_KERN_ERR "is_umdir_used - pid filename too long\n"); printk(UM_KERN_ERR "is_umdir_used - pid filename too long\n");
err = -E2BIG; err = -E2BIG;
goto out; goto out;
...@@ -185,6 +191,7 @@ static inline int is_umdir_used(char *dir) ...@@ -185,6 +191,7 @@ static inline int is_umdir_used(char *dir)
out_close: out_close:
close(fd); close(fd);
out: out:
free(file);
return 0; return 0;
} }
...@@ -210,18 +217,21 @@ static int umdir_take_if_dead(char *dir) ...@@ -210,18 +217,21 @@ static int umdir_take_if_dead(char *dir)
static void __init create_pid_file(void) static void __init create_pid_file(void)
{ {
char file[strlen(uml_dir) + UMID_LEN + sizeof("/pid\0")]; char pid[sizeof("nnnnn\0")], *file;
char pid[sizeof("nnnnn\0")];
int fd, n; int fd, n;
if (umid_file_name("pid", file, sizeof(file))) file = malloc(strlen(uml_dir) + UMID_LEN + sizeof("/pid\0"));
if (!file)
return; return;
if (umid_file_name("pid", file, sizeof(file)))
goto out;
fd = open(file, O_RDWR | O_CREAT | O_EXCL, 0644); fd = open(file, O_RDWR | O_CREAT | O_EXCL, 0644);
if (fd < 0) { if (fd < 0) {
printk(UM_KERN_ERR "Open of machine pid file \"%s\" failed: " printk(UM_KERN_ERR "Open of machine pid file \"%s\" failed: "
"%s\n", file, strerror(errno)); "%s\n", file, strerror(errno));
return; goto out;
} }
snprintf(pid, sizeof(pid), "%d\n", getpid()); snprintf(pid, sizeof(pid), "%d\n", getpid());
...@@ -231,6 +241,8 @@ static void __init create_pid_file(void) ...@@ -231,6 +241,8 @@ static void __init create_pid_file(void)
errno); errno);
close(fd); close(fd);
out:
free(file);
} }
int __init set_umid(char *name) int __init set_umid(char *name)
...@@ -385,13 +397,19 @@ __uml_setup("uml_dir=", set_uml_dir, ...@@ -385,13 +397,19 @@ __uml_setup("uml_dir=", set_uml_dir,
static void remove_umid_dir(void) static void remove_umid_dir(void)
{ {
char dir[strlen(uml_dir) + UMID_LEN + 1], err; char *dir, err;
dir = malloc(strlen(uml_dir) + UMID_LEN + 1);
if (!dir)
return;
sprintf(dir, "%s%s", uml_dir, umid); sprintf(dir, "%s%s", uml_dir, umid);
err = remove_files_and_dir(dir); err = remove_files_and_dir(dir);
if (err) if (err)
os_warn("%s - remove_files_and_dir failed with err = %d\n", os_warn("%s - remove_files_and_dir failed with err = %d\n",
__func__, err); __func__, err);
free(dir);
} }
__uml_exitcall(remove_umid_dir); __uml_exitcall(remove_umid_dir);
...@@ -87,7 +87,7 @@ extern int do_mkdir(const char *file, int mode); ...@@ -87,7 +87,7 @@ extern int do_mkdir(const char *file, int mode);
extern int hostfs_do_rmdir(const char *file); extern int hostfs_do_rmdir(const char *file);
extern int do_mknod(const char *file, int mode, unsigned int major, extern int do_mknod(const char *file, int mode, unsigned int major,
unsigned int minor); unsigned int minor);
extern int link_file(const char *from, const char *to); extern int link_file(const char *to, const char *from);
extern int hostfs_do_readlink(char *file, char *buf, int size); extern int hostfs_do_readlink(char *file, char *buf, int size);
extern int rename_file(char *from, char *to); extern int rename_file(char *from, char *to);
extern int rename2_file(char *from, char *to, unsigned int flags); extern int rename2_file(char *from, char *to, unsigned int flags);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment