Patchwork net: provide a friendly message when a user passes a bad -net tap, fd=X

login
register
mail settings
Submitter Anthony Liguori
Date Oct. 8, 2010, 10:04 p.m.
Message ID <1286575496-10314-1-git-send-email-aliguori@us.ibm.com>
Download mbox | patch
Permalink /patch/67303/
State New
Headers show

Comments

Anthony Liguori - Oct. 8, 2010, 10:04 p.m.
A lot of people copy libvirt's command line from ps -ef and then wonder why the
VM isn't working correctly.  Let's be kind and tell them what they should do
instead.

Without this patch, if you run with an invalid -net tap,fd=X, the guest still
runs and we poll 100% on a bad file descriptor.  With this patch, you get:

 qemu: -net tap,fd=42: invalid fd= for tap network device.  If you're copying
 from libvirt, use `virsh dom2xml-to-native' instead
 qemu: -net tap,fd=42: Device 'tap' could not be initialized

Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Alexander Graf - Oct. 8, 2010, 11:28 p.m.
On 09.10.2010, at 00:04, Anthony Liguori wrote:

> A lot of people copy libvirt's command line from ps -ef and then wonder why the
> VM isn't working correctly.  Let's be kind and tell them what they should do
> instead.
> 
> Without this patch, if you run with an invalid -net tap,fd=X, the guest still
> runs and we poll 100% on a bad file descriptor.  With this patch, you get:
> 
> qemu: -net tap,fd=42: invalid fd= for tap network device.  If you're copying
> from libvirt, use `virsh dom2xml-to-native' instead
> qemu: -net tap,fd=42: Device 'tap' could not be initialized
> 
> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
> 
> diff --git a/hw/usb-uhci.c b/hw/usb-uhci.c
> index 1d83400..5f9f749 100644
> --- a/hw/usb-uhci.c
> +++ b/hw/usb-uhci.c
> @@ -64,7 +64,7 @@
> #define UHCI_PORT_CSC   (1 << 1)
> #define UHCI_PORT_CCS   (1 << 0)
> 
> -#define FRAME_TIMER_FREQ 1000
> +#define FRAME_TIMER_FREQ 500
> 
> #define FRAME_MAX_LOOPS  100
> 
> @@ -1054,7 +1054,7 @@ static void uhci_frame_timer(void *opaque)
>     UHCIState *s = opaque;
> 
>     /* prepare the timer for the next frame */
> -    s->expire_time += (get_ticks_per_sec() / FRAME_TIMER_FREQ);
> +    s->expire_time = qemu_get_clock(vm_clock) + (get_ticks_per_sec() / FRAME_TIMER_FREQ);

How exactly is this related?

Alex
Anthony Liguori - Oct. 8, 2010, 11:36 p.m.
On 10/08/2010 06:28 PM, Alexander Graf wrote:
> On 09.10.2010, at 00:04, Anthony Liguori wrote:
>
>    
>> A lot of people copy libvirt's command line from ps -ef and then wonder why the
>> VM isn't working correctly.  Let's be kind and tell them what they should do
>> instead.
>>
>> Without this patch, if you run with an invalid -net tap,fd=X, the guest still
>> runs and we poll 100% on a bad file descriptor.  With this patch, you get:
>>
>> qemu: -net tap,fd=42: invalid fd= for tap network device.  If you're copying
>> from libvirt, use `virsh dom2xml-to-native' instead
>> qemu: -net tap,fd=42: Device 'tap' could not be initialized
>>
>> Signed-off-by: Anthony Liguori<aliguori@us.ibm.com>
>>
>> diff --git a/hw/usb-uhci.c b/hw/usb-uhci.c
>> index 1d83400..5f9f749 100644
>> --- a/hw/usb-uhci.c
>> +++ b/hw/usb-uhci.c
>> @@ -64,7 +64,7 @@
>> #define UHCI_PORT_CSC   (1<<  1)
>> #define UHCI_PORT_CCS   (1<<  0)
>>
>> -#define FRAME_TIMER_FREQ 1000
>> +#define FRAME_TIMER_FREQ 500
>>
>> #define FRAME_MAX_LOOPS  100
>>
>> @@ -1054,7 +1054,7 @@ static void uhci_frame_timer(void *opaque)
>>      UHCIState *s = opaque;
>>
>>      /* prepare the timer for the next frame */
>> -    s->expire_time += (get_ticks_per_sec() / FRAME_TIMER_FREQ);
>> +    s->expire_time = qemu_get_clock(vm_clock) + (get_ticks_per_sec() / FRAME_TIMER_FREQ);
>>      
> How exactly is this related?
>    

So, didn't have a clean working directory.

Regards,

Anthony Liguori

> Alex
>
>
>
Daniel P. Berrange - Oct. 11, 2010, 9:45 a.m.
On Fri, Oct 08, 2010 at 05:04:56PM -0500, Anthony Liguori wrote:
> A lot of people copy libvirt's command line from ps -ef and then wonder why the
> VM isn't working correctly.  Let's be kind and tell them what they should do
> instead.
> 
> Without this patch, if you run with an invalid -net tap,fd=X, the guest still
> runs and we poll 100% on a bad file descriptor.  With this patch, you get:
> 
>  qemu: -net tap,fd=42: invalid fd= for tap network device.  If you're copying
>  from libvirt, use `virsh dom2xml-to-native' instead
>  qemu: -net tap,fd=42: Device 'tap' could not be initialized
> 
> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
> 
> diff --git a/hw/usb-uhci.c b/hw/usb-uhci.c
> index 1d83400..5f9f749 100644
> --- a/hw/usb-uhci.c
> +++ b/hw/usb-uhci.c
> @@ -64,7 +64,7 @@
>  #define UHCI_PORT_CSC   (1 << 1)
>  #define UHCI_PORT_CCS   (1 << 0)
>  
> -#define FRAME_TIMER_FREQ 1000
> +#define FRAME_TIMER_FREQ 500
>  
>  #define FRAME_MAX_LOOPS  100
>  
> @@ -1054,7 +1054,7 @@ static void uhci_frame_timer(void *opaque)
>      UHCIState *s = opaque;
>  
>      /* prepare the timer for the next frame */
> -    s->expire_time += (get_ticks_per_sec() / FRAME_TIMER_FREQ);
> +    s->expire_time = qemu_get_clock(vm_clock) + (get_ticks_per_sec() / FRAME_TIMER_FREQ);
>  
>      if (!(s->cmd & UHCI_CMD_RS)) {
>          /* Full stop */
> diff --git a/net/tap.c b/net/tap.c
> index 0147dab..45b1fb6 100644
> --- a/net/tap.c
> +++ b/net/tap.c
> @@ -405,6 +405,8 @@ int net_init_tap(QemuOpts *opts, Monitor *mon, const char *name, VLANState *vlan
>      int fd, vnet_hdr = 0;
>  
>      if (qemu_opt_get(opts, "fd")) {
> +        int flags;
> +
>          if (qemu_opt_get(opts, "ifname") ||
>              qemu_opt_get(opts, "script") ||
>              qemu_opt_get(opts, "downscript") ||
> @@ -418,6 +420,11 @@ int net_init_tap(QemuOpts *opts, Monitor *mon, const char *name, VLANState *vlan
>              return -1;
>          }
>  
> +        if (fcntl(fd, F_GETFL, &flags) == -1) {
> +            error_report("invalid fd= for tap network device.  If you're copying from libvirt, use `virsh dom2xml-to-native' instead");

It is just 'domxml-to-native' - no '2' in there.

Should it check for EBADF explicitly ? I guess this is the only errno that
can really happen here, but I always prefer strict checks myself.


Regards,
Daniel

Patch

diff --git a/hw/usb-uhci.c b/hw/usb-uhci.c
index 1d83400..5f9f749 100644
--- a/hw/usb-uhci.c
+++ b/hw/usb-uhci.c
@@ -64,7 +64,7 @@ 
 #define UHCI_PORT_CSC   (1 << 1)
 #define UHCI_PORT_CCS   (1 << 0)
 
-#define FRAME_TIMER_FREQ 1000
+#define FRAME_TIMER_FREQ 500
 
 #define FRAME_MAX_LOOPS  100
 
@@ -1054,7 +1054,7 @@  static void uhci_frame_timer(void *opaque)
     UHCIState *s = opaque;
 
     /* prepare the timer for the next frame */
-    s->expire_time += (get_ticks_per_sec() / FRAME_TIMER_FREQ);
+    s->expire_time = qemu_get_clock(vm_clock) + (get_ticks_per_sec() / FRAME_TIMER_FREQ);
 
     if (!(s->cmd & UHCI_CMD_RS)) {
         /* Full stop */
diff --git a/net/tap.c b/net/tap.c
index 0147dab..45b1fb6 100644
--- a/net/tap.c
+++ b/net/tap.c
@@ -405,6 +405,8 @@  int net_init_tap(QemuOpts *opts, Monitor *mon, const char *name, VLANState *vlan
     int fd, vnet_hdr = 0;
 
     if (qemu_opt_get(opts, "fd")) {
+        int flags;
+
         if (qemu_opt_get(opts, "ifname") ||
             qemu_opt_get(opts, "script") ||
             qemu_opt_get(opts, "downscript") ||
@@ -418,6 +420,11 @@  int net_init_tap(QemuOpts *opts, Monitor *mon, const char *name, VLANState *vlan
             return -1;
         }
 
+        if (fcntl(fd, F_GETFL, &flags) == -1) {
+            error_report("invalid fd= for tap network device.  If you're copying from libvirt, use `virsh dom2xml-to-native' instead");
+            return -1;
+        }
+
         fcntl(fd, F_SETFL, O_NONBLOCK);
 
         vnet_hdr = tap_probe_vnet_hdr(fd);