diff options
-rw-r--r-- | src/libsystemd/sd-bus/bus-kernel.c | 7 | ||||
-rw-r--r-- | src/libsystemd/sd-bus/kdbus.h | 16 | ||||
-rw-r--r-- | src/libsystemd/sd-bus/test-bus-kernel.c | 2 |
3 files changed, 15 insertions, 10 deletions
diff --git a/src/libsystemd/sd-bus/bus-kernel.c b/src/libsystemd/sd-bus/bus-kernel.c index e90ee449d9..df772036ee 100644 --- a/src/libsystemd/sd-bus/bus-kernel.c +++ b/src/libsystemd/sd-bus/bus-kernel.c @@ -1345,15 +1345,12 @@ int bus_kernel_read_message(sd_bus *bus, bool hint_priority, int64_t priority) { } r = ioctl(bus->input_fd, KDBUS_CMD_RECV, &recv); + if (recv.return_flags & KDBUS_RECV_RETURN_DROPPED_MSGS) + log_debug("%s: kdbus reports %" PRIu64 " dropped broadcast messages, ignoring.", strna(bus->description), (uint64_t) recv.dropped_msgs); if (r < 0) { if (errno == EAGAIN) return 0; - if (errno == EOVERFLOW) { - log_debug("%s: kdbus reports %" PRIu64 " dropped broadcast messages, ignoring.", strna(bus->description), (uint64_t) recv.dropped_msgs); - return 0; - } - return -errno; } diff --git a/src/libsystemd/sd-bus/kdbus.h b/src/libsystemd/sd-bus/kdbus.h index 1cc475eb1d..f7fbfd9929 100644 --- a/src/libsystemd/sd-bus/kdbus.h +++ b/src/libsystemd/sd-bus/kdbus.h @@ -602,9 +602,15 @@ enum kdbus_recv_flags { * @KDBUS_RECV_RETURN_INCOMPLETE_FDS: One or more file descriptors could not * be installed. These descriptors in * KDBUS_ITEM_FDS will carry the value -1. + * @KDBUS_RECV_RETURN_DROPPED_MSGS: There have been dropped messages since + * the last time a message was received. + * The 'dropped_msgs' counter contains the + * number of messages dropped pool + * overflows or other missed broadcasts. */ enum kdbus_recv_return_flags { KDBUS_RECV_RETURN_INCOMPLETE_FDS = 1ULL << 0, + KDBUS_RECV_RETURN_DROPPED_MSGS = 1ULL << 1, }; /** @@ -614,10 +620,12 @@ enum kdbus_recv_return_flags { * @return_flags: Command return flags, kernel → userspace * @priority: Minimum priority of the messages to de-queue. Lowest * values have the highest priority. - * @dropped_msgs: In case the KDBUS_CMD_RECV ioctl returns - * -EOVERFLOW, this field will contain the number of - * broadcast messages that have been lost since the - * last call. + * @dropped_msgs: In case there were any dropped messages since the last + * time a message was received, this will be set to the + * number of lost messages and + * KDBUS_RECV_RETURN_DROPPED_MSGS will be set in + * 'return_flags'. This can only happen if the ioctl + * returns 0 or EAGAIN. * @msg: Return storage for received message. * @items: Additional items for this command. * diff --git a/src/libsystemd/sd-bus/test-bus-kernel.c b/src/libsystemd/sd-bus/test-bus-kernel.c index 3aec568229..c396eac2d2 100644 --- a/src/libsystemd/sd-bus/test-bus-kernel.c +++ b/src/libsystemd/sd-bus/test-bus-kernel.c @@ -119,7 +119,7 @@ int main(int argc, char *argv[]) { assert_se(r == -EBUSY); r = sd_bus_process_priority(b, -10, &m); - assert_se(r == -ENOMSG); + assert_se(r == 0); r = sd_bus_process(b, &m); assert_se(r > 0); |