mirror of
https://github.com/systemd/systemd-stable.git
synced 2025-01-22 22:03:43 +03:00
Merge pull request #3190 from poettering/logind-fixes
This commit is contained in:
commit
b920500ef1
4
TODO
4
TODO
@ -35,6 +35,10 @@ Features:
|
|||||||
|
|
||||||
* make sure the ratelimit object can deal with USEC_INFINITY as way to turn off things
|
* make sure the ratelimit object can deal with USEC_INFINITY as way to turn off things
|
||||||
|
|
||||||
|
* maybe: pid1: replace cgroups agent transport by AF_UNIX/SOCK_DGRAM, so that
|
||||||
|
we aren't hit by socket backlog exhaustion on the dbus AF_UNIX/SOCK_STREAM
|
||||||
|
socket
|
||||||
|
|
||||||
* journalctl: make sure -f ends when the container indicated by -M terminates
|
* journalctl: make sure -f ends when the container indicated by -M terminates
|
||||||
|
|
||||||
* rework fopen_temporary() to make use of open_tmpfile_linkable() (problem: the
|
* rework fopen_temporary() to make use of open_tmpfile_linkable() (problem: the
|
||||||
|
@ -296,6 +296,22 @@
|
|||||||
memory as is needed.</para></listitem>
|
memory as is needed.</para></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><varname>InhibitorsMax=</varname></term>
|
||||||
|
|
||||||
|
<listitem><para>Controls the maximum number of concurrent inhibitors to permit. Defaults to 8192
|
||||||
|
(8K).</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><varname>SessionsMax=</varname></term>
|
||||||
|
|
||||||
|
<listitem><para>Controls the maximum number of concurrent user sessions to manage. Defaults to 8192
|
||||||
|
(8K). Depending on how the <filename>pam_systemd.so</filename> module is included in the PAM stack
|
||||||
|
configuration, further login sessions will either be refused, or permitted but not tracked by
|
||||||
|
<filename>systemd-logind</filename>.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><varname>UserTasksMax=</varname></term>
|
<term><varname>UserTasksMax=</varname></term>
|
||||||
|
|
||||||
|
@ -265,6 +265,42 @@ static int property_get_docked(
|
|||||||
return sd_bus_message_append(reply, "b", manager_is_docked_or_external_displays(m));
|
return sd_bus_message_append(reply, "b", manager_is_docked_or_external_displays(m));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int property_get_current_sessions(
|
||||||
|
sd_bus *bus,
|
||||||
|
const char *path,
|
||||||
|
const char *interface,
|
||||||
|
const char *property,
|
||||||
|
sd_bus_message *reply,
|
||||||
|
void *userdata,
|
||||||
|
sd_bus_error *error) {
|
||||||
|
|
||||||
|
Manager *m = userdata;
|
||||||
|
|
||||||
|
assert(bus);
|
||||||
|
assert(reply);
|
||||||
|
assert(m);
|
||||||
|
|
||||||
|
return sd_bus_message_append(reply, "t", (uint64_t) hashmap_size(m->sessions));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int property_get_current_inhibitors(
|
||||||
|
sd_bus *bus,
|
||||||
|
const char *path,
|
||||||
|
const char *interface,
|
||||||
|
const char *property,
|
||||||
|
sd_bus_message *reply,
|
||||||
|
void *userdata,
|
||||||
|
sd_bus_error *error) {
|
||||||
|
|
||||||
|
Manager *m = userdata;
|
||||||
|
|
||||||
|
assert(bus);
|
||||||
|
assert(reply);
|
||||||
|
assert(m);
|
||||||
|
|
||||||
|
return sd_bus_message_append(reply, "t", (uint64_t) hashmap_size(m->inhibitors));
|
||||||
|
}
|
||||||
|
|
||||||
static int method_get_session(sd_bus_message *message, void *userdata, sd_bus_error *error) {
|
static int method_get_session(sd_bus_message *message, void *userdata, sd_bus_error *error) {
|
||||||
_cleanup_free_ char *p = NULL;
|
_cleanup_free_ char *p = NULL;
|
||||||
Manager *m = userdata;
|
Manager *m = userdata;
|
||||||
@ -725,6 +761,9 @@ static int method_create_session(sd_bus_message *message, void *userdata, sd_bus
|
|||||||
m->seat0->positions[vtnr]->class != SESSION_GREETER)
|
m->seat0->positions[vtnr]->class != SESSION_GREETER)
|
||||||
return sd_bus_error_setf(error, BUS_ERROR_SESSION_BUSY, "Already occupied by a session");
|
return sd_bus_error_setf(error, BUS_ERROR_SESSION_BUSY, "Already occupied by a session");
|
||||||
|
|
||||||
|
if (hashmap_size(m->sessions) >= m->sessions_max)
|
||||||
|
return sd_bus_error_setf(error, SD_BUS_ERROR_LIMITS_EXCEEDED, "Maximum number of sessions (%" PRIu64 ") reached, refusing further sessions.", m->sessions_max);
|
||||||
|
|
||||||
audit_session_from_pid(leader, &audit_id);
|
audit_session_from_pid(leader, &audit_id);
|
||||||
if (audit_id > 0) {
|
if (audit_id > 0) {
|
||||||
/* Keep our session IDs and the audit session IDs in sync */
|
/* Keep our session IDs and the audit session IDs in sync */
|
||||||
@ -2442,6 +2481,9 @@ static int method_inhibit(sd_bus_message *message, void *userdata, sd_bus_error
|
|||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
|
if (hashmap_size(m->inhibitors) >= m->inhibitors_max)
|
||||||
|
return sd_bus_error_setf(error, SD_BUS_ERROR_LIMITS_EXCEEDED, "Maximum number of inhibitors (%" PRIu64 ") reached, refusing further inhibitors.", m->inhibitors_max);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
id = mfree(id);
|
id = mfree(id);
|
||||||
|
|
||||||
@ -2512,6 +2554,13 @@ const sd_bus_vtable manager_vtable[] = {
|
|||||||
SD_BUS_PROPERTY("PreparingForSleep", "b", property_get_preparing, 0, 0),
|
SD_BUS_PROPERTY("PreparingForSleep", "b", property_get_preparing, 0, 0),
|
||||||
SD_BUS_PROPERTY("ScheduledShutdown", "(st)", property_get_scheduled_shutdown, 0, 0),
|
SD_BUS_PROPERTY("ScheduledShutdown", "(st)", property_get_scheduled_shutdown, 0, 0),
|
||||||
SD_BUS_PROPERTY("Docked", "b", property_get_docked, 0, 0),
|
SD_BUS_PROPERTY("Docked", "b", property_get_docked, 0, 0),
|
||||||
|
SD_BUS_PROPERTY("RemoveIPC", "b", bus_property_get_bool, offsetof(Manager, remove_ipc), SD_BUS_VTABLE_PROPERTY_CONST),
|
||||||
|
SD_BUS_PROPERTY("RuntimeDirectorySize", "t", bus_property_get_size, offsetof(Manager, runtime_dir_size), SD_BUS_VTABLE_PROPERTY_CONST),
|
||||||
|
SD_BUS_PROPERTY("InhibitorsMax", "t", NULL, offsetof(Manager, inhibitors_max), SD_BUS_VTABLE_PROPERTY_CONST),
|
||||||
|
SD_BUS_PROPERTY("NCurrentInhibitors", "t", property_get_current_inhibitors, 0, 0),
|
||||||
|
SD_BUS_PROPERTY("SessionsMax", "t", NULL, offsetof(Manager, sessions_max), SD_BUS_VTABLE_PROPERTY_CONST),
|
||||||
|
SD_BUS_PROPERTY("NCurrentSessions", "t", property_get_current_sessions, 0, 0),
|
||||||
|
SD_BUS_PROPERTY("UserTasksMax", "t", NULL, offsetof(Manager, user_tasks_max), SD_BUS_VTABLE_PROPERTY_CONST),
|
||||||
|
|
||||||
SD_BUS_METHOD("GetSession", "s", "o", method_get_session, SD_BUS_VTABLE_UNPRIVILEGED),
|
SD_BUS_METHOD("GetSession", "s", "o", method_get_session, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||||
SD_BUS_METHOD("GetSessionByPID", "u", "o", method_get_session_by_pid, SD_BUS_VTABLE_UNPRIVILEGED),
|
SD_BUS_METHOD("GetSessionByPID", "u", "o", method_get_session_by_pid, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||||
|
@ -34,4 +34,6 @@ Login.IdleAction, config_parse_handle_action, 0, offsetof(Manag
|
|||||||
Login.IdleActionSec, config_parse_sec, 0, offsetof(Manager, idle_action_usec)
|
Login.IdleActionSec, config_parse_sec, 0, offsetof(Manager, idle_action_usec)
|
||||||
Login.RuntimeDirectorySize, config_parse_tmpfs_size, 0, offsetof(Manager, runtime_dir_size)
|
Login.RuntimeDirectorySize, config_parse_tmpfs_size, 0, offsetof(Manager, runtime_dir_size)
|
||||||
Login.RemoveIPC, config_parse_bool, 0, offsetof(Manager, remove_ipc)
|
Login.RemoveIPC, config_parse_bool, 0, offsetof(Manager, remove_ipc)
|
||||||
|
Login.InhibitorsMax, config_parse_uint64, 0, offsetof(Manager, inhibitors_max)
|
||||||
|
Login.SessionsMax, config_parse_uint64, 0, offsetof(Manager, sessions_max)
|
||||||
Login.UserTasksMax, config_parse_uint64, 0, offsetof(Manager, user_tasks_max)
|
Login.UserTasksMax, config_parse_uint64, 0, offsetof(Manager, user_tasks_max)
|
||||||
|
@ -317,7 +317,7 @@ int inhibitor_create_fifo(Inhibitor *i) {
|
|||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
r = sd_event_source_set_priority(i->event_source, SD_EVENT_PRIORITY_IDLE);
|
r = sd_event_source_set_priority(i->event_source, SD_EVENT_PRIORITY_IDLE-10);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
@ -306,7 +306,7 @@ const sd_bus_vtable seat_vtable[] = {
|
|||||||
SD_BUS_PROPERTY("CanMultiSession", "b", property_get_can_multi_session, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
SD_BUS_PROPERTY("CanMultiSession", "b", property_get_can_multi_session, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
||||||
SD_BUS_PROPERTY("CanTTY", "b", property_get_can_tty, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
SD_BUS_PROPERTY("CanTTY", "b", property_get_can_tty, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
||||||
SD_BUS_PROPERTY("CanGraphical", "b", property_get_can_graphical, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
|
SD_BUS_PROPERTY("CanGraphical", "b", property_get_can_graphical, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
|
||||||
SD_BUS_PROPERTY("Sessions", "a(so)", property_get_sessions, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
|
SD_BUS_PROPERTY("Sessions", "a(so)", property_get_sessions, 0, 0),
|
||||||
SD_BUS_PROPERTY("IdleHint", "b", property_get_idle_hint, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
|
SD_BUS_PROPERTY("IdleHint", "b", property_get_idle_hint, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
|
||||||
SD_BUS_PROPERTY("IdleSinceHint", "t", property_get_idle_since_hint, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
|
SD_BUS_PROPERTY("IdleSinceHint", "t", property_get_idle_since_hint, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
|
||||||
SD_BUS_PROPERTY("IdleSinceHintMonotonic", "t", property_get_idle_since_hint, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
|
SD_BUS_PROPERTY("IdleSinceHintMonotonic", "t", property_get_idle_since_hint, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
|
||||||
|
@ -897,7 +897,9 @@ int session_create_fifo(Session *s) {
|
|||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
r = sd_event_source_set_priority(s->fifo_event_source, SD_EVENT_PRIORITY_IDLE);
|
/* Let's make sure we noticed dead sessions before we process new bus requests (which might create new
|
||||||
|
* sessions). */
|
||||||
|
r = sd_event_source_set_priority(s->fifo_event_source, SD_EVENT_PRIORITY_NORMAL-10);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
@ -245,7 +245,7 @@ const sd_bus_vtable user_vtable[] = {
|
|||||||
SD_BUS_PROPERTY("Slice", "s", NULL, offsetof(User, slice), SD_BUS_VTABLE_PROPERTY_CONST),
|
SD_BUS_PROPERTY("Slice", "s", NULL, offsetof(User, slice), SD_BUS_VTABLE_PROPERTY_CONST),
|
||||||
SD_BUS_PROPERTY("Display", "(so)", property_get_display, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
|
SD_BUS_PROPERTY("Display", "(so)", property_get_display, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
|
||||||
SD_BUS_PROPERTY("State", "s", property_get_state, 0, 0),
|
SD_BUS_PROPERTY("State", "s", property_get_state, 0, 0),
|
||||||
SD_BUS_PROPERTY("Sessions", "a(so)", property_get_sessions, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
|
SD_BUS_PROPERTY("Sessions", "a(so)", property_get_sessions, 0, 0),
|
||||||
SD_BUS_PROPERTY("IdleHint", "b", property_get_idle_hint, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
|
SD_BUS_PROPERTY("IdleHint", "b", property_get_idle_hint, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
|
||||||
SD_BUS_PROPERTY("IdleSinceHint", "t", property_get_idle_since_hint, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
|
SD_BUS_PROPERTY("IdleSinceHint", "t", property_get_idle_since_hint, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
|
||||||
SD_BUS_PROPERTY("IdleSinceHintMonotonic", "t", property_get_idle_since_hint, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
|
SD_BUS_PROPERTY("IdleSinceHintMonotonic", "t", property_get_idle_since_hint, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
|
||||||
|
@ -62,7 +62,9 @@ static void manager_reset_config(Manager *m) {
|
|||||||
m->idle_action = HANDLE_IGNORE;
|
m->idle_action = HANDLE_IGNORE;
|
||||||
|
|
||||||
m->runtime_dir_size = PAGE_ALIGN((size_t) (physical_memory() / 10)); /* 10% */
|
m->runtime_dir_size = PAGE_ALIGN((size_t) (physical_memory() / 10)); /* 10% */
|
||||||
m->user_tasks_max = UINT64_C(12288);
|
m->user_tasks_max = 12288;
|
||||||
|
m->sessions_max = 8192;
|
||||||
|
m->inhibitors_max = 8192;
|
||||||
|
|
||||||
m->kill_user_processes = KILL_USER_PROCESSES;
|
m->kill_user_processes = KILL_USER_PROCESSES;
|
||||||
|
|
||||||
@ -686,7 +688,7 @@ static int manager_connect_bus(Manager *m) {
|
|||||||
if (r < 0)
|
if (r < 0)
|
||||||
return log_error_errno(r, "Failed to register name: %m");
|
return log_error_errno(r, "Failed to register name: %m");
|
||||||
|
|
||||||
r = sd_bus_attach_event(m->bus, m->event, 0);
|
r = sd_bus_attach_event(m->bus, m->event, SD_EVENT_PRIORITY_NORMAL);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return log_error_errno(r, "Failed to attach bus to event loop: %m");
|
return log_error_errno(r, "Failed to attach bus to event loop: %m");
|
||||||
|
|
||||||
|
@ -32,4 +32,6 @@
|
|||||||
#IdleActionSec=30min
|
#IdleActionSec=30min
|
||||||
#RuntimeDirectorySize=10%
|
#RuntimeDirectorySize=10%
|
||||||
#RemoveIPC=yes
|
#RemoveIPC=yes
|
||||||
|
#InhibitorsMax=8192
|
||||||
|
#SessionsMax=8192
|
||||||
#UserTasksMax=12288
|
#UserTasksMax=12288
|
||||||
|
@ -133,6 +133,8 @@ struct Manager {
|
|||||||
|
|
||||||
size_t runtime_dir_size;
|
size_t runtime_dir_size;
|
||||||
uint64_t user_tasks_max;
|
uint64_t user_tasks_max;
|
||||||
|
uint64_t sessions_max;
|
||||||
|
uint64_t inhibitors_max;
|
||||||
};
|
};
|
||||||
|
|
||||||
int manager_add_device(Manager *m, const char *sysfs, bool master, Device **_device);
|
int manager_add_device(Manager *m, const char *sysfs, bool master, Device **_device);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user