diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2009-03-17 10:37:12 +0000 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2009-03-17 10:37:12 +0000 |
commit | c48d2caaddd1337384ec7945846d88ffe5c6242f (patch) | |
tree | 4c115c043f9be105924fce7ebd0122e015fd6aa6 | |
parent | 90797ec872bb00dacc4f177927a2516fc374b793 (diff) | |
download | xen-c48d2caaddd1337384ec7945846d88ffe5c6242f.tar.gz xen-c48d2caaddd1337384ec7945846d88ffe5c6242f.tar.bz2 xen-c48d2caaddd1337384ec7945846d88ffe5c6242f.zip |
xend: 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>
-rw-r--r-- | tools/python/xen/util/pci.py | 51 |
1 files changed, 35 insertions, 16 deletions
diff --git a/tools/python/xen/util/pci.py b/tools/python/xen/util/pci.py index 913fe080c7..bb7720bb4e 100644 --- a/tools/python/xen/util/pci.py +++ b/tools/python/xen/util/pci.py @@ -12,6 +12,7 @@ import re import types import struct import time +import threading from xen.util import utils PROC_PCI_PATH = '/proc/bus/pci/devices' @@ -97,6 +98,7 @@ MSIX_SIZE_MASK = 0x7ff # 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 @@ def get_all_pci_devices(): 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 = {} @@ -195,6 +201,14 @@ def create_lspci_info(): 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 = [] cfg_list = [] @@ -911,22 +925,27 @@ class PciDevice: 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: - 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 + if lspci_info is None: + _create_lspci_info() - return True + 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 + finally: + lspci_info_lock.release() def __str__(self): str = "PCI Device %s\n" % (self.name) |