chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
bus: add minimal locking around the memfd cache
[elogind.git]
/
src
/
libsystemd-bus
/
bus-kernel.c
diff --git
a/src/libsystemd-bus/bus-kernel.c
b/src/libsystemd-bus/bus-kernel.c
index 8ef5752b311ce5cd237f88c19f3fedc5f881b998..699d24185ea1e1c521fd87c009a58c66030f01bc 100644
(file)
--- a/
src/libsystemd-bus/bus-kernel.c
+++ b/
src/libsystemd-bus/bus-kernel.c
@@
-45,8
+45,6
@@
#define KDBUS_ITEM_HEADER_SIZE offsetof(struct kdbus_item, data)
#define KDBUS_ITEM_SIZE(s) ALIGN8((s) + KDBUS_ITEM_HEADER_SIZE)
#define KDBUS_ITEM_HEADER_SIZE offsetof(struct kdbus_item, data)
#define KDBUS_ITEM_SIZE(s) ALIGN8((s) + KDBUS_ITEM_HEADER_SIZE)
-#define KDBUS_POOL_SIZE (4*1024*1024)
-
static int parse_unique_name(const char *s, uint64_t *id) {
int r;
static int parse_unique_name(const char *s, uint64_t *id) {
int r;
@@
-723,6
+721,7
@@
int bus_kernel_create(const char *name, char **s) {
int bus_kernel_pop_memfd(sd_bus *bus, void **address, size_t *size) {
struct memfd_cache *c;
int bus_kernel_pop_memfd(sd_bus *bus, void **address, size_t *size) {
struct memfd_cache *c;
+ int fd;
assert(address);
assert(size);
assert(address);
assert(size);
@@
-730,8
+729,12
@@
int bus_kernel_pop_memfd(sd_bus *bus, void **address, size_t *size) {
if (!bus || !bus->is_kernel)
return -ENOTSUP;
if (!bus || !bus->is_kernel)
return -ENOTSUP;
+ assert_se(pthread_mutex_lock(&bus->memfd_cache_mutex) == 0);
+
if (bus->n_memfd_cache <= 0) {
if (bus->n_memfd_cache <= 0) {
- int fd, r;
+ int r;
+
+ assert_se(pthread_mutex_unlock(&bus->memfd_cache_mutex) == 0);
r = ioctl(bus->input_fd, KDBUS_CMD_MEMFD_NEW, &fd);
if (r < 0)
r = ioctl(bus->input_fd, KDBUS_CMD_MEMFD_NEW, &fd);
if (r < 0)
@@
-749,8
+752,18
@@
int bus_kernel_pop_memfd(sd_bus *bus, void **address, size_t *size) {
*address = c->address;
*size = c->size;
*address = c->address;
*size = c->size;
+ fd = c->fd;
+
+ assert_se(pthread_mutex_unlock(&bus->memfd_cache_mutex) == 0);
+
+ return fd;
+}
+
+static void close_and_munmap(int fd, void *address, size_t size) {
+ if (size > 0)
+ assert_se(munmap(address, PAGE_ALIGN(size)) == 0);
-
return c->fd
;
+
close_nointr_nofail(fd)
;
}
void bus_kernel_push_memfd(sd_bus *bus, int fd, void *address, size_t size) {
}
void bus_kernel_push_memfd(sd_bus *bus, int fd, void *address, size_t size) {
@@
-759,13
+772,17
@@
void bus_kernel_push_memfd(sd_bus *bus, int fd, void *address, size_t size) {
assert(fd >= 0);
assert(size == 0 || address);
assert(fd >= 0);
assert(size == 0 || address);
- if (!bus || !bus->is_kernel ||
- bus->n_memfd_cache >= ELEMENTSOF(bus->memfd_cache)) {
+ if (!bus || !bus->is_kernel) {
+ close_and_munmap(fd, address, size);
+ return;
+ }
- if (size > 0)
- assert_se(munmap(address, PAGE_ALIGN(size)) == 0);
+ assert_se(pthread_mutex_lock(&bus->memfd_cache_mutex) == 0);
- close_nointr_nofail(fd);
+ if (bus->n_memfd_cache >= ELEMENTSOF(bus->memfd_cache)) {
+ assert_se(pthread_mutex_unlock(&bus->memfd_cache_mutex) == 0);
+
+ close_and_munmap(fd, address, size);
return;
}
return;
}
@@
-782,6
+799,8
@@
void bus_kernel_push_memfd(sd_bus *bus, int fd, void *address, size_t size) {
c->size = MEMFD_CACHE_ITEM_SIZE_MAX;
} else
c->size = size;
c->size = MEMFD_CACHE_ITEM_SIZE_MAX;
} else
c->size = size;
+
+ assert_se(pthread_mutex_unlock(&bus->memfd_cache_mutex) == 0);
}
void bus_kernel_flush_memfd(sd_bus *b) {
}
void bus_kernel_flush_memfd(sd_bus *b) {