summaryrefslogtreecommitdiff
path: root/src/device.c
diff options
context:
space:
mode:
authorMichal Schmidt <mschmidt@redhat.com>2012-01-15 10:53:49 +0100
committerMichal Schmidt <mschmidt@redhat.com>2012-01-16 13:34:42 +0100
commit7d17cfbc46306a106dbda0f3e92fbc0792d1e9e9 (patch)
tree44cb574e7d149a306287c51c7d57f4eff41c5a98 /src/device.c
parent1637a8be5570dff7ce402451240b28ddb54e5dca (diff)
unit: reduce heap usage for unit objects
The storage of the unit objects on the heap is currently not very efficient. For every unit object we allocate a chunk of memory as large as the biggest unit type, although there are significant differences in the units' real requirements. pahole shows the following sizes of structs: 488 Target 496 Snapshot 512 Device 528 Path 560 Timer 576 Automount 1080 Socket 1160 Swap 1168 Service 1280 Mount Usually there aren't many targets or snapshots in the system, but Device is one of the most common unit types and for every one we waste 1280 - 512 = 768 bytes. Fix it by allocating only the right amount for the given unit type. On my machine (x86_64, with 39 LVM volumes) this decreases systemd's USS (unique set size) by more than 300 KB.
Diffstat (limited to 'src/device.c')
-rw-r--r--src/device.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/src/device.c b/src/device.c
index bffeca0d1..64665a8b8 100644
--- a/src/device.c
+++ b/src/device.c
@@ -198,10 +198,12 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
if (!u) {
delete = true;
- if (!(u = unit_new(m)))
+ u = unit_new(m, sizeof(Device));
+ if (!u)
return -ENOMEM;
- if ((r = device_add_escaped_name(u, path)) < 0)
+ r = device_add_escaped_name(u, path);
+ if (r < 0)
goto fail;
unit_add_to_load_queue(u);
@@ -583,6 +585,7 @@ DEFINE_STRING_TABLE_LOOKUP(device_state, DeviceState);
const UnitVTable device_vtable = {
.suffix = ".device",
+ .object_size = sizeof(Device),
.sections =
"Unit\0"
"Device\0"