[PATCH v3 2/2] ubusd: add per-client tx queue limit

Arnout Vandecappelle (Essensium/Mind) arnout at mind.be
Thu Mar 25 21:45:02 GMT 2021


No new message can be enqueued if this brings the total queue length of
that client over UBUS_CLIENT_MAX_TXQ_LEN.

Set UBUS_CLIENT_MAX_TXQ_LEN to UBUS_MAX_MSGLEN, i.e. 1MB. This limit
should be plenty for any practical use case.

Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout at mind.be>
---
v3: new patch

I've tested this patch by creating about 40K objects on the bus, which
should be more than enough to reach the 1MB limit. And indeed, if I do
"ubus list | wc", I get 40K lines, but if I do "ubus list | less", it
stops at around 1000 lines (1K per object, is that realistic? Feels a
bit high to me...).
---
 ubusd.c      | 5 +++++
 ubusd.h      | 2 ++
 ubusd_main.c | 1 +
 3 files changed, 8 insertions(+)

diff --git a/ubusd.c b/ubusd.c
index c324c70..0e1b0c9 100644
--- a/ubusd.c
+++ b/ubusd.c
@@ -144,6 +144,9 @@ static void ubus_msg_enqueue(struct ubus_client *cl, struct ubus_msg_buf *ub)
 {
 	struct ubus_msg_buf_list *ubl;
 
+	if (cl->txq_len + ub->len > UBUS_CLIENT_MAX_TXQ_LEN)
+		return;
+
 	ubl = calloc(1, sizeof(struct ubus_msg_buf_list));
 	if (!ubl)
 		return;
@@ -152,6 +155,7 @@ static void ubus_msg_enqueue(struct ubus_client *cl, struct ubus_msg_buf *ub)
 	ubl->msg = ubus_msg_ref(ub);
 
 	list_add_tail(&cl->tx_queue, &ubl->list);
+	cl->txq_len += ub->len;
 }
 
 /* takes the msgbuf reference */
@@ -172,6 +176,7 @@ void ubus_msg_send(struct ubus_client *cl, struct ubus_msg_buf *ub)
 			return;
 
 		cl->txq_ofs = written;
+		cl->txq_len = -written;
 
 		/* get an event once we can write to the socket again */
 		uloop_fd_add(&cl->sock, ULOOP_READ | ULOOP_WRITE | ULOOP_EDGE_TRIGGER);
diff --git a/ubusd.h b/ubusd.h
index f34cba1..c5d6d2a 100644
--- a/ubusd.h
+++ b/ubusd.h
@@ -24,6 +24,7 @@
 #include "ubusd_acl.h"
 
 #define UBUS_OBJ_HASH_BITS	4
+#define UBUS_CLIENT_MAX_TXQ_LEN	UBUS_MAX_MSGLEN
 
 extern struct blob_buf b;
 
@@ -54,6 +55,7 @@ struct ubus_client {
 
 	struct list_head tx_queue;
 	unsigned int txq_ofs;
+	unsigned int txq_len;
 
 	struct ubus_msg_buf *pending_msg;
 	struct ubus_msg_buf *retmsg;
diff --git a/ubusd_main.c b/ubusd_main.c
index 3728a42..d298b51 100644
--- a/ubusd_main.c
+++ b/ubusd_main.c
@@ -74,6 +74,7 @@ static void client_cb(struct uloop_fd *sock, unsigned int events)
 		}
 
 		cl->txq_ofs += written;
+		cl->txq_len -= written;
 		if (cl->txq_ofs < ub->len + sizeof(ub->hdr))
 			break;
 
-- 
2.30.2




More information about the openwrt-devel mailing list