[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 3/5] libxc: Split off xc_netbsd_user.c
On Thu, 2015-02-26 at 11:56 +0000, Wei Liu wrote: > From: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> > > We are going to want to use some but not all of the machinery > previously in xc_netbsd.c Split the evtchn and ancillary code into its > own file. This part is pure code motion. Why not xc_netbsd_evtchn? > But we also have to alter the Makefile, and rename some symbols, as > with xc_minios*.c. > > Signed-off-by: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx> > --- > tools/libxc/Makefile | 2 +- > tools/libxc/xc_netbsd.c | 168 +------------------------------------ > tools/libxc/xc_netbsd_user.c | 196 > +++++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 198 insertions(+), 168 deletions(-) > create mode 100644 tools/libxc/xc_netbsd_user.c > > diff --git a/tools/libxc/Makefile b/tools/libxc/Makefile > index 4ace2b6..0f3396c 100644 > --- a/tools/libxc/Makefile > +++ b/tools/libxc/Makefile > @@ -46,7 +46,7 @@ CTRL_SRCS-$(CONFIG_X86) += xc_pagetab.c > CTRL_SRCS-$(CONFIG_Linux) += xc_linux.c xc_linux_osdep.c > CTRL_SRCS-$(CONFIG_FreeBSD) += xc_freebsd.c xc_freebsd_osdep.c > CTRL_SRCS-$(CONFIG_SunOS) += xc_solaris.c > -CTRL_SRCS-$(CONFIG_NetBSD) += xc_netbsd.c > +CTRL_SRCS-$(CONFIG_NetBSD) += xc_netbsd.c xc_netbsd_user.c > CTRL_SRCS-$(CONFIG_MiniOS) += xc_minios.c xc_minios_privcmd.c > > GUEST_SRCS-y := > diff --git a/tools/libxc/xc_netbsd.c b/tools/libxc/xc_netbsd.c > index 8a90ef3..f940607 100644 > --- a/tools/libxc/xc_netbsd.c > +++ b/tools/libxc/xc_netbsd.c > @@ -224,172 +224,6 @@ static struct xc_osdep_ops netbsd_privcmd_ops = { > }, > }; > > -#define EVTCHN_DEV_NAME "/dev/xenevt" > - > -static xc_osdep_handle netbsd_evtchn_open(xc_evtchn *xce) > -{ > - int fd = open(EVTCHN_DEV_NAME, O_NONBLOCK|O_RDWR); > - if ( fd == -1 ) > - return XC_OSDEP_OPEN_ERROR; > - > - return (xc_osdep_handle)fd; > -} > - > -static int netbsd_evtchn_close(xc_evtchn *xce, xc_osdep_handle h) > -{ > - int fd = (int)h; > - return close(fd); > -} > - > -static int netbsd_evtchn_fd(xc_evtchn *xce, xc_osdep_handle h) > -{ > - return (int)h; > -} > - > -static int netbsd_evtchn_notify(xc_evtchn *xce, xc_osdep_handle h, > evtchn_port_t port) > -{ > - int fd = (int)h; > - struct ioctl_evtchn_notify notify; > - > - notify.port = port; > - > - return ioctl(fd, IOCTL_EVTCHN_NOTIFY, ¬ify); > -} > - > -static evtchn_port_or_error_t > -netbsd_evtchn_bind_unbound_port(xc_evtchn * xce, xc_osdep_handle h, int > domid) > -{ > - int fd = (int)h; > - struct ioctl_evtchn_bind_unbound_port bind; > - int ret; > - > - bind.remote_domain = domid; > - > - ret = ioctl(fd, IOCTL_EVTCHN_BIND_UNBOUND_PORT, &bind); > - if (ret == 0) > - return bind.port; > - else > - return -1; > -} > - > -static evtchn_port_or_error_t > -netbsd_evtchn_bind_interdomain(xc_evtchn *xce, xc_osdep_handle h, int domid, > - evtchn_port_t remote_port) > -{ > - int fd = (int)h; > - struct ioctl_evtchn_bind_interdomain bind; > - int ret; > - > - bind.remote_domain = domid; > - bind.remote_port = remote_port; > - > - ret = ioctl(fd, IOCTL_EVTCHN_BIND_INTERDOMAIN, &bind); > - if (ret == 0) > - return bind.port; > - else > - return -1; > -} > - > -static int netbsd_evtchn_unbind(xc_evtchn *xce, xc_osdep_handle h, > evtchn_port_t port) > -{ > - int fd = (int)h; > - struct ioctl_evtchn_unbind unbind; > - > - unbind.port = port; > - > - return ioctl(fd, IOCTL_EVTCHN_UNBIND, &unbind); > -} > - > -static evtchn_port_or_error_t > -netbsd_evtchn_bind_virq(xc_evtchn *xce, xc_osdep_handle h, unsigned int virq) > -{ > - int fd = (int)h; > - struct ioctl_evtchn_bind_virq bind; > - int err; > - > - bind.virq = virq; > - > - err = ioctl(fd, IOCTL_EVTCHN_BIND_VIRQ, &bind); > - if (err) > - return -1; > - else > - return bind.port; > -} > - > -static evtchn_port_or_error_t > -netbsd_evtchn_pending(xc_evtchn *xce, xc_osdep_handle h) > -{ > - int fd = (int)h; > - evtchn_port_t port; > - > - if ( read_exact(fd, (char *)&port, sizeof(port)) == -1 ) > - return -1; > - > - return port; > -} > - > -static int netbsd_evtchn_unmask(xc_evtchn *xce, xc_osdep_handle h, > evtchn_port_t port) > -{ > - int fd = (int)h; > - return write_exact(fd, (char *)&port, sizeof(port)); > -} > - > -static struct xc_osdep_ops netbsd_evtchn_ops = { > - .open = &netbsd_evtchn_open, > - .close = &netbsd_evtchn_close, > - > - .u.evtchn = { > - .fd = &netbsd_evtchn_fd, > - .notify = &netbsd_evtchn_notify, > - .bind_unbound_port = &netbsd_evtchn_bind_unbound_port, > - .bind_interdomain = &netbsd_evtchn_bind_interdomain, > - .bind_virq = &netbsd_evtchn_bind_virq, > - .unbind = &netbsd_evtchn_unbind, > - .pending = &netbsd_evtchn_pending, > - .unmask = &netbsd_evtchn_unmask, > - }, > -}; > - > -/* Optionally flush file to disk and discard page cache */ > -void discard_file_cache(xc_interface *xch, int fd, int flush) > -{ > - off_t cur = 0; > - int saved_errno = errno; > - > - if ( flush && (fsync(fd) < 0) ) > - { > - /*PERROR("Failed to flush file: %s", strerror(errno));*/ > - goto out; > - } > - > - /* > - * Calculate last page boundry of amount written so far > - * unless we are flushing in which case entire cache > - * is discarded. > - */ > - if ( !flush ) > - { > - if ( ( cur = lseek(fd, 0, SEEK_CUR)) == (off_t)-1 ) > - cur = 0; > - cur &= ~(PAGE_SIZE - 1); > - } > - > - /* Discard from the buffer cache. */ > - if ( posix_fadvise(fd, 0, cur, POSIX_FADV_DONTNEED) < 0 ) > - { > - /*PERROR("Failed to discard cache: %s", strerror(errno));*/ > - goto out; > - } > - > - out: > - errno = saved_errno; > -} > - > -void *xc_memalign(xc_interface *xch, size_t alignment, size_t size) > -{ > - return valloc(size); > -} > - > static struct xc_osdep_ops *netbsd_osdep_init(xc_interface *xch, enum > xc_osdep_type type) > { > switch ( type ) > @@ -397,7 +231,7 @@ static struct xc_osdep_ops > *netbsd_osdep_init(xc_interface *xch, enum xc_osdep_t > case XC_OSDEP_PRIVCMD: > return &netbsd_privcmd_ops; > case XC_OSDEP_EVTCHN: > - return &netbsd_evtchn_ops; > + return &xc_evtchn_ops; > default: > return NULL; > } > diff --git a/tools/libxc/xc_netbsd_user.c b/tools/libxc/xc_netbsd_user.c > new file mode 100644 > index 0000000..b5c2491 > --- /dev/null > +++ b/tools/libxc/xc_netbsd_user.c > @@ -0,0 +1,196 @@ > +/****************************************************************************** > + * > + * Copyright 2006 Sun Microsystems, Inc. All rights reserved. > + * Use is subject to license terms. > + * > + * xc_gnttab functions: > + * Copyright (c) 2007-2008, D G Murray <Derek.Murray@xxxxxxxxxxxx> > + * > + * This library is free software; you can redistribute it and/or > + * modify it under the terms of the GNU Lesser General Public > + * License as published by the Free Software Foundation; > + * version 2.1 of the License. > + * > + * This library is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * Lesser General Public License for more details. > + * > + * You should have received a copy of the GNU Lesser General Public > + * License along with this library; if not, write to the Free Software > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 > USA > + */ > + > +#include "xc_private.h" > + > +#include <xen/sys/evtchn.h> > +#include <unistd.h> > +#include <fcntl.h> > +#include <malloc.h> > +#include <sys/mman.h> > + > +#define EVTCHN_DEV_NAME "/dev/xenevt" > + > +static xc_osdep_handle netbsd_evtchn_open(xc_evtchn *xce) > +{ > + int fd = open(EVTCHN_DEV_NAME, O_NONBLOCK|O_RDWR); > + if ( fd == -1 ) > + return XC_OSDEP_OPEN_ERROR; > + > + return (xc_osdep_handle)fd; > +} > + > +static int netbsd_evtchn_close(xc_evtchn *xce, xc_osdep_handle h) > +{ > + int fd = (int)h; > + return close(fd); > +} > + > +static int netbsd_evtchn_fd(xc_evtchn *xce, xc_osdep_handle h) > +{ > + return (int)h; > +} > + > +static int netbsd_evtchn_notify(xc_evtchn *xce, xc_osdep_handle h, > evtchn_port_t port) > +{ > + int fd = (int)h; > + struct ioctl_evtchn_notify notify; > + > + notify.port = port; > + > + return ioctl(fd, IOCTL_EVTCHN_NOTIFY, ¬ify); > +} > + > +static evtchn_port_or_error_t > +netbsd_evtchn_bind_unbound_port(xc_evtchn * xce, xc_osdep_handle h, int > domid) > +{ > + int fd = (int)h; > + struct ioctl_evtchn_bind_unbound_port bind; > + int ret; > + > + bind.remote_domain = domid; > + > + ret = ioctl(fd, IOCTL_EVTCHN_BIND_UNBOUND_PORT, &bind); > + if (ret == 0) > + return bind.port; > + else > + return -1; > +} > + > +static evtchn_port_or_error_t > +netbsd_evtchn_bind_interdomain(xc_evtchn *xce, xc_osdep_handle h, int domid, > + evtchn_port_t remote_port) > +{ > + int fd = (int)h; > + struct ioctl_evtchn_bind_interdomain bind; > + int ret; > + > + bind.remote_domain = domid; > + bind.remote_port = remote_port; > + > + ret = ioctl(fd, IOCTL_EVTCHN_BIND_INTERDOMAIN, &bind); > + if (ret == 0) > + return bind.port; > + else > + return -1; > +} > + > +static int netbsd_evtchn_unbind(xc_evtchn *xce, xc_osdep_handle h, > evtchn_port_t port) > +{ > + int fd = (int)h; > + struct ioctl_evtchn_unbind unbind; > + > + unbind.port = port; > + > + return ioctl(fd, IOCTL_EVTCHN_UNBIND, &unbind); > +} > + > +static evtchn_port_or_error_t > +netbsd_evtchn_bind_virq(xc_evtchn *xce, xc_osdep_handle h, unsigned int virq) > +{ > + int fd = (int)h; > + struct ioctl_evtchn_bind_virq bind; > + int err; > + > + bind.virq = virq; > + > + err = ioctl(fd, IOCTL_EVTCHN_BIND_VIRQ, &bind); > + if (err) > + return -1; > + else > + return bind.port; > +} > + > +static evtchn_port_or_error_t > +netbsd_evtchn_pending(xc_evtchn *xce, xc_osdep_handle h) > +{ > + int fd = (int)h; > + evtchn_port_t port; > + > + if ( read_exact(fd, (char *)&port, sizeof(port)) == -1 ) > + return -1; > + > + return port; > +} > + > +static int netbsd_evtchn_unmask(xc_evtchn *xce, xc_osdep_handle h, > evtchn_port_t port) > +{ > + int fd = (int)h; > + return write_exact(fd, (char *)&port, sizeof(port)); > +} > + > +struct xc_osdep_ops xc_evtchn_ops = { > + .open = &netbsd_evtchn_open, > + .close = &netbsd_evtchn_close, > + > + .u.evtchn = { > + .fd = &netbsd_evtchn_fd, > + .notify = &netbsd_evtchn_notify, > + .bind_unbound_port = &netbsd_evtchn_bind_unbound_port, > + .bind_interdomain = &netbsd_evtchn_bind_interdomain, > + .bind_virq = &netbsd_evtchn_bind_virq, > + .unbind = &netbsd_evtchn_unbind, > + .pending = &netbsd_evtchn_pending, > + .unmask = &netbsd_evtchn_unmask, > + }, > +}; > + > +/* Optionally flush file to disk and discard page cache */ > +void discard_file_cache(xc_interface *xch, int fd, int flush) > +{ > + off_t cur = 0; > + int saved_errno = errno; > + > + if ( flush && (fsync(fd) < 0) ) > + { > + /*PERROR("Failed to flush file: %s", strerror(errno));*/ > + goto out; > + } > + > + /* > + * Calculate last page boundry of amount written so far > + * unless we are flushing in which case entire cache > + * is discarded. > + */ > + if ( !flush ) > + { > + if ( ( cur = lseek(fd, 0, SEEK_CUR)) == (off_t)-1 ) > + cur = 0; > + cur &= ~(PAGE_SIZE - 1); > + } > + > + /* Discard from the buffer cache. */ > + if ( posix_fadvise(fd, 0, cur, POSIX_FADV_DONTNEED) < 0 ) > + { > + /*PERROR("Failed to discard cache: %s", strerror(errno));*/ > + goto out; > + } > + > + out: > + errno = saved_errno; > +} > + > +void *xc_memalign(xc_interface *xch, size_t alignment, size_t size) > +{ > + return valloc(size); > +} _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |