Skip to content

Commit c87c793

Browse files
committed
Merge tag 'uml-for-7.0-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/uml/linux
Pull UML updates from Johannes Berg: "UML was _really_ quiet, with just four small commits: - two signal handling fixes - dynamic addition of virtio devices - a single code cleanup" * tag 'uml-for-7.0-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/uml/linux: arch/um: remove unused varible err in remove_files_and_dir() um: virtio_uml: Support adding devices via mconsole um: Handle SIGCHLD in seccomp mode like other IRQ signals um: Preserve errno within signal handler
2 parents b52343d + 68e2561 commit c87c793

3 files changed

Lines changed: 57 additions & 6 deletions

File tree

arch/um/drivers/virtio_uml.c

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#include <irq_kern.h>
3535
#include <init.h>
3636
#include <os.h>
37+
#include "mconsole_kern.h"
3738
#include "vhost_user.h"
3839

3940
#define MAX_SUPPORTED_QUEUE_SIZE 256
@@ -1282,6 +1283,7 @@ static struct device vu_cmdline_parent = {
12821283
.release = vu_cmdline_release_dev,
12831284
};
12841285

1286+
static DEFINE_MUTEX(vu_cmdline_lock);
12851287
static bool vu_cmdline_parent_registered;
12861288
static int vu_cmdline_id;
12871289

@@ -1309,7 +1311,7 @@ static void vu_conn_broken(struct work_struct *wk)
13091311
vu_unregister_cmdline_device(&pdata->pdev->dev, NULL);
13101312
}
13111313

1312-
static int vu_cmdline_set(const char *device, const struct kernel_param *kp)
1314+
static int vu_cmdline_set_device(const char *device)
13131315
{
13141316
const char *ids = strchr(device, ':');
13151317
unsigned int virtio_device_id;
@@ -1321,6 +1323,8 @@ static int vu_cmdline_set(const char *device, const struct kernel_param *kp)
13211323
if (!ids || ids == device)
13221324
return -EINVAL;
13231325

1326+
guard(mutex)(&vu_cmdline_lock);
1327+
13241328
processed = sscanf(ids, ":%u%n:%d%n",
13251329
&virtio_device_id, &consumed,
13261330
&vu_cmdline_id, &consumed);
@@ -1366,6 +1370,11 @@ static int vu_cmdline_set(const char *device, const struct kernel_param *kp)
13661370
return err;
13671371
}
13681372

1373+
static int vu_cmdline_set(const char *device, const struct kernel_param *kp)
1374+
{
1375+
return vu_cmdline_set_device(device);
1376+
}
1377+
13691378
static int vu_cmdline_get_device(struct device *dev, void *data)
13701379
{
13711380
struct platform_device *pdev = to_platform_device(dev);
@@ -1380,6 +1389,8 @@ static int vu_cmdline_get_device(struct device *dev, void *data)
13801389

13811390
static int vu_cmdline_get(char *buffer, const struct kernel_param *kp)
13821391
{
1392+
guard(mutex)(&vu_cmdline_lock);
1393+
13831394
buffer[0] = '\0';
13841395
if (vu_cmdline_parent_registered)
13851396
device_for_each_child(&vu_cmdline_parent, buffer,
@@ -1403,6 +1414,8 @@ __uml_help(vu_cmdline_param_ops,
14031414

14041415
static void vu_unregister_cmdline_devices(void)
14051416
{
1417+
guard(mutex)(&vu_cmdline_lock);
1418+
14061419
if (vu_cmdline_parent_registered) {
14071420
device_for_each_child(&vu_cmdline_parent, NULL,
14081421
vu_unregister_cmdline_device);
@@ -1411,6 +1424,42 @@ static void vu_unregister_cmdline_devices(void)
14111424
}
14121425
}
14131426

1427+
static int vu_mc_config(char *str, char **error_out)
1428+
{
1429+
if (*str != '=') {
1430+
*error_out = "Invalid config";
1431+
return -EINVAL;
1432+
}
1433+
str += 1;
1434+
return vu_cmdline_set_device(str);
1435+
}
1436+
1437+
static int vu_mc_id(char **str, int *start_out, int *end_out)
1438+
{
1439+
return -EOPNOTSUPP;
1440+
}
1441+
1442+
static int vu_mc_remove(int n, char **error_out)
1443+
{
1444+
return -EOPNOTSUPP;
1445+
}
1446+
1447+
static struct mc_device virtio_uml_mc = {
1448+
.list = LIST_HEAD_INIT(virtio_uml_mc.list),
1449+
.name = "virtio_uml.device",
1450+
.config = vu_mc_config,
1451+
.get_config = NULL,
1452+
.id = vu_mc_id,
1453+
.remove = vu_mc_remove,
1454+
};
1455+
1456+
static int __init virtio_uml_mc_init(void)
1457+
{
1458+
mconsole_register_dev(&virtio_uml_mc);
1459+
return 0;
1460+
}
1461+
late_initcall(virtio_uml_mc_init);
1462+
14141463
/* Platform driver */
14151464

14161465
static const struct of_device_id virtio_uml_match[] = {

arch/um/os-Linux/signal.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include <as-layout.h>
1717
#include <kern_util.h>
1818
#include <os.h>
19+
#include <skas.h>
1920
#include <sysdep/mcontext.h>
2021
#include <um_malloc.h>
2122
#include <sys/ucontext.h>
@@ -36,7 +37,6 @@ void (*sig_info[NSIG])(int, struct siginfo *, struct uml_pt_regs *, void *mc) =
3637
static void sig_handler_common(int sig, struct siginfo *si, mcontext_t *mc)
3738
{
3839
struct uml_pt_regs r;
39-
int save_errno = errno;
4040

4141
r.is_user = 0;
4242
if (sig == SIGSEGV) {
@@ -50,8 +50,6 @@ static void sig_handler_common(int sig, struct siginfo *si, mcontext_t *mc)
5050
unblock_signals_trace();
5151

5252
(*sig_info[sig])(sig, si, &r, mc);
53-
54-
errno = save_errno;
5553
}
5654

5755
/*
@@ -207,8 +205,11 @@ static void hard_handler(int sig, siginfo_t *si, void *p)
207205
{
208206
ucontext_t *uc = p;
209207
mcontext_t *mc = &uc->uc_mcontext;
208+
int save_errno = errno;
210209

211210
(*handlers[sig])(sig, (struct siginfo *)si, mc);
211+
212+
errno = save_errno;
212213
}
213214

214215
void set_handler(int sig)
@@ -224,6 +225,8 @@ void set_handler(int sig)
224225
sigaddset(&action.sa_mask, SIGIO);
225226
sigaddset(&action.sa_mask, SIGWINCH);
226227
sigaddset(&action.sa_mask, SIGALRM);
228+
if (using_seccomp)
229+
sigaddset(&action.sa_mask, SIGCHLD);
227230

228231
if (sig == SIGSEGV)
229232
flags |= SA_NODEFER;

arch/um/os-Linux/umid.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ static int remove_files_and_dir(char *dir)
136136
static inline int is_umdir_used(char *dir)
137137
{
138138
char pid[sizeof("nnnnnnnnn")], *end, *file;
139-
int fd, p, n, err;
139+
int fd, p, n;
140140
size_t filelen = strlen(dir) + sizeof("/pid") + 1;
141141

142142
file = malloc(filelen);
@@ -155,7 +155,6 @@ static inline int is_umdir_used(char *dir)
155155
goto out;
156156
}
157157

158-
err = 0;
159158
n = read(fd, pid, sizeof(pid));
160159
if (n < 0) {
161160
printk(UM_KERN_ERR "is_umdir_used : couldn't read pid file "

0 commit comments

Comments
 (0)