2013/5/16 Osier Yang <jy...@redhat.com> > On 16/05/13 14:07, Chunyan Liu wrote: > >> Write separate module for hostdev passthrough so that it could be used by >> all >> hypervisor drivers and maintain a global hostdev state. >> >> Signed-off-by: Chunyan Liu<cy...@suse.com> >> --- >> po/POTFILES.in | 1 + >> src/Makefile.am | 1 + >> src/libvirt.c | 5 + >> src/libvirt_private.syms | 15 + >> src/util/virhostdevmanager.c | 1218 ++++++++++++++++++++++++++++++** >> ++++++++++++ >> src/util/virhostdevmanager.h | 91 ++++ >> src/util/virpci.c | 17 +- >> src/util/virpci.h | 7 +- >> src/util/virusb.c | 19 +- >> src/util/virusb.h | 4 +- >> 10 files changed, 1362 insertions(+), 16 deletions(-) >> create mode 100644 src/util/virhostdevmanager.c >> create mode 100644 src/util/virhostdevmanager.h >> >> diff --git a/po/POTFILES.in b/po/POTFILES.in >> index f3ea4da..a7c21bf 100644 >> --- a/po/POTFILES.in >> +++ b/po/POTFILES.in >> @@ -188,6 +188,7 @@ src/util/viruri.c >> src/util/virusb.c >> src/util/virutil.c >> src/util/virxml.c >> +src/util/virhostdevmanager.c >> src/vbox/vbox_MSCOMGlue.c >> src/vbox/vbox_XPCOMCGlue.c >> src/vbox/vbox_driver.c >> diff --git a/src/Makefile.am b/src/Makefile.am >> index 4312c3c..a197c2b 100644 >> --- a/src/Makefile.am >> +++ b/src/Makefile.am >> @@ -130,6 +130,7 @@ UTIL_SOURCES = >> \ >> util/virutil.c util/virutil.h \ >> util/viruuid.c util/viruuid.h \ >> util/virxml.c util/virxml.h \ >> + util/virhostdevmanager.c util/virhostdevmanager.h \ >> $(NULL) >> diff --git a/src/libvirt.c b/src/libvirt.c >> index 2b3515e..d9af5a6 100644 >> --- a/src/libvirt.c >> +++ b/src/libvirt.c >> @@ -65,6 +65,7 @@ >> #include "virthread.h" >> #include "virstring.h" >> #include "virutil.h" >> +#include "virhostdevmanager.h" >> #ifdef WITH_TEST >> # include "test/test_driver.h" >> @@ -827,6 +828,7 @@ int virStateInitialize(bool privileged, >> if (virInitialize() < 0) >> return -1; >> + virHostdevManagerInit(); >> for (i = 0 ; i < virStateDriverTabCount ; i++) { >> if (virStateDriverTab[i]->**stateInitialize) { >> VIR_DEBUG("Running global init for %s state driver", >> @@ -858,6 +860,9 @@ int virStateCleanup(void) { >> virStateDriverTab[i]->**stateCleanup() < 0) >> ret = -1; >> } >> + >> + virHostdevManagerCleanup(); >> + >> return ret; >> } >> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms >> index cdd0b41..824de4e 100644 >> --- a/src/libvirt_private.syms >> +++ b/src/libvirt_private.syms >> @@ -1991,6 +1991,21 @@ virXPathULong; >> virXPathULongHex; >> virXPathULongLong; >> +#util/virhostdevmanager.h >> +virHostdevManagerGetDefault; >> +virHostdevManagerInit; >> +virHostdevManagerCleanup; >> +**virHostdevManagerPrepareHostde**vs; >> +**virHostdevManagerReAttachHostd**evs; >> +**virHostdevManagerPreparePciHos**tdevs; >> +**virHostdevManagerPrepareUsbHos**tdevs; >> +**virHostdevManagerReAttachPciHo**stdevs; >> +**virHostdevManagerReAttachUsbHo**stdevs; >> +virGetActivePciHostdevs; >> +virGetActiveUsbHostdevs; >> +**virGetDomainActivePciHostdevs; >> +**virGetDomainActiveUsbHostdevs; >> +virFreeHostdevNameList; >> # Let emacs know we want case-insensitive sorting >> # Local Variables: >> diff --git a/src/util/virhostdevmanager.c b/src/util/virhostdevmanager.c >> new file mode 100644 >> index 0000000..9034212 >> --- /dev/null >> +++ b/src/util/virhostdevmanager.c >> @@ -0,0 +1,1218 @@ >> +/* >> + * Copyright (C) 2013 SUSE LINUX Products GmbH, Nuernberg, Germany. >> + * >> + * 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; either >> + * version 2.1 of the License, or (at your option) any later version. >> + * >> + * 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, see >> + *<http://www.gnu.org/licenses/**>. >> + * >> + * Author: Chunyan Liu<cy...@suse.com> >> + */ >> +#include <config.h> >> + >> +#include "virhostdevmanager.h" >> + >> +#include <sys/types.h> >> +#include <sys/stat.h> >> +#include <unistd.h> >> +#include <stdlib.h> >> +#include <stdio.h> >> + >> +#include "viralloc.h" >> +#include "virstring.h" >> +#include "virfile.h" >> +#include "virerror.h" >> +#include "virlog.h" >> +#include "virpci.h" >> +#include "virusb.h" >> +#include "virnetdev.h" >> + >> +/* For virReportOOMError() and virReportSystemError() */ >> +#define VIR_FROM_THIS VIR_FROM_NONE >> + >> +struct _virHostdevManager{ >> + char *stateDir; >> + >> + virPCIDeviceListPtr activePciHostdevs; >> + virPCIDeviceListPtr inactivePciHostdevs; >> + virUSBDeviceListPtr activeUsbHostdevs; >> > You will need locks... > > [RESEND since I'm not clear if my reply is sent out or not, I didn't see it in list yet after several hours. ]
Things that need to protect are: activePciHostdevs, inactivePciHostdevs and activeUsbHostdevs, these lists are inherited from virObjectLockable, could be locked explicitly with virObjectLock(). Like in the code: virObjectLock(mgr->activePciHostdevs); virObjectUnlock(mgr->activePciHostdevs); So I think virObjectLock/Unlock can achieve, extra lock is not needed.
-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list