<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">2013/5/16 Osier Yang <span dir="ltr"><<a href="mailto:jyang@redhat.com" target="_blank">jyang@redhat.com</a>></span><br><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div class=""><div class="h5">On 16/05/13 14:07, Chunyan Liu wrote:<br>
<blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
Write separate module for hostdev passthrough so that it could be used by all<br>
hypervisor drivers and maintain a global hostdev state.<br>
<br>
Signed-off-by: Chunyan Liu<<a href="mailto:cyliu@suse.com" target="_blank">cyliu@suse.com</a>><br>
---<br>
  po/POTFILES.in               |    1 +<br>
  src/Makefile.am              |    1 +<br>
  src/libvirt.c                |    5 +<br>
  src/libvirt_private.syms     |   15 +<br>
  src/util/virhostdevmanager.c | 1218 ++++++++++++++++++++++++++++++<u></u>++++++++++++<br>
  src/util/virhostdevmanager.h |   91 ++++<br>
  src/util/virpci.c            |   17 +-<br>
  src/util/virpci.h            |    7 +-<br>
  src/util/virusb.c            |   19 +-<br>
  src/util/virusb.h            |    4 +-<br>
  10 files changed, 1362 insertions(+), 16 deletions(-)<br>
  create mode 100644 src/util/virhostdevmanager.c<br>
  create mode 100644 src/util/virhostdevmanager.h<br>
<br>
diff --git a/po/POTFILES.in b/po/POTFILES.in<br>
index f3ea4da..a7c21bf 100644<br>
--- a/po/POTFILES.in<br>
+++ b/po/POTFILES.in<br>
@@ -188,6 +188,7 @@ src/util/viruri.c<br>
  src/util/virusb.c<br>
  src/util/virutil.c<br>
  src/util/virxml.c<br>
+src/util/virhostdevmanager.c<br>
  src/vbox/vbox_MSCOMGlue.c<br>
  src/vbox/vbox_XPCOMCGlue.c<br>
  src/vbox/vbox_driver.c<br>
diff --git a/src/Makefile.am b/src/Makefile.am<br>
index 4312c3c..a197c2b 100644<br>
--- a/src/Makefile.am<br>
+++ b/src/Makefile.am<br>
@@ -130,6 +130,7 @@ UTIL_SOURCES =                                                      \<br>
                util/virutil.c util/virutil.h                   \<br>
                util/viruuid.c util/viruuid.h                   \<br>
                util/virxml.c util/virxml.h                     \<br>
+                util/virhostdevmanager.c util/virhostdevmanager.h \<br>
                $(NULL)<br>
    diff --git a/src/libvirt.c b/src/libvirt.c<br>
index 2b3515e..d9af5a6 100644<br>
--- a/src/libvirt.c<br>
+++ b/src/libvirt.c<br>
@@ -65,6 +65,7 @@<br>
  #include "virthread.h"<br>
  #include "virstring.h"<br>
  #include "virutil.h"<br>
+#include "virhostdevmanager.h"<br>
    #ifdef WITH_TEST<br>
  # include "test/test_driver.h"<br>
@@ -827,6 +828,7 @@ int virStateInitialize(bool privileged,<br>
      if (virInitialize() < 0)<br>
          return -1;<br>
  +    virHostdevManagerInit();<br>
      for (i = 0 ; i < virStateDriverTabCount ; i++) {<br>
          if (virStateDriverTab[i]-><u></u>stateInitialize) {<br>
              VIR_DEBUG("Running global init for %s state driver",<br>
@@ -858,6 +860,9 @@ int virStateCleanup(void) {<br>
              virStateDriverTab[i]-><u></u>stateCleanup() < 0)<br>
              ret = -1;<br>
      }<br>
+<br>
+    virHostdevManagerCleanup();<br>
+<br>
      return ret;<br>
  }<br>
  diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms<br>
index cdd0b41..824de4e 100644<br>
--- a/src/libvirt_private.syms<br>
+++ b/src/libvirt_private.syms<br>
@@ -1991,6 +1991,21 @@ virXPathULong;<br>
  virXPathULongHex;<br>
  virXPathULongLong;<br>
  +#util/virhostdevmanager.h<br>
+virHostdevManagerGetDefault;<br>
+virHostdevManagerInit;<br>
+virHostdevManagerCleanup;<br>
+<u></u>virHostdevManagerPrepareHostde<u></u>vs;<br>
+<u></u>virHostdevManagerReAttachHostd<u></u>evs;<br>
+<u></u>virHostdevManagerPreparePciHos<u></u>tdevs;<br>
+<u></u>virHostdevManagerPrepareUsbHos<u></u>tdevs;<br>
+<u></u>virHostdevManagerReAttachPciHo<u></u>stdevs;<br>
+<u></u>virHostdevManagerReAttachUsbHo<u></u>stdevs;<br>
+virGetActivePciHostdevs;<br>
+virGetActiveUsbHostdevs;<br>
+<u></u>virGetDomainActivePciHostdevs;<br>
+<u></u>virGetDomainActiveUsbHostdevs;<br>
+virFreeHostdevNameList;<br>
    # Let emacs know we want case-insensitive sorting<br>
  # Local Variables:<br>
diff --git a/src/util/virhostdevmanager.c b/src/util/virhostdevmanager.c<br>
new file mode 100644<br>
index 0000000..9034212<br>
--- /dev/null<br>
+++ b/src/util/virhostdevmanager.c<br>
@@ -0,0 +1,1218 @@<br>
+/*<br>
+ * Copyright (C) 2013 SUSE LINUX Products GmbH, Nuernberg, Germany.<br>
+ *<br>
+ * This library is free software; you can redistribute it and/or<br>
+ * modify it under the terms of the GNU Lesser General Public<br>
+ * License as published by the Free Software Foundation; either<br>
+ * version 2.1 of the License, or (at your option) any later version.<br>
+ *<br>
+ * This library is distributed in the hope that it will be useful,<br>
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of<br>
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU<br>
+ * Lesser General Public License for more details.<br>
+ *<br>
+ * You should have received a copy of the GNU Lesser General Public<br>
+ * License along with this library.  If not, see<br>
+ *<<a href="http://www.gnu.org/licenses/" target="_blank">http://www.gnu.org/licenses/</a><u></u>>.<br>
+ *<br>
+ * Author: Chunyan Liu<<a href="mailto:cyliu@suse.com" target="_blank">cyliu@suse.com</a>><br>
+ */<br>
+#include <config.h><br>
+<br>
+#include "virhostdevmanager.h"<br>
+<br>
+#include <sys/types.h><br>
+#include <sys/stat.h><br>
+#include <unistd.h><br>
+#include <stdlib.h><br>
+#include <stdio.h><br>
+<br>
+#include "viralloc.h"<br>
+#include "virstring.h"<br>
+#include "virfile.h"<br>
+#include "virerror.h"<br>
+#include "virlog.h"<br>
+#include "virpci.h"<br>
+#include "virusb.h"<br>
+#include "virnetdev.h"<br>
+<br>
+/* For virReportOOMError()  and virReportSystemError() */<br>
+#define VIR_FROM_THIS VIR_FROM_NONE<br>
+<br>
+struct _virHostdevManager{<br>
+    char *stateDir;<br>
+<br>
+    virPCIDeviceListPtr activePciHostdevs;<br>
+    virPCIDeviceListPtr inactivePciHostdevs;<br>
+    virUSBDeviceListPtr activeUsbHostdevs;<br>
</blockquote></div></div>
You will need locks...<br>
<br>
</blockquote></div>[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. ]<br><br></div><div class="gmail_extra">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:<br>
virObjectLock(mgr->activePciHostdevs);<br><div class="gmail_extra">virObjectUnlock(mgr->activePciHostdevs);<br><br></div><div class="gmail_extra">So I think virObjectLock/Unlock can achieve, extra lock is not needed. </div>
</div></div>