Matthew Fioravante
2012-Sep-21 18:59 UTC
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@jhuapl.edu --- 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""" _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
Ian Campbell
2012-Sep-25 10:27 UTC
Re: PATCH [base vtpm and libxl patches 3/6] Fix bugs in vtpm hotplug scripts
On Fri, 2012-09-21 at 19:59 +0100, Matthew Fioravante wrote:> This patch fixes IO deadlocks in the vtpm hotplug scripts. > > Signed off by: Matthew Fioravante matthew.fioravante@jhuapl.edu > > --- > 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:/sbinI think this script already indirectly sources xen-hotplug-common.sh which sets up the path. Likewise the other place you made this change. Ian,