input/ipaccess: Avoid extra poll() call when e1i_ts tx queue becomes empty

Before this patch, the logic (both for delayed tx and immediate tx)
always left the WRITE flag set, and relied on an extra call back from
the main loop (poll()) to disable the flag until it found out there was
nothing else to send.
Instead, let's disable it immediatelly at the time we submit the last
message in the queue.

Change-Id: I0e5da5d1342f352d0e2bca9ee39c768bccb2c8d5
This commit is contained in:
Pau Espin 2022-05-09 12:59:35 +02:00
parent d20a10c58b
commit 90df035a8d
1 changed files with 17 additions and 3 deletions

View File

@ -477,12 +477,24 @@ static void ipaccess_close(struct e1inp_sign_link *sign_link)
}
}
static bool e1i_ts_has_pending_tx_msgs(struct e1inp_ts *e1i_ts)
{
struct e1inp_sign_link *link;
llist_for_each_entry(link, &e1i_ts->sign.sign_links, list) {
if (!llist_empty(&link->tx_list)) {
return true;
}
}
return false;
}
static void timeout_ts1_write(void *data)
{
struct e1inp_ts *e1i_ts = (struct e1inp_ts *)data;
/* trigger write of ts1, due to tx delay timer */
ts_want_write(e1i_ts);
if (e1i_ts_has_pending_tx_msgs(e1i_ts))
ts_want_write(e1i_ts);
}
static int __handle_ts1_write(struct osmo_fd *bfd, struct e1inp_line *line)
@ -535,9 +547,11 @@ static int __handle_ts1_write(struct osmo_fd *bfd, struct e1inp_line *line)
/* set tx delay timer for next event */
osmo_timer_setup(&e1i_ts->sign.tx_timer, timeout_ts1_write, e1i_ts);
osmo_timer_schedule(&e1i_ts->sign.tx_timer, 0, e1i_ts->sign.delay);
}
} else {
out:
if (!e1i_ts_has_pending_tx_msgs(e1i_ts))
osmo_fd_write_disable(bfd);
}
msgb_free(msg);
return ret;
err: