Commit a42e9c41 authored by Liu Ping Fan's avatar Liu Ping Fan Committed by Jan Kiszka

slirp: set mainloop timeout with more precise value

If slirp needs to emulate tcp timeout, then the timeout value
for mainloop should be more precise, which is determined by
slirp's fasttimo or slowtimo. Achieve this by swap the logic
sequence of slirp_pollfds_fill and slirp_update_timeout.
Signed-off-by: default avatarLiu Ping Fan <pingfank@linux.vnet.ibm.com>
Signed-off-by: default avatarJan Kiszka <jan.kiszka@siemens.com>
parent 9b0ca6cc
......@@ -466,8 +466,7 @@ int main_loop_wait(int nonblocking)
g_array_set_size(gpollfds, 0); /* reset for new iteration */
/* XXX: separate device handlers from system ones */
#ifdef CONFIG_SLIRP
slirp_update_timeout(&timeout);
slirp_pollfds_fill(gpollfds);
slirp_pollfds_fill(gpollfds, &timeout);
#endif
qemu_iohandler_fill(gpollfds);
......
......@@ -16,8 +16,7 @@ Slirp *slirp_init(int restricted, struct in_addr vnetwork,
void *opaque);
void slirp_cleanup(Slirp *slirp);
void slirp_update_timeout(uint32_t *timeout);
void slirp_pollfds_fill(GArray *pollfds);
void slirp_pollfds_fill(GArray *pollfds, uint32_t *timeout);
void slirp_pollfds_poll(GArray *pollfds, int select_error);
......
......@@ -262,14 +262,33 @@ void slirp_cleanup(Slirp *slirp)
#define CONN_CANFSEND(so) (((so)->so_state & (SS_FCANTSENDMORE|SS_ISFCONNECTED)) == SS_ISFCONNECTED)
#define CONN_CANFRCV(so) (((so)->so_state & (SS_FCANTRCVMORE|SS_ISFCONNECTED)) == SS_ISFCONNECTED)
void slirp_update_timeout(uint32_t *timeout)
static void slirp_update_timeout(uint32_t *timeout)
{
if (!QTAILQ_EMPTY(&slirp_instances)) {
*timeout = MIN(TIMEOUT_DEFAULT, *timeout);
Slirp *slirp;
uint32_t t;
if (*timeout <= TIMEOUT_FAST) {
return;
}
*timeout = MIN(1000, *timeout);
t = *timeout;
/* If we have tcp timeout with slirp, then we will fill @timeout with
* more precise value.
*/
QTAILQ_FOREACH(slirp, &slirp_instances, entry) {
if (slirp->time_fasttimo) {
*timeout = TIMEOUT_FAST;
return;
}
if (slirp->do_slowtimo) {
t = MIN(TIMEOUT_SLOW, t);
}
}
*timeout = t;
}
void slirp_pollfds_fill(GArray *pollfds)
void slirp_pollfds_fill(GArray *pollfds, uint32_t *timeout)
{
Slirp *slirp;
struct socket *so, *so_next;
......@@ -439,6 +458,7 @@ void slirp_pollfds_fill(GArray *pollfds)
}
}
}
slirp_update_timeout(timeout);
}
void slirp_pollfds_poll(GArray *pollfds, int select_error)
......
#include "qemu-common.h"
#include "slirp/slirp.h"
void slirp_update_timeout(uint32_t *timeout)
{
}
void slirp_pollfds_fill(GArray *pollfds)
void slirp_pollfds_fill(GArray *pollfds, uint32_t *timeout)
{
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment