Yosuke Iwamatsu
2009-Mar-13 12:06 UTC
[Xen-devel] [PATCH 3/5] Add lock for lspci_info in pci.py
Add lspci_info_lock to protect lspci_info. Signed-off-by: Yosuke Iwamatsu <y-iwamatsu@ab.jp.nec.com> ------ diff -r c30742011bb8 tools/python/xen/util/pci.py --- a/tools/python/xen/util/pci.py Thu Mar 12 18:48:09 2009 +0000 +++ b/tools/python/xen/util/pci.py Fri Mar 13 16:37:17 2009 +0900 @@ -12,6 +12,7 @@ import types import struct import time +import threading from xen.util import utils PROC_PCI_PATH = ''/proc/bus/pci/devices'' @@ -97,6 +98,7 @@ # Global variable to store information from lspci lspci_info = None +lspci_info_lock = threading.RLock() #Calculate PAGE_SHIFT: number of bits to shift an address to get the page number PAGE_SIZE = resource.getpagesize() @@ -174,12 +176,16 @@ return pci_devs -def create_lspci_info(): +def _create_lspci_info(): + """Execute ''lspci'' command and parse the result. + If the command does not exist, lspci_info will be kept blank ({}). + + Expects to be protected by lspci_info_lock. + """ global lspci_info + lspci_info = {} - # Execute ''lspci'' command and parse the result. - # If the command does not exist, lspci_info will be kept blank ({}). for paragraph in os.popen(LSPCI_CMD + '' -vmm'').read().split(''\n\n''): device_name = None device_info = {} @@ -194,6 +200,14 @@ pass if device_name is not None: lspci_info[device_name] = device_info + +def create_lspci_info(): + global lspci_info_lock + lspci_info_lock.acquire() + try: + _create_lspci_info() + finally: + lspci_info_lock.release() def save_pci_conf_space(devs_string): pci_list = [] @@ -911,22 +925,27 @@ Since we cannot obtain these data from sysfs, use ''lspci'' command. """ global lspci_info + global lspci_info_lock - if lspci_info is None: - create_lspci_info() + lspci_info_lock.acquire() + try: + if lspci_info is None: + _create_lspci_info() - try: - device_info = lspci_info[self.name] - self.revision = int(device_info[''Rev''], 16) - self.vendorname = device_info[''Vendor''] - self.devicename = device_info[''Device''] - self.classname = device_info[''Class''] - self.subvendorname = device_info[''SVendor''] - self.subdevicename = device_info[''SDevice''] - except KeyError: - pass + try: + device_info = lspci_info[self.name] + self.revision = int(device_info[''Rev''], 16) + self.vendorname = device_info[''Vendor''] + self.devicename = device_info[''Device''] + self.classname = device_info[''Class''] + self.subvendorname = device_info[''SVendor''] + self.subdevicename = device_info[''SDevice''] + except KeyError: + pass - return True + return True + finally: + lspci_info_lock.release() def __str__(self): str = "PCI Device %s\n" % (self.name) _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel