- rename init_events() to events_init(), to better reflect netbsd semantics

- change unbind_[pv]irq_from_evtch() so that they now return the event
channel the [PV]IRQ was bound to. It reflects the opposite behaviour of the
bind_[pv]irq_to_evtch() functions.

- remove xenbus_suspend() and xenbus_resume() prototypes, as they are not
used anywhere else, and will conflict with the xenbus pmf(9) handlers.

- make start_info aligned on a page boundary, as Xen expects it to be so.

- mask event channel during xbd detach before removing its handler (can
avoid spurious events).

- add the "protocol" entry in xenstore during xbd initialization. Normally
created during domU's boot by xentools, it is under domU's responsibility
in all other cases (save/restore, hot plugging, etc.).

- modifications to xs_init(), so that it can properly return an error.

Reviewed by Christoph (cegger@).
This commit is contained in:
jym 2008-10-24 21:09:24 +00:00
parent 15485d84a5
commit 4f26afe701
9 changed files with 47 additions and 34 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: evtchn.h,v 1.16 2008/07/01 18:49:21 bouyer Exp $ */
/* $NetBSD: evtchn.h,v 1.17 2008/10/24 21:09:24 jym Exp $ */
/*
*
@ -39,7 +39,7 @@
extern struct evtsource *evtsource[];
void events_default_setup(void);
void init_events(void);
void events_init(void);
unsigned int evtchn_do_event(int, struct intrframe *);
void call_evtchn_do_event(int, struct intrframe *);
void call_xenevt_event(int);
@ -54,8 +54,8 @@ extern int xen_debug_handler(void *);
int bind_virq_to_evtch(int);
int bind_pirq_to_evtch(int);
void unbind_pirq_from_evtch(int);
void unbind_virq_from_evtch(int);
int unbind_pirq_from_evtch(int);
int unbind_virq_from_evtch(int);
struct pintrhand {
int pirq;

View File

@ -1,4 +1,4 @@
/* $NetBSD: xenbus.h,v 1.9 2008/04/16 18:41:48 cegger Exp $ */
/* $NetBSD: xenbus.h,v 1.10 2008/10/24 21:09:24 jym Exp $ */
/******************************************************************************
* xenbus.h
*
@ -159,10 +159,6 @@ void xs_resume(void);
/* Used by xenbus_dev to borrow kernel's store connection. */
int xenbus_dev_request_and_reply(struct xsd_sockmsg *msg, void **);
/* Called from xen core code. */
void xenbus_suspend(void);
void xenbus_resume(void);
void xenbus_probe(void *);
int xenbus_free_device(struct xenbus_device *);

View File

@ -1,4 +1,4 @@
/* $NetBSD: x86_xpmap.c,v 1.10 2008/10/21 15:46:32 cegger Exp $ */
/* $NetBSD: x86_xpmap.c,v 1.11 2008/10/24 21:09:24 jym Exp $ */
/*
* Copyright (c) 2006 Mathieu Ropert <mro@adviseo.fr>
@ -79,7 +79,7 @@
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: x86_xpmap.c,v 1.10 2008/10/21 15:46:32 cegger Exp $");
__KERNEL_RCSID(0, "$NetBSD: x86_xpmap.c,v 1.11 2008/10/24 21:09:24 jym Exp $");
#include "opt_xen.h"
#include "opt_ddb.h"
@ -123,7 +123,8 @@ static char XBUF[256];
#endif
volatile shared_info_t *HYPERVISOR_shared_info;
union start_info_union start_info_union;
/* Xen requires the start_info struct to be page aligned */
union start_info_union start_info_union __aligned(PAGE_SIZE);
unsigned long *xpmap_phys_to_machine_mapping;
void xen_failsafe_handler(void);

View File

@ -1,4 +1,4 @@
/* $NetBSD: evtchn.c,v 1.38 2008/05/24 15:09:34 bouyer Exp $ */
/* $NetBSD: evtchn.c,v 1.39 2008/10/24 21:09:24 jym Exp $ */
/*
* Copyright (c) 2006 Manuel Bouyer.
@ -64,7 +64,7 @@
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: evtchn.c,v 1.38 2008/05/24 15:09:34 bouyer Exp $");
__KERNEL_RCSID(0, "$NetBSD: evtchn.c,v 1.39 2008/10/24 21:09:24 jym Exp $");
#include "opt_xen.h"
#include "isa.h"
@ -174,7 +174,7 @@ events_default_setup(void)
}
void
init_events(void)
events_init(void)
{
#ifndef XEN3
int evtch;
@ -346,7 +346,7 @@ bind_virq_to_evtch(int virq)
return evtchn;
}
void
int
unbind_virq_from_evtch(int virq)
{
evtchn_op_t op;
@ -370,6 +370,8 @@ unbind_virq_from_evtch(int virq)
simple_unlock(&irq_mapping_update_lock);
splx(s);
return evtchn;
}
#if NPCI > 0 || NISA > 0
@ -409,7 +411,7 @@ bind_pirq_to_evtch(int pirq)
return evtchn;
}
void
int
unbind_pirq_from_evtch(int pirq)
{
evtchn_op_t op;
@ -433,6 +435,8 @@ unbind_pirq_from_evtch(int pirq)
simple_unlock(&irq_mapping_update_lock);
splx(s);
return evtchn;
}
struct pintrhand *

View File

@ -1,4 +1,4 @@
/* $NetBSD: hypervisor.c,v 1.41 2008/10/24 18:02:58 jym Exp $ */
/* $NetBSD: hypervisor.c,v 1.42 2008/10/24 21:09:24 jym Exp $ */
/*
* Copyright (c) 2005 Manuel Bouyer.
@ -63,7 +63,7 @@
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: hypervisor.c,v 1.41 2008/10/24 18:02:58 jym Exp $");
__KERNEL_RCSID(0, "$NetBSD: hypervisor.c,v 1.42 2008/10/24 21:09:24 jym Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -266,7 +266,7 @@ hypervisor_attach(device_t parent, device_t self, void *aux)
aprint_normal("\n");
#endif
init_events();
events_init();
#if NXENBUS > 0
hac.hac_xenbus.xa_device = "xenbus";

View File

@ -1,4 +1,4 @@
/* $NetBSD: xbd_xenbus.c,v 1.31 2008/10/24 18:02:58 jym Exp $ */
/* $NetBSD: xbd_xenbus.c,v 1.32 2008/10/24 21:09:24 jym Exp $ */
/*
* Copyright (c) 2006 Manuel Bouyer.
@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: xbd_xenbus.c,v 1.31 2008/10/24 18:02:58 jym Exp $");
__KERNEL_RCSID(0, "$NetBSD: xbd_xenbus.c,v 1.32 2008/10/24 21:09:24 jym Exp $");
#include "opt_xen.h"
#include "rnd.h"
@ -57,6 +57,7 @@ __KERNEL_RCSID(0, "$NetBSD: xbd_xenbus.c,v 1.31 2008/10/24 18:02:58 jym Exp $");
#include <xen/xen3-public/io/ring.h>
#include <xen/xen3-public/io/blkif.h>
#include <xen/xen3-public/io/protocols.h>
#include <xen/granttables.h>
#include <xen/xenbus.h>
@ -286,6 +287,7 @@ xbd_xenbus_detach(device_t dev, int flags)
disk_destroy(&sc->sc_dksc.sc_dkdev);
}
hypervisor_mask_event(sc->sc_evtchn);
event_remove_handler(sc->sc_evtchn, &xbd_handler, sc);
while (xengnt_status(sc->sc_ring_gntref)) {
tsleep(xbd_xenbus_detach, PRIBIO, "xbd_ref", hz/2);
@ -346,6 +348,12 @@ again:
errmsg = "writing event channel";
goto abort_transaction;
}
error = xenbus_printf(xbt, sc->sc_xbusd->xbusd_path,
"protocol", "%s", XEN_IO_PROTO_ABI_NATIVE);
if (error) {
errmsg = "writing protocol";
goto abort_transaction;
}
error = xenbus_switch_state(sc->sc_xbusd, xbt, XenbusStateInitialised);
if (error) {
errmsg = "writing frontend XenbusStateInitialised";

View File

@ -1,4 +1,4 @@
/* $NetBSD: xenbus_comms.h,v 1.4 2008/04/16 18:41:48 cegger Exp $ */
/* $NetBSD: xenbus_comms.h,v 1.5 2008/10/24 21:09:24 jym Exp $ */
/*
* Private include for xenbus communications.
*
@ -30,7 +30,7 @@
#define _XENBUS_COMMS_H
void xenbus_kernfs_init(void);
int xs_init(void);
int xs_init(device_t dev);
int xb_init_comms(device_t dev);
/* Low level routines. */

View File

@ -1,4 +1,4 @@
/* $NetBSD: xenbus_probe.c,v 1.24 2008/10/21 21:55:44 cegger Exp $ */
/* $NetBSD: xenbus_probe.c,v 1.25 2008/10/24 21:09:24 jym Exp $ */
/******************************************************************************
* Talks to Xen Store to figure out what devices we have.
*
@ -29,7 +29,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: xenbus_probe.c,v 1.24 2008/10/21 21:55:44 cegger Exp $");
__KERNEL_RCSID(0, "$NetBSD: xenbus_probe.c,v 1.25 2008/10/24 21:09:24 jym Exp $");
#if 0
#define DPRINTK(fmt, args...) \
@ -566,7 +566,7 @@ xenbus_probe_init(void *unused)
xb_init_comms(xenbus_dev);
/* Initialize the interface to xenstore. */
err = xs_init();
err = xs_init(xenbus_dev);
if (err) {
aprint_error_dev(xenbus_dev,
"Error initializing xenstore comms: %i\n", err);

View File

@ -1,4 +1,4 @@
/* $NetBSD: xenbus_xs.c,v 1.15 2008/10/24 18:02:58 jym Exp $ */
/* $NetBSD: xenbus_xs.c,v 1.16 2008/10/24 21:09:24 jym Exp $ */
/******************************************************************************
* xenbus_xs.c
*
@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: xenbus_xs.c,v 1.15 2008/10/24 18:02:58 jym Exp $");
__KERNEL_RCSID(0, "$NetBSD: xenbus_xs.c,v 1.16 2008/10/24 21:09:24 jym Exp $");
#if 0
#define DPRINTK(fmt, args...) \
@ -845,7 +845,7 @@ xenbus_thread(void *unused)
}
int
xs_init(void)
xs_init(device_t dev)
{
int err;
@ -855,13 +855,17 @@ xs_init(void)
err = kthread_create(PRI_NONE, 0, NULL, xenwatch_thread,
NULL, NULL, "xenwatch");
if (err)
printf("kthread_create(xenwatch): %d\n", err);
if (err) {
aprint_error_dev(dev, "kthread_create(xenwatch): %d\n", err);
return err;
}
err = kthread_create(PRI_NONE, 0, NULL, xenbus_thread,
NULL, NULL, "xenbus");
if (err)
printf("kthread_create(xenbus): %d\n", err);
if (err) {
aprint_error_dev(dev, "kthread_create(xenbus): %d\n", err);
return err;
}
return 0;
}