[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] PATCH [base vtpm and libxl patches 3/6] Fix bugs in vtpm hotplug scripts



This patch fixes IO deadlocks in the vtpm hotplug scripts.

Signed off by: Matthew Fioravante matthew.fioravante@xxxxxxxxxx

---
Changed since previous:
* rebased off of latest xen stable
* replaced instances of gawk with awk

diff --git a/tools/hotplug/Linux/vtpm b/tools/hotplug/Linux/vtpm
--- a/tools/hotplug/Linux/vtpm
+++ b/tools/hotplug/Linux/vtpm
@@ -1,22 +1,18 @@
 #!/bin/bash
 
+export PATH=$PATH:/usr/sbin:/sbin
+
 dir=$(dirname "$0")
 . "$dir/vtpm-hotplug-common.sh"
 
-vtpm_fatal_error=0
-
 case "$command" in
   add)
     vtpm_create_instance
+    success
   ;;
   remove)
     vtpm_remove_instance
+    success
   ;;
 esac
 
-if [ $vtpm_fatal_error -eq 0 ]; then
-    log debug "Successful vTPM operation '$command'."
-    success
-else
-    fatal "Error while executing vTPM operation '$command'."
-fi
diff --git a/tools/hotplug/Linux/vtpm-common.sh
b/tools/hotplug/Linux/vtpm-common.sh
--- a/tools/hotplug/Linux/vtpm-common.sh
+++ b/tools/hotplug/Linux/vtpm-common.sh
@@ -276,12 +276,10 @@ function vtpm_create_instance () {
 
         vtpm_create $instance
 
-        if [ $vtpm_fatal_error -eq 0 ]; then
-            if [ "$uuid" != "" ]; then
-                vtpmdb_add_instance $uuid $instance
-            else
-                vtpmdb_add_instance $domname $instance
-            fi
+        if [ "$uuid" != "" ]; then
+            vtpmdb_add_instance $uuid $instance
+        else
+            vtpmdb_add_instance $domname $instance
         fi
     else
         if [ "$reason" == "resume" ]; then
@@ -290,7 +288,6 @@ function vtpm_create_instance () {
             vtpm_start $instance
         fi
     fi
-
     release_lock vtpmdb
 
     xenstore_write $XENBUS_PATH/instance $instance
@@ -322,8 +319,8 @@ function vtpm_remove_instance () {
     if [ "$instance" != "0" ]; then
         vtpm_suspend $instance
     fi
-
     release_lock vtpmdb
+
 }
 
 
diff --git a/tools/hotplug/Linux/vtpm-delete
b/tools/hotplug/Linux/vtpm-delete
--- a/tools/hotplug/Linux/vtpm-delete
+++ b/tools/hotplug/Linux/vtpm-delete
@@ -5,6 +5,8 @@
 # or
 # vtpm-delete --vmname <vm name>
 
+export PATH=$PATH:/usr/sbin:/sbin
+
 dir=$(dirname "$0")
 . "$dir/vtpm-common.sh"
 
diff --git a/tools/hotplug/Linux/vtpm-impl b/tools/hotplug/Linux/vtpm-impl
--- a/tools/hotplug/Linux/vtpm-impl
+++ b/tools/hotplug/Linux/vtpm-impl
@@ -32,14 +32,16 @@
 # OF THE POSSIBILITY OF SUCH DAMAGE.
 # ===================================================================
 
-#            |        SRC        |    TAG  |      CMD SIZE     |       
ORD       |mtype|strt
-TPM_CMD_OPEN=\\x00\\x00\\x00\\x00\\x01\\xc1\\x00\\x00\\x00\\x11\\x01\\x00\\x00\\x01\\x01\\x01
-TPM_CMD_RESM=\\x00\\x00\\x00\\x00\\x01\\xc1\\x00\\x00\\x00\\x11\\x01\\x00\\x00\\x01\\x01\\x02
-TPM_CMD_CLOS=\\x00\\x00\\x00\\x00\\x01\\xc1\\x00\\x00\\x00\\x0e\\x01\\x00\\x00\\x02
-TPM_CMD_DELE=\\x00\\x00\\x00\\x00\\x01\\xc1\\x00\\x00\\x00\\x0e\\x01\\x00\\x00\\x03
+export PATH=$PATH:/usr/sbin:/sbin
 
-TPM_TYPE_PVM=\\x01
-TPM_TYPE_HVM=\\x02
+#             | SRC  |TAG| CMD SZ|| ORD  |mtype|strt
+TPM_CMD_OPEN="0000000001C100000011010000010101"
+TPM_CMD_RESM="0000000001C100000011010000010102"
+TPM_CMD_CLOS="0000000001C10000000E01000002"
+TPM_CMD_DELE="0000000001C10000000E01000003"
+
+TPM_TYPE_PVM=01
+TPM_TYPE_HVM=02
 
 TPM_SUCCESS=00000000
 
@@ -70,24 +72,19 @@ function vtpm_manager_cmd() {
  local inst=$2;
  local inst_bin=$(hex32_to_bin $inst);
 
- claim_lock vtpm_mgr
-
- #send cmd to vtpm_manager
- printf "$cmd$inst_bin" > $TX_VTPM_MANAGER
-
- #recv response
- set +e
- local resp_hex=`dd skip=10 bs=1 count=4 if=$RX_VTPM_MANAGER 2>
/dev/null | xxd -ps`
- set -e
+ local resp_hex
+ #send cmd to vtpm_manager and get response
+ if ! resp_hex=`echo "$cmd$(str_to_hex32 $inst)" | vtpmmgrtalk `; then
+   release_lock vtpmdb
+   fatal "Error communicating with vTPM Manager"
+ fi
 
- release_lock vtpm_mgr
+ resp_hex=`echo $resp_hex | cut -b 21-`
 
  #return whether the command was successful
- if [ $resp_hex -ne $TPM_SUCCESS ]; then
-   vtpm_fatal_error=1
-   false
-  else
-   true
+ if [ "$resp_hex" != "$TPM_SUCCESS" ]; then
+   release_lock vtpmdb
+   fatal "vTPM Manager returned failure code $resp_hex"
  fi
 }
 
@@ -142,13 +139,8 @@ function vtpm_suspend() {
 
 function vtpm_delete() {
  local inst=$1
- if $(vtpm_manager_cmd $TPM_CMD_DELE $inst); then
-   rm -f /var/vtpm/vtpm_dm_$1.data
-   true
- else
-   vtpm_fatal_error=1
-   false
- fi
+ $(vtpm_manager_cmd $TPM_CMD_DELE $inst)
+ rm -f /var/vtpm/vtpm_dm_$1.data
 }
 
 # Perform a migration step. This function differentiates between migration
diff --git a/tools/python/xen/xend/server/tpmif.py
b/tools/python/xen/xend/server/tpmif.py
--- a/tools/python/xen/xend/server/tpmif.py
+++ b/tools/python/xen/xend/server/tpmif.py
@@ -44,6 +44,22 @@ class TPMifController(DevController):
         DevController.__init__(self, vm)
 
 
+    def createDevice(self, config):
+        #Disable hotplug scripts if backend is not dom0
+        import xen.xend.XendDomain
+        xd = xen.xend.XendDomain.instance()
+        backdom_name = config.get('backend')
+        if backdom_name is None:
+            backdom = xen.xend.XendDomain.DOM0_ID
+        else:
+            bd = xd.domain_lookup_nr(backdom_name)
+            backdom = bd.getDomid()
+
+    if backdom != xen.xend.XendDomain.DOM0_ID:
+       self.hotplug = False
+
+        return DevController.createDevice(self, config)
+
     def getDeviceDetails(self, config):
         """@see DevController.getDeviceDetails"""
 


Attachment: smime.p7s
Description: S/MIME Cryptographic Signature

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.