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
...@@ -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"
......
...@@ -315,7 +315,7 @@ config UML_NET_SLIRP ...@@ -315,7 +315,7 @@ config UML_NET_SLIRP
to network by invoking a program that can handle SLIP encapsulated to network by invoking a program that can handle SLIP encapsulated
packets. This is commonly (but not limited to) the application packets. This is commonly (but not limited to) the application
known as SLiRP, a program that can re-socket IP packets back onto known as SLiRP, a program that can re-socket IP packets back onto
the host on which it is run. Only IP packets are supported, he host on which it is run. Only IP packets are supported,
unlike other network transports that can handle all Ethernet unlike other network transports that can handle all Ethernet
frames. In general, slirp allows the UML the same IP connectivity frames. In general, slirp allows the UML the same IP connectivity
to the outside world that the host user is permitted, and unlike to the outside world that the host user is permitted, and unlike
......
...@@ -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