%PDF- %PDF-
| Direktori : /lib/python3.6/site-packages/sos/report/plugins/ |
| Current File : //lib/python3.6/site-packages/sos/report/plugins/spyre.py |
# This file is part of the sos project: https://github.com/sosreport/sos
#
# This copyrighted material is made available to anyone wishing to use,
# modify, copy, or redistribute it subject to the terms and conditions of
# version 2 of the GNU General Public License.
#
# See the LICENSE file in the source distribution for further information.
#
# This plugin enables collection of logs for system with IBM Spyre card
from sos.report.plugins import Plugin, IndependentPlugin
class Spyre(Plugin, IndependentPlugin):
"""Spyre chip is IBM’s AI accelerator, designed to handle AI inferencing
and workloads.
The Spyre plugin collects data about the Spyre card’s VFIO device node
tree, configuration files, and more.
"""
short_desc = 'IBM Spyre Accelerator Information'
plugin_name = 'spyre'
architectures = ('ppc.*',)
@staticmethod
def get_ibm_spyre_devices(lspci_output):
"""Extract PCI domain, bus, device, function for devices that match:
- Vendor ID = 0x1014 (IBM)
- Device ID = 0x06a7 or 0x06a8
Parameters
----------
lspci_out : str
The output string from `lspci -n`.
Returns
-------
list of tuples
A list of (domain, bus, device, function) tuples for each matching
card.
"""
spyre_cards = []
if not lspci_output:
return None
for line in lspci_output.splitlines():
if not line.strip():
continue
try:
pci_addr, _class, ids, _rest = line.split(maxsplit=3)
vendor, device = ids.lower().split(":")
except ValueError:
continue
if vendor == "1014" and device in ("06a7", "06a8"):
if pci_addr.count(":") == 1:
pci_addr = "0000:" + pci_addr
try:
domain, bus, dev_func = pci_addr.split(":")
pci_device, function = dev_func.split(".")
except ValueError:
continue
spyre_cards.append((domain, bus, pci_device, function))
return spyre_cards
def setup(self):
lspci = self.exec_cmd("lspci -n")
if lspci['status'] != 0:
return
spyre_cards = self.get_ibm_spyre_devices(lspci['output'])
# Nothing to collect if spyre card is not found
if not spyre_cards:
return
# Collects the VFIO device's sysfs directory structure
for domain, bus, device, function in spyre_cards:
pci_addr = f"{domain}:{bus}:{device}.{function}"
pci_vfio = f"/sys/devices/pci{domain}:{bus}/{pci_addr}/vfio-dev"
self.add_dir_listing(pci_vfio, tree=True)
# Spyre card configuration files
self.add_copy_spec([
"/etc/modprobe.d/vfio-pci.conf",
"/etc/udev/rules.d/95-vfio-3.rules",
"/etc/security/limits.d/memlock.conf",
])
# vim: set et ts=4 sw=4 :