From: Panu Matilainen <pmatilai@redhat.com>
To: Neil Horman <nhorman@tuxdriver.com>, dev@dpdk.org
Cc: Bruce Richardson <bruce.richardson@intel.com>,
Thomas Monjalon <thomas.monjalon@6wind.com>,
Stephen Hemminger <stephen@networkplumber.org>
Subject: Re: [dpdk-dev] [PATCHv3 5/5] pmdinfo.py: Add tool to query binaries for hw and other support information
Date: Tue, 24 May 2016 10:41:28 +0300 [thread overview]
Message-ID: <fd1632df-fa33-68c1-0370-b725dae0ef5f@redhat.com> (raw)
In-Reply-To: <1463765086-17349-6-git-send-email-nhorman@tuxdriver.com>
On 05/20/2016 08:24 PM, Neil Horman wrote:
> This tool searches for the primer sting PMD_DRIVER_INFO= in any ELF binary,
> and, if found parses the remainder of the string as a json encoded string,
> outputting the results in either a human readable or raw, script parseable
> format
>
> Note that, in the case of dynamically linked applications, pmdinfo.py will scan
> for implicitly linked PMDs by searching the specified binaries .dynamic section
> for DT_NEEDED entries that contain the substring librte_pmd. The DT_RUNPATH,
> LD_LIBRARY_PATH, /usr/lib and /lib are searched for these libraries, in that
> order
>
> If a file is specified with no path, it is assumed to be a PMD DSO, and the
> LD_LIBRARY_PATH, /usr/lib[64]/ and /lib[64] is searched for it
>
> Currently the tool can output data in 3 formats:
>
> a) raw, suitable for scripting, where the raw JSON strings are dumped out
> b) table format (default) where hex pci ids are dumped in a table format
> c) pretty, where a user supplied pci.ids file is used to print out vendor and
> device strings
>
> Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> CC: Bruce Richardson <bruce.richardson@intel.com>
> CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> CC: Stephen Hemminger <stephen@networkplumber.org>
> CC: Panu Matilainen <pmatilai@redhat.com>
> ---
> tools/pmdinfo.py | 545 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 545 insertions(+)
> create mode 100755 tools/pmdinfo.py
>
> diff --git a/tools/pmdinfo.py b/tools/pmdinfo.py
> new file mode 100755
> index 0000000..9b4b4a4
> --- /dev/null
> +++ b/tools/pmdinfo.py
> @@ -0,0 +1,545 @@
> +#!/usr/bin/python
> +#-------------------------------------------------------------------------------
> +# scripts/pmd_hw_support.py
> +#
> +# Utility to dump PMD_INFO_STRING support from an object file
> +#
> +#-------------------------------------------------------------------------------
> +import os, sys
> +from optparse import OptionParser
> +import string
> +import json
> +
> +# For running from development directory. It should take precedence over the
> +# installed pyelftools.
> +sys.path.insert(0, '.')
> +
> +
> +from elftools import __version__
> +from elftools.common.exceptions import ELFError
> +from elftools.common.py3compat import (
> + ifilter, byte2int, bytes2str, itervalues, str2bytes)
> +from elftools.elf.elffile import ELFFile
> +from elftools.elf.dynamic import DynamicSection, DynamicSegment
> +from elftools.elf.enums import ENUM_D_TAG
> +from elftools.elf.segments import InterpSegment
> +from elftools.elf.sections import SymbolTableSection
> +from elftools.elf.gnuversions import (
> + GNUVerSymSection, GNUVerDefSection,
> + GNUVerNeedSection,
> + )
> +from elftools.elf.relocation import RelocationSection
> +from elftools.elf.descriptions import (
> + describe_ei_class, describe_ei_data, describe_ei_version,
> + describe_ei_osabi, describe_e_type, describe_e_machine,
> + describe_e_version_numeric, describe_p_type, describe_p_flags,
> + describe_sh_type, describe_sh_flags,
> + describe_symbol_type, describe_symbol_bind, describe_symbol_visibility,
> + describe_symbol_shndx, describe_reloc_type, describe_dyn_tag,
> + describe_ver_flags,
> + )
> +from elftools.elf.constants import E_FLAGS
> +from elftools.dwarf.dwarfinfo import DWARFInfo
> +from elftools.dwarf.descriptions import (
> + describe_reg_name, describe_attr_value, set_global_machine_arch,
> + describe_CFI_instructions, describe_CFI_register_rule,
> + describe_CFI_CFA_rule,
> + )
> +from elftools.dwarf.constants import (
> + DW_LNS_copy, DW_LNS_set_file, DW_LNE_define_file)
> +from elftools.dwarf.callframe import CIE, FDE
> +
> +raw_output = False
> +pcidb = None
> +
> +#===========================================
> +
> +class Vendor:
> + """
> + Class for vendors. This is the top level class
> + for the devices belong to a specific vendor.
> + self.devices is the device dictionary
> + subdevices are in each device.
> + """
> + def __init__(self, vendorStr):
> + """
> + Class initializes with the raw line from pci.ids
> + Parsing takes place inside __init__
> + """
> + self.ID = vendorStr.split()[0]
> + self.name = vendorStr.replace("%s " % self.ID,"").rstrip()
> + self.devices = {}
> +
> + def addDevice(self, deviceStr):
> + """
> + Adds a device to self.devices
> + takes the raw line from pci.ids
> + """
> + s = deviceStr.strip()
> + devID = s.split()[0]
> + if devID in self.devices:
> + pass
> + else:
> + self.devices[devID] = Device(deviceStr)
> +
> + def report(self):
> + print self.ID, self.name
> + for id, dev in self.devices.items():
> + dev.report()
> +
> + def find_device(self, devid):
> + # convert to a hex string and remove 0x
> + devid = hex(devid)[2:]
> + try:
> + return self.devices[devid]
> + except:
> + return Device("%s Unknown Device" % devid)
> +
> +class Device:
> + def __init__(self, deviceStr):
> + """
> + Class for each device.
> + Each vendor has its own devices dictionary.
> + """
> + s = deviceStr.strip()
> + self.ID = s.split()[0]
> + self.name = s.replace("%s " % self.ID,"")
> + self.subdevices = {}
> +
> + def report(self):
> + print "\t%s\t%s" % (self.ID, self.name)
> + for subID, subdev in self.subdevices.items():
> + subdev.report()
> +
> + def addSubDevice(self, subDeviceStr):
> + """
> + Adds a subvendor, subdevice to device.
> + Uses raw line from pci.ids
> + """
> + s = subDeviceStr.strip()
> + spl = s.split()
> + subVendorID = spl[0]
> + subDeviceID = spl[1]
> + subDeviceName = s.split(" ")[-1]
> + devID = "%s:%s" % (subVendorID,subDeviceID)
> + self.subdevices[devID] = SubDevice(subVendorID,subDeviceID,subDeviceName)
> +
> + def find_subid(self, subven, subdev):
> + subven = hex(subven)[2:]
> + subdev = hex(subdev)[2:]
> + devid ="%s:%s" % (subven, subdev)
> +
> + try:
> + return self.subdevices[devid]
> + except:
> + if (subven == "ffff" and subdev == "ffff"):
> + return SubDevice("ffff", "ffff", "(All Subdevices)");
> + else:
> + return SubDevice(subven, subdev, "(Unknown Subdevice)")
> +
> +
> +class SubDevice:
> + """
> + Class for subdevices.
> + """
> + def __init__(self, vendor, device, name):
> + """
> + Class initializes with vendorid, deviceid and name
> + """
> + self.vendorID = vendor
> + self.deviceID = device
> + self.name = name
> +
> + def report(self):
> + print "\t\t%s\t%s\t%s" % (self.vendorID, self.deviceID,self.name)
> +
> +class PCIIds:
> + """
> + Top class for all pci.ids entries.
> + All queries will be asked to this class.
> + PCIIds.vendors["0e11"].devices["0046"].subdevices["0e11:4091"].name = "Smart Array 6i"
> + """
> + def __init__(self, filename):
> + """
> + Prepares the directories.
> + Checks local data file.
> + Tries to load from local, if not found, downloads from web
> + """
> + self.version = ""
> + self.date = ""
> + self.vendors = {}
> + self.contents = None
> + self.readLocal(filename)
> + self.parse()
> +
> + def reportVendors(self):
> + """Reports the vendors
> + """
> + for vid, v in self.vendors.items():
> + print v.ID, v.name
> +
> + def report(self, vendor = None):
> + """
> + Reports everything for all vendors or a specific vendor
> + PCIIds.report() reports everything
> + PCIIDs.report("0e11") reports only "Compaq Computer Corporation"
> + """
> + if vendor != None:
> + self.vendors[vendor].report()
> + else:
> + for vID, v in self.vendors.items():
> + v.report()
> +
> + def find_vendor(self, vid):
> + # convert vid to a hex string and remove the 0x
> + vid = hex(vid)[2:]
> +
> + try:
> + return self.vendors[vid]
> + except:
> + return Vendor("%s Unknown Vendor" % (vid))
> +
> + def findDate(self, content):
> + for l in content:
> + if l.find("Date:") > -1:
> + return l.split()[-2].replace("-", "")
> + return None
> +
> + def parse(self):
> + if len(self.contents) < 1:
> + print "data/%s-pci.ids not found" % self.date
> + else:
> + vendorID = ""
> + deviceID = ""
> + for l in self.contents:
> + if l[0] == "#":
> + continue
> + elif len(l.strip()) == 0:
> + continue
> + else:
> + if l.find("\t\t") == 0:
> + self.vendors[vendorID].devices[deviceID].addSubDevice(l)
> + elif l.find("\t") == 0:
> + deviceID = l.strip().split()[0]
> + self.vendors[vendorID].addDevice(l)
> + else:
> + vendorID = l.split()[0]
> + self.vendors[vendorID] = Vendor(l)
> +
> + def readLocal(self, filename):
> + """
> + Reads the local file
> + """
> + self.contents = open(filename).readlines()
> + self.date = self.findDate(self.contents)
> +
> + def loadLocal(self):
> + """
> + Loads database from local. If there is no file,
> + it creates a new one from web
> + """
> + self.date = idsfile[0].split("/")[1].split("-")[0]
> + self.readLocal()
> +
> +
> +
> +#=======================================
> +
> +def search_file(filename, search_path):
> + """ Given a search path, find file with requested name """
> + for path in string.split(search_path, ":"):
> + candidate = os.path.join(path, filename)
> + if os.path.exists(candidate): return os.path.abspath(candidate)
> + return None
> +
> +class ReadElf(object):
> + """ display_* methods are used to emit output into the output stream
> + """
> + def __init__(self, file, output):
> + """ file:
> + stream object with the ELF file to read
> +
> + output:
> + output stream to write to
> + """
> + self.elffile = ELFFile(file)
> + self.output = output
> +
> + # Lazily initialized if a debug dump is requested
> + self._dwarfinfo = None
> +
> + self._versioninfo = None
> +
> + def _section_from_spec(self, spec):
> + """ Retrieve a section given a "spec" (either number or name).
> + Return None if no such section exists in the file.
> + """
> + try:
> + num = int(spec)
> + if num < self.elffile.num_sections():
> + return self.elffile.get_section(num)
> + else:
> + return None
> + except ValueError:
> + # Not a number. Must be a name then
> + return self.elffile.get_section_by_name(str2bytes(spec))
> +
> + def pretty_print_pmdinfo(self, pmdinfo):
> + global pcidb
> +
> + for i in pmdinfo["pci_ids"]:
> + vendor = pcidb.find_vendor(i[0])
> + device = vendor.find_device(i[1])
> + subdev = device.find_subid(i[2], i[3])
> + print("%s (%s) : %s (%s) %s" % (vendor.name, vendor.ID, device.name, device.ID, subdev.name))
> +
> + def parse_pmd_info_string(self, mystring):
> + global raw_output
> + global pcidb
> +
> + optional_pmd_info = [{'id': 'params', 'tag' : 'PMD PARAMETERS'}]
> +
> + i = mystring.index("=");
> + mystring = mystring[i+2:]
> + pmdinfo = json.loads(mystring)
> +
> + if raw_output:
> + print(pmdinfo)
> + return
> +
> + print("PMD NAME: " + pmdinfo["name"])
> + print("PMD TYPE: " + pmdinfo["type"])
> + for i in optional_pmd_info:
> + try:
> + print("%s: %s" % (i['tag'], pmdinfo[i['id']]))
> + except KeyError as e:
> + continue
> +
> + if (pmdinfo["type"] == "PMD_PDEV"):
> + print("PMD HW SUPPORT:")
> + if pcidb != None:
> + self.pretty_print_pmdinfo(pmdinfo)
> + else:
> + print("VENDOR\t DEVICE\t SUBVENDOR\t SUBDEVICE")
> + for i in pmdinfo["pci_ids"]:
> + print("0x%04x\t 0x%04x\t 0x%04x\t\t 0x%04x" % (i[0], i[1], i[2], i[3]))
> +
> + print("")
> +
> +
> + def display_pmd_info_strings(self, section_spec):
> + """ Display a strings dump of a section. section_spec is either a
> + section number or a name.
> + """
> + section = self._section_from_spec(section_spec)
> + if section is None:
> + return
> +
> +
> + data = section.data()
> + dataptr = 0
> +
> + while dataptr < len(data):
> + while ( dataptr < len(data) and
> + not (32 <= byte2int(data[dataptr]) <= 127)):
> + dataptr += 1
> +
> + if dataptr >= len(data):
> + break
> +
> + endptr = dataptr
> + while endptr < len(data) and byte2int(data[endptr]) != 0:
> + endptr += 1
> +
> + mystring = bytes2str(data[dataptr:endptr])
> + rc = mystring.find("PMD_INFO_STRING")
> + if (rc != -1):
> + self.parse_pmd_info_string(mystring)
> +
> + dataptr = endptr
> +
> + def search_for_autoload_path(self):
> + section = self._section_from_spec(".rodata")
> + if section is None:
> + return None
> +
> + data = section.data()
> + dataptr = 0
> +
> + while dataptr < len(data):
> + while ( dataptr < len(data) and
> + not (32 <= byte2int(data[dataptr]) <= 127)):
> + dataptr += 1
> +
> + if dataptr >= len(data):
> + break
> +
> + endptr = dataptr
> + while endptr < len(data) and byte2int(data[endptr]) != 0:
> + endptr += 1
> +
> + mystring = bytes2str(data[dataptr:endptr])
> + rc = mystring.find("DPDK_PLUGIN_PATH")
> + if (rc != -1):
> + rc = mystring.find("=")
> + return mystring[rc+1:]
> +
> + dataptr = endptr
> + return None
> +
> + def get_dt_runpath(self, dynsec):
> + for tag in dynsec.iter_tags():
> + if tag.entry.d_tag == 'DT_RUNPATH':
> + return tag.runpath
> + return ""
> +
> +
> + def process_dt_needed_entries(self):
> + """ Look to see if there are any DT_NEEDED entries in the binary
> + And process those if there are
> + """
> + global raw_output
> + runpath = ""
> + ldlibpath = os.environ.get('LD_LIBRARY_PATH')
> + if (ldlibpath == None):
> + ldlibpath = ""
> +
> + dynsec = self._section_from_spec(".dynamic")
> + try:
> + runpath = self.get_dt_runpath(dynsec)
> + except AttributeError:
> + # dynsec is None, just return
> + return
> +
> + for tag in dynsec.iter_tags():
> + if tag.entry.d_tag == 'DT_NEEDED':
> + rc = tag.needed.find("librte_pmd")
> + if (rc != -1):
> + library = search_file(tag.needed,
> + runpath + ":" + ldlibpath +
> + ":/usr/lib64:/lib64:/usr/lib:/lib")
> + if (library != None):
> + if (raw_output == False):
> + print("Scanning %s for pmd information" % library)
> + with open(library, 'rb') as file:
> + libelf = ReadElf(file, sys.stdout)
> + libelf.process_dt_needed_entries()
> + libelf.display_pmd_info_strings(".rodata")
> + file.close()
> +
> +def scan_autoload_path(autoload_path):
> + global raw_output
> +
> + if os.path.exists(autoload_path) == False:
> + return
> +
> + for d in os.listdir(autoload_path):
> + dpath = os.path.join(autoload_path, d)
> + if os.path.isdir(dpath):
> + scan_autoload_path(dpath)
> + if os.path.isfile(dpath):
> + if (raw_output == False):
> + print("Hw Support for library %s" % d)
> + file = open(dpath, 'rb')
> + readelf = ReadElf(file, sys.stdout)
> + readelf.display_pmd_info_strings(".rodata")
> + file.close()
Might want to wrap ReadElf() in try-except ELFError to avoid traceback
in case there are other files in the directory. Not that other files are
expected there, but EAL ignores all non-pmd files there so it'd be good
to match that.
> +
> +
> +def scan_for_autoload_pmds(dpdk_path):
> + """
> + search the specified application or path for a pmd autoload path
> + then scan said path for pmds and report hw support
> + """
> + global raw_output
> +
> + if (os.path.isfile(dpdk_path) == False):
> + # Assume this is a directory and we need to scan librte_eal.so
> + dpdk_path=os.path.join(dpdk_path, "librte_eal.so")
The unversioned .so symlink is not guaranteed to be there, they're
typically placed into -devel packages which wont be installed for
"normal use" (developers are another story obviously)
Also assuming there might be multiple versions of DPDK runtime
parallel-installed, it might point to any of them so its a bit of a lottery.
> +
> + file = open(dpdk_path, 'rb')
> + readelf = ReadElf(file, sys.stdout)
Might want to wrap this in try-except ELFError, its a user-entered path.
> + autoload_path = readelf.search_for_autoload_path()
> + if (autoload_path == None or autoload_path == ""):
> + if (raw_output == False):
> + print("No autoload path configured in %s" % dpdk_path)
> + return
> + if (raw_output == False):
> + print("Found autoload path %s in %s" % (autoload_path, dpdk_path))
> +
> + file.close()
> + if (raw_output == False):
> + print("Discovered Autoload HW Support:")
> + scan_autoload_path(autoload_path)
> + return
> +
> +
> +def main(stream=None):
> + global raw_output
> + global pcidb
> +
> + optparser = OptionParser(
> + usage='usage: %prog [-hrt] [-p <dpdk dir>] [-d <pci id file] <elf-file>',
Minor nit, but with the later additions the usage message isn't accurate
anymore, <elf-file> could be a directory too so <file|dir> would be
closer to the mark, and in plugin mode it's not looked at all. Might be
simpler to both users + and in actual code if plugin mode is just a
true/false flag and uses the same args[0] as argument as it too handles
both a file and a directory case.
> + description="Dump pmd hardware support info",
> + add_help_option=True,
> + prog='pmdinfo.py')
> + optparser.add_option('-r', '--raw',
> + action='store_true', dest='raw_output',
> + help='Dump raw json strings')
> + optparser.add_option("-d", "--pcidb", dest="pcifile",
> + help="specify a pci database to get vendor names from",
> + default="/usr/share/hwdata/pci.ids", metavar="FILE")
> + optparser.add_option("-t", "--table", dest="tblout",
> + help="output infomation on hw support as a hex table",
> + action='store_true')
> + optparser.add_option("-p", "--plugindir", dest="pdir",
> + help="scan dpdk for autoload plugins", metavar="PATH|APP")
> +
> + options, args = optparser.parse_args()
> +
> + if options.raw_output:
> + raw_output = True
> +
> + if options.pcifile:
> + pcidb = PCIIds(options.pcifile)
> + if pcidb == None:
> + print("Pci DB file not found")
> + exit(1)
> +
> + if options.tblout:
> + options.pcifile = None
> + pcidb = None
> +
> + if options.pdir:
> + exit (scan_for_autoload_pmds(options.pdir))
> +
> + ldlibpath = os.environ.get('LD_LIBRARY_PATH')
> + if (ldlibpath == None):
> + ldlibpath = ""
> +
> + if (os.path.exists(args[0]) == True):
> + myelffile = args[0]
> + else:
> + myelffile = search_file(args[0], ldlibpath + ":/usr/lib64:/lib64:/usr/lib:/lib")
Minor nit, but this tracebacks when executing pmdinfo.py without
arguments. Would be nicer to dump usage instead.
[pmatilai@sopuli dpdk]$ tools/pmdinfo.py
Traceback (most recent call last):
File "tools/pmdinfo.py", line 543, in <module>
main()
File "tools/pmdinfo.py", line 520, in main
if (os.path.exists(args[0]) == True):
IndexError: list index out of range
- Panu -
> +
> + if (myelffile == None):
> + print("File not found")
> + sys.exit(1)
> +
> + with open(myelffile, 'rb') as file:
> + try:
> + readelf = ReadElf(file, sys.stdout)
> + readelf.process_dt_needed_entries()
> + readelf.display_pmd_info_strings(".rodata")
> + sys.exit(0)
> +
> + except ELFError as ex:
> + sys.stderr.write('ELF error: %s\n' % ex)
> + sys.exit(1)
> +
> +
> +#-------------------------------------------------------------------------------
> +if __name__ == '__main__':
> + main()
> +
> +
>
next prev parent reply other threads:[~2016-05-24 7:41 UTC|newest]
Thread overview: 166+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-05-16 20:41 [dpdk-dev] [PATCH 0/4] Implement pmd hardware support exports Neil Horman
2016-05-16 20:41 ` [dpdk-dev] [PATCH 1/4] pmdinfo: Add buildtools and pmdinfo utility Neil Horman
2016-05-16 20:41 ` [dpdk-dev] [PATCH 2/4] drivers: Update driver registration macro usage Neil Horman
2016-05-16 20:41 ` [dpdk-dev] [PATCH 3/4] Makefile: Do post processing on objects that register a driver Neil Horman
2016-05-16 20:41 ` [dpdk-dev] [PATCH 4/4] pmd_hw_support.py: Add tool to query binaries for hw support information Neil Horman
2016-05-18 11:48 ` Panu Matilainen
2016-05-18 12:03 ` Neil Horman
2016-05-18 12:48 ` Panu Matilainen
2016-05-18 13:48 ` Neil Horman
2016-05-19 6:08 ` Panu Matilainen
2016-05-19 13:26 ` Neil Horman
2016-05-20 7:30 ` Panu Matilainen
2016-05-20 14:06 ` Neil Horman
2016-05-23 11:56 ` Panu Matilainen
2016-05-23 13:55 ` Neil Horman
2016-05-24 6:15 ` Panu Matilainen
2016-05-24 14:55 ` Neil Horman
2016-05-18 12:38 ` Thomas Monjalon
2016-05-18 13:09 ` Panu Matilainen
2016-05-18 13:26 ` Thomas Monjalon
2016-05-18 13:54 ` Neil Horman
2016-05-18 21:08 ` [dpdk-dev] [PATCHv2 0/4] Implement pmd hardware support exports Neil Horman
2016-05-18 21:08 ` [dpdk-dev] [PATCHv2 1/4] pmdinfogen: Add buildtools and pmdinfogen utility Neil Horman
2016-05-19 7:51 ` Panu Matilainen
2016-05-19 12:00 ` Neil Horman
2016-05-18 21:08 ` [dpdk-dev] [PATCHv2 2/4] drivers: Update driver registration macro usage Neil Horman
2016-05-19 7:58 ` Panu Matilainen
2016-05-19 10:45 ` Neil Horman
2016-05-19 10:51 ` [dpdk-dev] [dpdk-dev, PATCHv2, " Jan Viktorin
[not found] ` <20160519124650.060aa09a@pcviktorin.fit.vutbr.cz>
2016-05-19 11:40 ` Neil Horman
2016-05-18 21:08 ` [dpdk-dev] [PATCHv2 3/4] Makefile: Do post processing on objects that register a driver Neil Horman
2016-05-18 21:08 ` [dpdk-dev] [PATCHv2 4/4] pmdinfo.py: Add tool to query binaries for hw and other support information Neil Horman
2016-05-19 9:02 ` Panu Matilainen
2016-05-19 12:00 ` Neil Horman
2016-05-20 5:22 ` Panu Matilainen
2016-05-20 8:55 ` Thomas Monjalon
2016-05-20 9:12 ` Panu Matilainen
2016-05-20 14:22 ` Neil Horman
2016-05-20 14:20 ` Neil Horman
2016-05-20 17:24 ` [dpdk-dev] [PATCHv3 0/5] Implement pmd hardware support exports Neil Horman
2016-05-20 17:24 ` [dpdk-dev] [PATCHv3 1/5] pmdinfogen: Add buildtools and pmdinfogen utility Neil Horman
2016-05-20 17:24 ` [dpdk-dev] [PATCHv3 2/5] drivers: Update driver registration macro usage Neil Horman
2016-05-24 6:57 ` Panu Matilainen
2016-05-24 13:21 ` Neil Horman
2016-05-20 17:24 ` [dpdk-dev] [PATCHv3 3/5] eal: Add an export symbol to expose the autoload path to external tools Neil Horman
2016-05-20 17:24 ` [dpdk-dev] [PATCHv3 4/5] Makefile: Do post processing on objects that register a driver Neil Horman
2016-05-20 17:24 ` [dpdk-dev] [PATCHv3 5/5] pmdinfo.py: Add tool to query binaries for hw and other support information Neil Horman
2016-05-24 7:41 ` Panu Matilainen [this message]
2016-05-24 15:17 ` Neil Horman
2016-05-24 8:34 ` Panu Matilainen
2016-05-24 19:41 ` [dpdk-dev] [PATCHv4 0/5] Implement pmd hardware support exports Neil Horman
2016-05-24 19:41 ` [dpdk-dev] [PATCHv4 1/5] pmdinfogen: Add buildtools and pmdinfogen utility Neil Horman
2016-05-25 13:21 ` Thomas Monjalon
2016-05-25 17:22 ` Neil Horman
2016-05-25 17:39 ` Thomas Monjalon
2016-05-25 19:13 ` Neil Horman
2016-05-25 19:39 ` Thomas Monjalon
2016-05-25 19:57 ` Neil Horman
2016-05-24 19:41 ` [dpdk-dev] [PATCHv4 2/5] drivers: Update driver registration macro usage Neil Horman
2016-05-25 16:20 ` Thomas Monjalon
2016-05-25 17:35 ` Neil Horman
2016-05-24 19:41 ` [dpdk-dev] [PATCHv4 3/5] eal: Add an export symbol to expose the autoload path to external tools Neil Horman
2016-05-24 19:41 ` [dpdk-dev] [PATCHv4 4/5] Makefile: Do post processing on objects that register a driver Neil Horman
2016-05-25 17:08 ` Thomas Monjalon
2016-05-25 17:40 ` Neil Horman
2016-05-25 18:56 ` Thomas Monjalon
2016-05-25 19:43 ` Neil Horman
2016-05-25 20:04 ` Thomas Monjalon
2016-05-25 20:16 ` Neil Horman
2016-05-24 19:41 ` [dpdk-dev] [PATCHv4 5/5] pmdinfo.py: Add tool to query binaries for hw and other support information Neil Horman
2016-05-25 17:22 ` Thomas Monjalon
2016-05-25 17:47 ` Neil Horman
2016-05-25 18:58 ` Thomas Monjalon
2016-05-27 9:16 ` Panu Matilainen
2016-05-27 11:35 ` Neil Horman
2016-05-27 12:46 ` Panu Matilainen
2016-05-25 8:32 ` [dpdk-dev] [PATCHv4 0/5] Implement pmd hardware support exports Panu Matilainen
2016-05-25 11:27 ` Neil Horman
2016-05-26 17:17 ` [dpdk-dev] [PATCHv5 0/6] " Neil Horman
2016-05-26 17:17 ` [dpdk-dev] [PATCHv5 1/6] pmdinfogen: Add buildtools and pmdinfogen utility Neil Horman
2016-05-26 17:17 ` [dpdk-dev] [PATCHv5 2/6] drivers: Update driver registration macro usage Neil Horman
2016-05-26 17:17 ` [dpdk-dev] [PATCHv5 3/6] eal: Add an export symbol to expose the autoload path to external tools Neil Horman
2016-05-26 17:17 ` [dpdk-dev] [PATCHv5 4/6] Makefile: Do post processing on objects that register a driver Neil Horman
2016-05-26 17:17 ` [dpdk-dev] [PATCHv5 5/6] pmdinfo.py: Add tool to query binaries for hw and other support information Neil Horman
2016-05-27 14:38 ` Mcnamara, John
2016-05-27 19:56 ` Neil Horman
2016-05-26 17:17 ` [dpdk-dev] [PATCHv5 6/6] remove rte.hostapp.mk Neil Horman
2016-05-31 13:57 ` [dpdk-dev] [PATCHv6 0/7] Implement pmd hardware support exports Neil Horman
2016-05-31 13:57 ` [dpdk-dev] [PATCHv6 1/7] pmdinfogen: Add buildtools and pmdinfogen utility Neil Horman
2016-06-07 9:57 ` Thomas Monjalon
2016-06-07 12:04 ` Neil Horman
2016-06-07 12:53 ` Thomas Monjalon
2016-06-07 13:03 ` Neil Horman
2016-06-07 13:24 ` Thomas Monjalon
2016-06-07 13:49 ` Neil Horman
2016-06-07 14:09 ` Thomas Monjalon
2016-05-31 13:57 ` [dpdk-dev] [PATCHv6 2/7] drivers: Update driver registration macro usage Neil Horman
2016-05-31 13:57 ` [dpdk-dev] [PATCHv6 3/7] eal: Add an export symbol to expose the autoload path to external tools Neil Horman
2016-05-31 13:57 ` [dpdk-dev] [PATCHv6 4/7] Makefile: Do post processing on objects that register a driver Neil Horman
2016-05-31 13:57 ` [dpdk-dev] [PATCHv6 5/7] pmdinfo.py: Add tool to query binaries for hw and other support information Neil Horman
2016-05-31 13:57 ` [dpdk-dev] [PATCHv6 6/7] remove rte.hostapp.mk Neil Horman
2016-05-31 13:57 ` [dpdk-dev] [PATCHv6 7/7] doc: Add prog_guide section documenting pmdinfo script Neil Horman
2016-06-08 17:14 ` Mcnamara, John
2016-06-09 17:31 ` Neil Horman
2016-06-05 0:20 ` [dpdk-dev] [PATCHv6 0/7] Implement pmd hardware support exports Neil Horman
2016-06-07 9:34 ` Thomas Monjalon
2016-06-07 12:08 ` Neil Horman
2016-06-07 12:27 ` Thomas Monjalon
2016-06-09 17:46 ` [dpdk-dev] [PATCHv7 0/6] " Neil Horman
2016-06-09 17:46 ` [dpdk-dev] [PATCHv7 1/6] pmdinfogen: Add buildtools and pmdinfogen utility Neil Horman
2016-06-16 12:29 ` Panu Matilainen
2016-06-16 13:33 ` Neil Horman
2016-06-16 14:06 ` Panu Matilainen
2016-06-16 14:41 ` Neil Horman
2016-06-09 17:46 ` [dpdk-dev] [PATCHv7 2/6] drivers: Update driver registration macro usage Neil Horman
2016-06-09 17:46 ` [dpdk-dev] [PATCHv7 3/6] eal: Add an export symbol to expose the autoload path to external tools Neil Horman
2016-06-09 17:46 ` [dpdk-dev] [PATCHv7 4/6] Makefile: Do post processing on objects that register a driver Neil Horman
2016-06-09 17:47 ` [dpdk-dev] [PATCHv7 5/6] pmdinfo.py: Add tool to query binaries for hw and other support information Neil Horman
2016-06-16 12:32 ` Panu Matilainen
2016-06-09 17:47 ` [dpdk-dev] [PATCHv7 6/6] doc: Add prog_guide section documenting pmdinfo script Neil Horman
2016-06-09 19:55 ` Mcnamara, John
2016-06-17 18:46 ` [dpdk-dev] [PATCHv8 0/6] Implement pmd hardware support exports Neil Horman
2016-06-17 18:46 ` [dpdk-dev] [PATCHv8 1/6] pmdinfogen: Add buildtools and pmdinfogen utility Neil Horman
2016-06-17 18:46 ` [dpdk-dev] [PATCHv8 2/6] drivers: Update driver registration macro usage Neil Horman
2016-07-07 11:00 ` De Lara Guarch, Pablo
2016-07-07 11:39 ` Neil Horman
2016-07-07 15:37 ` [dpdk-dev] [PATCH] crypto: normalize cryptodev pmd names with macros Neil Horman
2016-07-08 9:09 ` De Lara Guarch, Pablo
2016-07-08 12:17 ` Neil Horman
2016-07-08 12:40 ` Thomas Monjalon
2016-07-08 13:42 ` Neil Horman
2016-07-08 19:03 ` Mcnamara, John
2016-07-09 13:34 ` Neil Horman
2016-07-09 16:04 ` Mcnamara, John
2016-07-08 14:00 ` De Lara Guarch, Pablo
2016-07-08 14:14 ` Neil Horman
2016-07-08 10:03 ` Thomas Monjalon
2016-07-08 16:34 ` [dpdk-dev] [PATCH v2] " Pablo de Lara
2016-07-08 16:46 ` [dpdk-dev] [PATCH v3] " Pablo de Lara
2016-07-08 17:14 ` Thomas Monjalon
2016-06-17 18:46 ` [dpdk-dev] [PATCHv8 3/6] eal: Add an export symbol to expose the autoload path to external tools Neil Horman
2016-06-17 18:46 ` [dpdk-dev] [PATCHv8 4/6] Makefile: Do post processing on objects that register a driver Neil Horman
2016-06-17 18:46 ` [dpdk-dev] [PATCHv8 5/6] pmdinfo.py: Add tool to query binaries for hw and other support information Neil Horman
2016-06-29 15:12 ` Remy Horton
2016-06-29 16:18 ` Neil Horman
2016-06-30 7:45 ` Remy Horton
2016-06-17 18:46 ` [dpdk-dev] [PATCHv8 6/6] doc: Add prog_guide section documenting pmdinfo script Neil Horman
2016-06-29 9:18 ` [dpdk-dev] [PATCHv8 0/6] Implement pmd hardware support exports Remy Horton
2016-06-29 11:31 ` Neil Horman
2016-06-30 7:45 ` Remy Horton
2016-07-06 21:21 ` Thomas Monjalon
2016-07-04 1:13 ` [dpdk-dev] [PATCH v9 0/7] export PMD infos Thomas Monjalon
2016-07-04 1:13 ` [dpdk-dev] [PATCH v9 1/7] drivers: export infos as string symbols Thomas Monjalon
2016-07-04 1:14 ` [dpdk-dev] [PATCH v9 2/7] mk: remove recipe for tool library Thomas Monjalon
2016-07-04 1:14 ` [dpdk-dev] [PATCH v9 3/7] mk: refresh recipe for any host application Thomas Monjalon
2016-07-04 1:14 ` [dpdk-dev] [PATCH v9 4/7] pmdinfogen: parse driver to generate code to export Thomas Monjalon
2016-07-04 1:14 ` [dpdk-dev] [PATCH v9 5/7] mk: link infos generated by pmdinfogen Thomas Monjalon
2016-07-04 1:14 ` [dpdk-dev] [PATCH v9 6/7] eal: export default plugin path to external tools Thomas Monjalon
2016-07-04 1:14 ` [dpdk-dev] [PATCH v9 7/7] tools: query binaries for support information Thomas Monjalon
2016-07-04 12:34 ` [dpdk-dev] [PATCH v9 0/7] export PMD infos Neil Horman
2016-07-04 13:10 ` Thomas Monjalon
2016-07-04 16:41 ` Neil Horman
2016-07-04 20:10 ` Thomas Monjalon
2016-07-05 20:08 ` Neil Horman
2016-07-06 15:33 ` Thomas Monjalon
2016-07-04 15:22 ` Bruce Richardson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=fd1632df-fa33-68c1-0370-b725dae0ef5f@redhat.com \
--to=pmatilai@redhat.com \
--cc=bruce.richardson@intel.com \
--cc=dev@dpdk.org \
--cc=nhorman@tuxdriver.com \
--cc=stephen@networkplumber.org \
--cc=thomas.monjalon@6wind.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).