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: Liu Ping Fan <pingfank@linux.vnet.ibm.com> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
This commit is contained in:
parent
9b0ca6cc64
commit
a42e9c4188
@ -466,8 +466,7 @@ int main_loop_wait(int nonblocking)
|
|||||||
g_array_set_size(gpollfds, 0); /* reset for new iteration */
|
g_array_set_size(gpollfds, 0); /* reset for new iteration */
|
||||||
/* XXX: separate device handlers from system ones */
|
/* XXX: separate device handlers from system ones */
|
||||||
#ifdef CONFIG_SLIRP
|
#ifdef CONFIG_SLIRP
|
||||||
slirp_update_timeout(&timeout);
|
slirp_pollfds_fill(gpollfds, &timeout);
|
||||||
slirp_pollfds_fill(gpollfds);
|
|
||||||
#endif
|
#endif
|
||||||
qemu_iohandler_fill(gpollfds);
|
qemu_iohandler_fill(gpollfds);
|
||||||
|
|
||||||
|
@ -16,8 +16,7 @@ Slirp *slirp_init(int restricted, struct in_addr vnetwork,
|
|||||||
void *opaque);
|
void *opaque);
|
||||||
void slirp_cleanup(Slirp *slirp);
|
void slirp_cleanup(Slirp *slirp);
|
||||||
|
|
||||||
void slirp_update_timeout(uint32_t *timeout);
|
void slirp_pollfds_fill(GArray *pollfds, uint32_t *timeout);
|
||||||
void slirp_pollfds_fill(GArray *pollfds);
|
|
||||||
|
|
||||||
void slirp_pollfds_poll(GArray *pollfds, int select_error);
|
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_CANFSEND(so) (((so)->so_state & (SS_FCANTSENDMORE|SS_ISFCONNECTED)) == SS_ISFCONNECTED)
|
||||||
#define CONN_CANFRCV(so) (((so)->so_state & (SS_FCANTRCVMORE|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)) {
|
Slirp *slirp;
|
||||||
*timeout = MIN(TIMEOUT_DEFAULT, *timeout);
|
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;
|
Slirp *slirp;
|
||||||
struct socket *so, *so_next;
|
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)
|
void slirp_pollfds_poll(GArray *pollfds, int select_error)
|
||||||
|
@ -1,11 +1,7 @@
|
|||||||
#include "qemu-common.h"
|
#include "qemu-common.h"
|
||||||
#include "slirp/slirp.h"
|
#include "slirp/slirp.h"
|
||||||
|
|
||||||
void slirp_update_timeout(uint32_t *timeout)
|
void slirp_pollfds_fill(GArray *pollfds, uint32_t *timeout)
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void slirp_pollfds_fill(GArray *pollfds)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user