aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkfraser@localhost.localdomain <kfraser@localhost.localdomain>2007-05-24 15:25:35 +0100
committerkfraser@localhost.localdomain <kfraser@localhost.localdomain>2007-05-24 15:25:35 +0100
commitc0a12ddfdcaaab607929917b857c039d9371c372 (patch)
treed98c64aa4ff2099240c2f6724d5945b7f9d4a492
parentbe422ace19118d2bf8415bfcaeda9fdf06b50bd4 (diff)
downloadxen-c0a12ddfdcaaab607929917b857c039d9371c372.tar.gz
xen-c0a12ddfdcaaab607929917b857c039d9371c372.tar.bz2
xen-c0a12ddfdcaaab607929917b857c039d9371c372.zip
ioemu: Attempt to setup tap interface up to 3 times.
As there is a (small) chance that vl.c:tap_open() fails (due to some sort of race-condition in the Linux kernel, which is noted as a bug in the source .../net/core/dev.c), we should attempt it again a couple of times if it doesn't succeed on the first attempt. I think three times in total is sufficient to avoid the problem. If tap_open() fails, qemu-dm will exit, which means that the domain dies - which is not such a good thing when attempting to restore a saved domain [of course, it would be even worse if it started, but didn't have networking - because there may not be a way to shut it down cleanly without network]. Signed-off-by: Mats Petersson <mats.petersson@amd.com>
-rw-r--r--tools/ioemu/vl.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/tools/ioemu/vl.c b/tools/ioemu/vl.c
index 32d5163b4e..b1fe292d9b 100644
--- a/tools/ioemu/vl.c
+++ b/tools/ioemu/vl.c
@@ -3399,7 +3399,7 @@ static int tap_open(char *ifname, int ifname_size)
static int tap_open(char *ifname, int ifname_size)
{
struct ifreq ifr;
- int fd, ret;
+ int fd, ret, retries = 0;
fd = open("/dev/net/tun", O_RDWR);
if (fd < 0) {
@@ -3412,7 +3412,9 @@ static int tap_open(char *ifname, int ifname_size)
pstrcpy(ifr.ifr_name, IFNAMSIZ, ifname);
else
pstrcpy(ifr.ifr_name, IFNAMSIZ, "tap%d");
- ret = ioctl(fd, TUNSETIFF, (void *) &ifr);
+ do {
+ ret = ioctl(fd, TUNSETIFF, (void *) &ifr);
+ } while ((ret != 0) && (retries++ < 3));
if (ret != 0) {
fprintf(stderr, "warning: could not configure /dev/net/tun: no virtual network emulation\n");
close(fd);