|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
From 4c83d994566718043e61e568cc214bdc4587f869 Mon Sep 17 00:00:00 2001
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
From: Tom Gundersen <teg@jklm.no>
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
Date: Tue, 9 Sep 2014 11:15:37 +0200
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
Subject: [PATCH] udev: event - keep one rtnl per worker, rather than per event
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
Creating the rtnl context is cheap, but freeing it may not be, due to
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
synchronous close().
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
Also drop some excessive logging. We now log about the changing ifname
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
exactly once.
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
---
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
src/libsystemd/sd-rtnl/rtnl-util.c | 12 +++++++++---
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
src/libsystemd/sd-rtnl/rtnl-util.h | 2 +-
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
src/udev/udev-event.c | 23 ++++++++---------------
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
src/udev/udev.h | 2 ++
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
src/udev/udevd.c | 8 ++++++++
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
5 files changed, 28 insertions(+), 19 deletions(-)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
diff --git a/src/libsystemd/sd-rtnl/rtnl-util.c b/src/libsystemd/sd-rtnl/rtnl-util.c
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
index 0bc2c9b1f5..fe0f34e125 100644
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
--- a/src/libsystemd/sd-rtnl/rtnl-util.c
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+++ b/src/libsystemd/sd-rtnl/rtnl-util.c
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -26,7 +26,7 @@
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
#include "rtnl-util.h"
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
#include "rtnl-internal.h"
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
-int rtnl_set_link_name(sd_rtnl *rtnl, int ifindex, const char *name) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+int rtnl_set_link_name(sd_rtnl **rtnl, int ifindex, const char *name) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
_cleanup_rtnl_message_unref_ sd_rtnl_message *message = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
int r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -34,7 +34,13 @@ int rtnl_set_link_name(sd_rtnl *rtnl, int ifindex, const char *name) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
assert(ifindex > 0);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
assert(name);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- r = sd_rtnl_message_new_link(rtnl, &message, RTM_SETLINK, ifindex);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (!*rtnl) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = sd_rtnl_open(rtnl, 0);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (r < 0)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = sd_rtnl_message_new_link(*rtnl, &message, RTM_SETLINK, ifindex);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
if (r < 0)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
return r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -42,7 +48,7 @@ int rtnl_set_link_name(sd_rtnl *rtnl, int ifindex, const char *name) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
if (r < 0)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
return r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- r = sd_rtnl_call(rtnl, message, 0, NULL);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = sd_rtnl_call(*rtnl, message, 0, NULL);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
if (r < 0)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
return r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
diff --git a/src/libsystemd/sd-rtnl/rtnl-util.h b/src/libsystemd/sd-rtnl/rtnl-util.h
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
index 2963f02d3e..94af3b1720 100644
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
--- a/src/libsystemd/sd-rtnl/rtnl-util.h
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+++ b/src/libsystemd/sd-rtnl/rtnl-util.h
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -34,7 +34,7 @@ bool rtnl_message_type_is_link(uint16_t type);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
bool rtnl_message_type_is_addr(uint16_t type);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
bool rtnl_message_type_is_route(uint16_t type);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
-int rtnl_set_link_name(sd_rtnl *rtnl, int ifindex, const char *name);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+int rtnl_set_link_name(sd_rtnl **rtnl, int ifindex, const char *name);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
int rtnl_set_link_properties(sd_rtnl *rtnl, int ifindex, const char *alias, const struct ether_addr *mac, unsigned mtu);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
int rtnl_log_parse_error(int r);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
diff --git a/src/udev/udev-event.c b/src/udev/udev-event.c
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
index 18b92ca428..1bbf41e757 100644
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
--- a/src/udev/udev-event.c
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+++ b/src/udev/udev-event.c
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -53,6 +53,7 @@ struct udev_event *udev_event_new(struct udev_device *dev) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
void udev_event_unref(struct udev_event *event) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
if (event == NULL)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
return;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ sd_rtnl_unref(event->rtnl);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
udev_list_cleanup(&event->run_list);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
udev_list_cleanup(&event->seclabel_list);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
free(event->program_result);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -746,30 +747,24 @@ out:
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
static int rename_netif(struct udev_event *event) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
struct udev_device *dev = event->dev;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- _cleanup_rtnl_unref_ sd_rtnl *rtnl = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
char name[IFNAMSIZ];
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
const char *oldname;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
int r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
oldname = udev_device_get_sysname(dev);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- log_debug("changing net interface name from '%s' to '%s'",
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- oldname, event->name);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
strscpy(name, IFNAMSIZ, event->name);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- r = sd_rtnl_open(&rtnl, 0);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- if (r < 0)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = rtnl_set_link_name(&event->rtnl, udev_device_get_ifindex(dev), name);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (r < 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ log_error("error changing net interface name '%s' to '%s': %s",
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ oldname, name, strerror(-r));
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
return r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- r = rtnl_set_link_name(rtnl, udev_device_get_ifindex(dev), name);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- if (r < 0)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- log_error("error changing net interface name %s to %s: %s",
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- oldname, name, strerror(-r));
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- else
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- print_kmsg("renamed network interface %s to %s\n", oldname, name);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ print_kmsg("renamed network interface '%s' to '%s'\n", oldname, name);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- return r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return 0;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
void udev_event_execute_rules(struct udev_event *event,
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -832,8 +827,6 @@ void udev_event_execute_rules(struct udev_event *event,
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
r = rename_netif(event);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
if (r >= 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- log_debug("renamed netif to '%s'", event->name);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
/* remember old name */
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
udev_device_add_property(dev, "INTERFACE_OLD", udev_device_get_sysname(dev));
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
diff --git a/src/udev/udev.h b/src/udev/udev.h
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
index faa8f566c2..ed01da30e4 100644
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
--- a/src/udev/udev.h
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+++ b/src/udev/udev.h
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -23,6 +23,7 @@
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
#include <signal.h>
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
#include "macro.h"
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+#include "sd-rtnl.h"
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
#include "libudev.h"
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
#include "libudev-private.h"
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
#include "util.h"
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -44,6 +45,7 @@ struct udev_event {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
int exec_delay;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
usec_t birth_usec;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
int fd_signal;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ sd_rtnl *rtnl;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
unsigned int builtin_run;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
unsigned int builtin_ret;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
bool sigterm;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
diff --git a/src/udev/udevd.c b/src/udev/udevd.c
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
index e72c5b231e..be0acc3177 100644
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
--- a/src/udev/udevd.c
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+++ b/src/udev/udevd.c
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -48,6 +48,7 @@
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
#include "udev.h"
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
#include "udev-util.h"
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+#include "rtnl-util.h"
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
#include "sd-daemon.h"
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
#include "cgroup-util.h"
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
#include "dev-setup.h"
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -200,6 +201,7 @@ static void worker_new(struct event *event) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
case 0: {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
struct udev_device *dev = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
int fd_monitor;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ _cleanup_rtnl_unref_ sd_rtnl *rtnl = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
struct epoll_event ep_signal, ep_monitor;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
sigset_t mask;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
int rc = EXIT_SUCCESS;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -301,11 +303,17 @@ static void worker_new(struct event *event) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ /* needed for renaming netifs */
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ udev_event->rtnl = rtnl;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
/* apply rules, create node, symlinks */
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
udev_event_execute_rules(udev_event, event_timeout_usec, rules, &sigmask_orig);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
udev_event_execute_run(udev_event, event_timeout_usec, &sigmask_orig);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ /* in case rtnl was initialized */
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ rtnl = sd_rtnl_ref(udev_event->rtnl);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
/* apply/restore inotify watch */
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
if (udev_event->inotify_watch) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
udev_watch_begin(udev, dev);
|