Re: [PATCH v10 14/20] xen: introduce xenpv bus and a dummy pvcpu device

2014-01-14 Thread Julien Grall
On 01/14/2014 04:20 PM, Roger Pau Monné wrote:
> On 14/01/14 17:14, Julien Grall wrote:
>> On 01/14/2014 04:08 PM, Roger Pau Monné wrote:
>>> On 14/01/14 16:41, Julien Grall wrote:
 On 01/14/2014 02:59 PM, Roger Pau Monne wrote:
> +static int
> +xenpv_attach(device_t dev)
> +{
> + device_t child;
> +
> + if (xen_hvm_domain()) {
> + device_t xenpci;
> + devclass_t dc;
> +
> + /* Make sure xenpci has been attached */
> + dc = devclass_find("xenpci");
> + if (dc == NULL)
> + panic("unable to find xenpci devclass");
> +
> + xenpci = devclass_get_device(dc, 0);
> + if (xenpci == NULL)
> + panic("unable to find xenpci device");
> +
> + if (!device_is_attached(xenpci))
> + panic("trying to attach xenpv before xenpci");
> + }

 Can you use the identify method to add the xenpci device?
>>>
>>> I don't think so, xenpci is a pci device, it is detected and plugged by
>>> the pci bus code.
>>
>> Oups, I though you are trying to add the device. In this case, the check
>> seems pointless. In which case the xenpci couldn't exist?
> 
> It's just a "belt and suspenders", if we attach the xenpv bus without
> xenpci being attached first a bunch of things are going to fail, I
> though it might be best to print a clear error message about what went
> wrong in order to help debug it.

I only see one place which could failed, and we are already protected.
It's when we are trying to allocate space from grant-table via
xenpci_alloc_space.

I think this error should be enough to understand the problem. At the
same time, it's the same things with xenstore. If grant-table
initialization has failed, an error message is just printed and FreeBSD
will likely failed later when it will try to initialized the PV disk.

-- 
Julien Grall
___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"

Re: [PATCH v10 14/20] xen: introduce xenpv bus and a dummy pvcpu device

2014-01-14 Thread Julien Grall
On 01/14/2014 04:08 PM, Roger Pau Monné wrote:
> On 14/01/14 16:41, Julien Grall wrote:
>> On 01/14/2014 02:59 PM, Roger Pau Monne wrote:
>>> +static int
>>> +xenpv_attach(device_t dev)
>>> +{
>>> +   device_t child;
>>> +
>>> +   if (xen_hvm_domain()) {
>>> +   device_t xenpci;
>>> +   devclass_t dc;
>>> +
>>> +   /* Make sure xenpci has been attached */
>>> +   dc = devclass_find("xenpci");
>>> +   if (dc == NULL)
>>> +   panic("unable to find xenpci devclass");
>>> +
>>> +   xenpci = devclass_get_device(dc, 0);
>>> +   if (xenpci == NULL)
>>> +   panic("unable to find xenpci device");
>>> +
>>> +   if (!device_is_attached(xenpci))
>>> +   panic("trying to attach xenpv before xenpci");
>>> +   }
>>
>> Can you use the identify method to add the xenpci device?
> 
> I don't think so, xenpci is a pci device, it is detected and plugged by
> the pci bus code.

Oups, I though you are trying to add the device. In this case, the check
seems pointless. In which case the xenpci couldn't exist?

-- 
Julien Grall
___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"

Re: [PATCH v10 14/20] xen: introduce xenpv bus and a dummy pvcpu device

2014-01-14 Thread Roger Pau Monné
On 14/01/14 17:14, Julien Grall wrote:
> On 01/14/2014 04:08 PM, Roger Pau Monné wrote:
>> On 14/01/14 16:41, Julien Grall wrote:
>>> On 01/14/2014 02:59 PM, Roger Pau Monne wrote:
 +static int
 +xenpv_attach(device_t dev)
 +{
 +  device_t child;
 +
 +  if (xen_hvm_domain()) {
 +  device_t xenpci;
 +  devclass_t dc;
 +
 +  /* Make sure xenpci has been attached */
 +  dc = devclass_find("xenpci");
 +  if (dc == NULL)
 +  panic("unable to find xenpci devclass");
 +
 +  xenpci = devclass_get_device(dc, 0);
 +  if (xenpci == NULL)
 +  panic("unable to find xenpci device");
 +
 +  if (!device_is_attached(xenpci))
 +  panic("trying to attach xenpv before xenpci");
 +  }
>>>
>>> Can you use the identify method to add the xenpci device?
>>
>> I don't think so, xenpci is a pci device, it is detected and plugged by
>> the pci bus code.
> 
> Oups, I though you are trying to add the device. In this case, the check
> seems pointless. In which case the xenpci couldn't exist?

It's just a "belt and suspenders", if we attach the xenpv bus without
xenpci being attached first a bunch of things are going to fail, I
though it might be best to print a clear error message about what went
wrong in order to help debug it.

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"

Re: [PATCH v10 14/20] xen: introduce xenpv bus and a dummy pvcpu device

2014-01-14 Thread Roger Pau Monné
On 14/01/14 16:41, Julien Grall wrote:
> On 01/14/2014 02:59 PM, Roger Pau Monne wrote:
>> +static int
>> +xenpv_attach(device_t dev)
>> +{
>> +device_t child;
>> +
>> +if (xen_hvm_domain()) {
>> +device_t xenpci;
>> +devclass_t dc;
>> +
>> +/* Make sure xenpci has been attached */
>> +dc = devclass_find("xenpci");
>> +if (dc == NULL)
>> +panic("unable to find xenpci devclass");
>> +
>> +xenpci = devclass_get_device(dc, 0);
>> +if (xenpci == NULL)
>> +panic("unable to find xenpci device");
>> +
>> +if (!device_is_attached(xenpci))
>> +panic("trying to attach xenpv before xenpci");
>> +}
> 
> Can you use the identify method to add the xenpci device?

I don't think so, xenpci is a pci device, it is detected and plugged by
the pci bus code.

> As I said earlier, I will reuse this code for ARM guest and this device
> is not used on this architecture.

You could move this chunk of code (the check for xenpci) to a static
inline function and make it a noop for ARM.

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"


Re: [PATCH v10 14/20] xen: introduce xenpv bus and a dummy pvcpu device

2014-01-14 Thread Julien Grall
On 01/14/2014 02:59 PM, Roger Pau Monne wrote:
> +static int
> +xenpv_attach(device_t dev)
> +{
> + device_t child;
> +
> + if (xen_hvm_domain()) {
> + device_t xenpci;
> + devclass_t dc;
> +
> + /* Make sure xenpci has been attached */
> + dc = devclass_find("xenpci");
> + if (dc == NULL)
> + panic("unable to find xenpci devclass");
> +
> + xenpci = devclass_get_device(dc, 0);
> + if (xenpci == NULL)
> + panic("unable to find xenpci device");
> +
> + if (!device_is_attached(xenpci))
> + panic("trying to attach xenpv before xenpci");
> + }

Can you use the identify method to add the xenpci device?

As I said earlier, I will reuse this code for ARM guest and this device
is not used on this architecture.

-- 
Julien Grall
___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"


[PATCH v10 14/20] xen: introduce xenpv bus and a dummy pvcpu device

2014-01-14 Thread Roger Pau Monne
Since Xen PVH guests doesn't have ACPI, we need to create a dummy
bus so top level Xen devices can attach to it (instead of
attaching directly to the nexus) and a pvcpu device that will be used
to fill the pcpu->pc_device field.
---
 sys/conf/files.amd64 |1 +
 sys/conf/files.i386  |1 +
 sys/x86/xen/xenpv.c  |  128 ++
 3 files changed, 130 insertions(+), 0 deletions(-)
 create mode 100644 sys/x86/xen/xenpv.c

diff --git a/sys/conf/files.amd64 b/sys/conf/files.amd64
index a3491da..d7c98cc 100644
--- a/sys/conf/files.amd64
+++ b/sys/conf/files.amd64
@@ -570,3 +570,4 @@ x86/xen/hvm.c   optionalxenhvm
 x86/xen/xen_intr.c optionalxen | xenhvm
 x86/xen/pv.c   optionalxenhvm
 x86/xen/pvcpu_enum.c   optionalxenhvm
+x86/xen/xenpv.coptionalxenhvm
diff --git a/sys/conf/files.i386 b/sys/conf/files.i386
index 790296d..81142e3 100644
--- a/sys/conf/files.i386
+++ b/sys/conf/files.i386
@@ -603,3 +603,4 @@ x86/x86/tsc.c   standard
 x86/x86/delay.cstandard
 x86/xen/hvm.c  optional xenhvm
 x86/xen/xen_intr.c optional xen | xenhvm
+x86/xen/xenpv.coptional xen | xenhvm
diff --git a/sys/x86/xen/xenpv.c b/sys/x86/xen/xenpv.c
new file mode 100644
index 000..e1282cf
--- /dev/null
+++ b/sys/x86/xen/xenpv.c
@@ -0,0 +1,128 @@
+/*
+ * Copyright (c) 2013 Roger Pau Monné 
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *notice, this list of conditions and the following disclaimer in the
+ *documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include 
+__FBSDID("$FreeBSD$");
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include 
+
+static devclass_t xenpv_devclass;
+
+static void
+xenpv_identify(driver_t *driver, device_t parent)
+{
+   if (!xen_domain())
+   return;
+
+   /* Make sure there's only one xenpv device. */
+   if (devclass_get_device(xenpv_devclass, 0))
+   return;
+
+   /*
+* Use a high order number so xenpv is attached after
+* xenpci on HVM guests.
+*/
+   BUS_ADD_CHILD(parent, 200, "xenpv", 0);
+}
+
+static int
+xenpv_probe(device_t dev)
+{
+
+   device_set_desc(dev, "Xen PV bus");
+   device_quiet(dev);
+   return (BUS_PROBE_NOWILDCARD);
+}
+
+static int
+xenpv_attach(device_t dev)
+{
+   device_t child;
+
+   if (xen_hvm_domain()) {
+   device_t xenpci;
+   devclass_t dc;
+
+   /* Make sure xenpci has been attached */
+   dc = devclass_find("xenpci");
+   if (dc == NULL)
+   panic("unable to find xenpci devclass");
+
+   xenpci = devclass_get_device(dc, 0);
+   if (xenpci == NULL)
+   panic("unable to find xenpci device");
+
+   if (!device_is_attached(xenpci))
+   panic("trying to attach xenpv before xenpci");
+   }
+
+   /*
+* Let our child drivers identify any child devices that they
+* can find.  Once that is done attach any devices that we
+* found.
+*/
+   bus_generic_probe(dev);
+   bus_generic_attach(dev);
+
+   if (!devclass_get_device(devclass_find("isa"), 0)) {
+   child = BUS_ADD_CHILD(dev, 0, "isa", 0);
+   if (child == NULL)
+   panic("xenpv_attach isa");
+   device_probe_and_attach(child);
+   }
+
+   return 0;
+}
+
+static device_method_t xenpv_methods[] = {
+   /* Device interface */
+   DEVMETHOD(device_identify,  xenpv_identify),
+   DEVMETHOD(device_probe, xenpv_probe),
+