get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/19760/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 19760,
    "url": "http://patches.dpdk.org/api/patches/19760/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1484801117-779-5-git-send-email-thomas.monjalon@6wind.com/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<1484801117-779-5-git-send-email-thomas.monjalon@6wind.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1484801117-779-5-git-send-email-thomas.monjalon@6wind.com",
    "date": "2017-01-19T04:45:08",
    "name": "[dpdk-dev,v11,04/13] app/test: check bus registration",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "d8314a33b39de87e30859f839a53cc9c92f4c4a3",
    "submitter": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/people/1/?format=api",
        "name": "Thomas Monjalon",
        "email": "thomas.monjalon@6wind.com"
    },
    "delegate": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/1484801117-779-5-git-send-email-thomas.monjalon@6wind.com/mbox/",
    "series": [],
    "comments": "http://patches.dpdk.org/api/patches/19760/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/19760/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [IPv6:::1])\n\tby dpdk.org (Postfix) with ESMTP id 8AF43FB3D;\n\tThu, 19 Jan 2017 05:45:41 +0100 (CET)",
            "from mail-wm0-f46.google.com (mail-wm0-f46.google.com\n\t[74.125.82.46]) by dpdk.org (Postfix) with ESMTP id 4AB5EFB21\n\tfor <dev@dpdk.org>; Thu, 19 Jan 2017 05:45:26 +0100 (CET)",
            "by mail-wm0-f46.google.com with SMTP id r126so273694545wmr.0\n\tfor <dev@dpdk.org>; Wed, 18 Jan 2017 20:45:26 -0800 (PST)",
            "from XPS13.localdomain (184.203.134.77.rev.sfr.net.\n\t[77.134.203.184]) by smtp.gmail.com with ESMTPSA id\n\tt194sm2568586wmd.1.2017.01.18.20.45.24\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128);\n\tWed, 18 Jan 2017 20:45:25 -0800 (PST)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=6wind-com.20150623.gappssmtp.com; s=20150623;\n\th=from:to:cc:subject:date:message-id:in-reply-to:references;\n\tbh=RzA1KfI4Y7NJyi/egpfjvLzloT7Gc2axGhFmdxdDJTQ=;\n\tb=s0JOLx6Tpmhtn+ekI5pwCUkdknihRQ2yI5e/yYPbg6tszftMiPi24Tal0lEqU43Na4\n\tzj77X4+Y3W0tp/C1MxQHTf9t7PP0vCLac4gsIWmzb3w/TCrk8VyukgXqz4QI3U/kKPDm\n\twtf1xXCmNG0O0h+bMqDu7g0UtR+FizwBU3hOQnwIaRzsuDvCShPLV4I8ZPj9c3kTXmAI\n\tWRITYmH+5M3q+Xu8+WOPndFE7cbEmGpLXEwk7bwYOjT60pkqrPv7v1/nVZO2RCRvry8/\n\tScwDulr4O0ia9IAO2PpemS5fRr7pnStzGy18tEADbjYVMHyUo9iR36xWAG2gvCYRotGo\n\tpLHg==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references;\n\tbh=RzA1KfI4Y7NJyi/egpfjvLzloT7Gc2axGhFmdxdDJTQ=;\n\tb=KkoL6Q8FsEpY0jIH0wZ4w4WGG6iUh/yLLfSbe2RoC0x65MVM3A44nrPUtQrGXDrlvV\n\tAUrWmRTVATGfBD/Ge7k490XPmZKVMx4murZLLAj8bWGBip2ys8VJJQtLnAJR4Rgw/bT1\n\tAETExfHFylj9xITyr6QDFdrTLTKgbK6rweFlkJu4emWL661FD+OZnnGyWOpy+Uep7P0R\n\tyN5AZzxXnp9lByXforkT2/pCz9jDnpow9vuKjHTOkBVJJ+kHAltEbn3v/aRdCyfnFzDc\n\t6/gSeon4W5q+glTRRkTW4kSvD8THvifwp7wU8PYU/lcJF1NbuMTpZ47dl4L0NFp4C5m/\n\t28OA==",
        "X-Gm-Message-State": "AIkVDXJqWr+iV3Qi3Ncq0XrKmeYWxpqVoGw/pbrsoknR2lDVPKq0rSDjzT4HlyIpTQj4k+YZ",
        "X-Received": "by 10.28.152.137 with SMTP id\n\ta131mr24811754wme.139.1484801125877; \n\tWed, 18 Jan 2017 20:45:25 -0800 (PST)",
        "From": "Thomas Monjalon <thomas.monjalon@6wind.com>",
        "To": "Shreyansh Jain <shreyansh.jain@nxp.com>",
        "Cc": "dev@dpdk.org",
        "Date": "Thu, 19 Jan 2017 05:45:08 +0100",
        "Message-Id": "<1484801117-779-5-git-send-email-thomas.monjalon@6wind.com>",
        "X-Mailer": "git-send-email 2.7.0",
        "In-Reply-To": "<1484801117-779-1-git-send-email-thomas.monjalon@6wind.com>",
        "References": "<1484748329-5418-1-git-send-email-shreyansh.jain@nxp.com>\n\t<1484801117-779-1-git-send-email-thomas.monjalon@6wind.com>",
        "Subject": "[dpdk-dev] [PATCH v11 04/13] app/test: check bus registration",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<http://dpdk.org/ml/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://dpdk.org/ml/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<http://dpdk.org/ml/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "From: Shreyansh Jain <shreyansh.jain@nxp.com>\n\nVerification of bus registration, deregistration methods.\n\nSigned-off-by: Shreyansh Jain <shreyansh.jain@nxp.com>\nReviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>\n---\n MAINTAINERS                                     |   1 +\n app/test/Makefile                               |   2 +-\n app/test/autotest_data.py                       |   6 +\n app/test/test.h                                 |   1 +\n app/test/test_bus.c                             | 355 ++++++++++++++++++++++++\n lib/librte_eal/bsdapp/eal/rte_eal_version.map   |   1 +\n lib/librte_eal/common/include/rte_bus.h         |   3 +\n lib/librte_eal/linuxapp/eal/rte_eal_version.map |   1 +\n 8 files changed, 369 insertions(+), 1 deletion(-)\n create mode 100644 app/test/test_bus.c",
    "diff": "diff --git a/MAINTAINERS b/MAINTAINERS\nindex f071138..6c87f33 100644\n--- a/MAINTAINERS\n+++ b/MAINTAINERS\n@@ -89,6 +89,7 @@ F: lib/librte_eal/common/include/generic/\n F: doc/guides/prog_guide/env_abstraction_layer.rst\n F: app/test/test_alarm.c\n F: app/test/test_atomic.c\n+F: app/test/test_bus.c\n F: app/test/test_byteorder.c\n F: app/test/test_common.c\n F: app/test/test_cpuflags.c\ndiff --git a/app/test/Makefile b/app/test/Makefile\nindex 9de301f..48235ad 100644\n--- a/app/test/Makefile\n+++ b/app/test/Makefile\n@@ -94,7 +94,7 @@ SRCS-y += test_cycles.c\n SRCS-y += test_spinlock.c\n SRCS-y += test_memory.c\n SRCS-y += test_memzone.c\n-\n+SRCS-y += test_bus.c\n SRCS-y += test_ring.c\n SRCS-y += test_ring_perf.c\n SRCS-y += test_pmd_perf.c\ndiff --git a/app/test/autotest_data.py b/app/test/autotest_data.py\nindex 0cd598b..ab08a64 100644\n--- a/app/test/autotest_data.py\n+++ b/app/test/autotest_data.py\n@@ -204,6 +204,12 @@ def per_sockets(num):\n         \"Tests\":\n         [\n             {\n+                \"Name\":    \"Bus autotest\",\n+                \"Command\": \"bus_autotest\",\n+                \"Func\":    default_autotest,\n+                \"Report\":  None,\n+            },\n+            {\n                 \"Name\":    \"PCI autotest\",\n                 \"Command\": \"pci_autotest\",\n                 \"Func\":    default_autotest,\ndiff --git a/app/test/test.h b/app/test/test.h\nindex 82831f4..9be88a7 100644\n--- a/app/test/test.h\n+++ b/app/test/test.h\n@@ -233,6 +233,7 @@ extern const char *prgname;\n \n int commands_init(void);\n \n+int test_bus(void);\n int test_pci(void);\n int test_pci_run;\n \ndiff --git a/app/test/test_bus.c b/app/test/test_bus.c\nnew file mode 100644\nindex 0000000..e2a58fa\n--- /dev/null\n+++ b/app/test/test_bus.c\n@@ -0,0 +1,355 @@\n+/*-\n+ *   BSD LICENSE\n+ *\n+ *   Copyright(c) 2016 NXP.\n+ *   All rights reserved.\n+ *\n+ *   Redistribution and use in source and binary forms, with or without\n+ *   modification, are permitted provided that the following conditions\n+ *   are met:\n+ *\n+ *     * Redistributions of source code must retain the above copyright\n+ *       notice, this list of conditions and the following disclaimer.\n+ *     * Redistributions in binary form must reproduce the above copyright\n+ *       notice, this list of conditions and the following disclaimer in\n+ *       the documentation and/or other materials provided with the\n+ *       distribution.\n+ *     * Neither the name of NXP nor the names of its\n+ *       contributors may be used to endorse or promote products derived\n+ *       from this software without specific prior written permission.\n+ *\n+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+ *   \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+ */\n+\n+#include <stdio.h>\n+#include <string.h>\n+#include <stdint.h>\n+#include <sys/queue.h>\n+\n+#include <rte_bus.h>\n+#include <rte_pci.h>\n+#include <rte_devargs.h>\n+\n+#include \"test.h\"\n+#include \"resource.h\"\n+\n+/* Visualizing following bus-device-driver model for test\n+ *\n+ *  ===.===========.===========.=========,= busA\n+ *     |           |           .         |\n+ *   devA1       devA2         .         '____CPU_\n+ *    `-----------`-------> driverA      |\n+ *                                       '\n+ *  ===.===========.===========.=========|= busB\n+ *     |           |           .\n+ *   devB1       devB2         .\n+ *    `-----------`-------> driverB\n+ *\n+ */\n+\n+#define MAX_DEVICES_ON_BUS\t10\n+#define MAX_DRIVERS_ON_BUS\t10\n+\n+struct dummy_driver;\n+struct dummy_device;\n+struct dummy_bus;\n+\n+TAILQ_HEAD(dummy_device_list, dummy_device); /**< List of dummy devices */\n+TAILQ_HEAD(dummy_driver_list, dummy_driver); /**< List of dummy drivers */\n+\n+/* A structure representing a ethernet/crypto device, embedding\n+ * the rte_device.\n+ */\n+struct dummy_device {\n+\tTAILQ_ENTRY(dummy_device) next;\n+\tconst char *name;\n+\tstruct rte_device dev;\n+};\n+\n+/* A structure representing a PMD driver of a particular type,\n+ * for e.g. PCI.\n+ */\n+struct dummy_driver {\n+\tTAILQ_ENTRY(dummy_driver) next;\n+\tconst char *name;\n+\tstruct rte_driver drv;\n+};\n+\n+struct dummy_bus {\n+\tTAILQ_ENTRY(dummy_bus) next;\n+\tconst char *name;\n+\tstruct rte_bus bus;\n+\tstruct dummy_driver_list driver_list;\n+\tstruct dummy_device_list device_list;\n+};\n+\n+/* Structure representing a Bus with devices attached to it, and drivers\n+ * for those devices\n+ */\n+struct dummy_bus_map {\n+\tconst char *name;\n+\tstruct dummy_bus *dbus;\n+\tstruct dummy_driver *ddrivers[MAX_DRIVERS_ON_BUS];\n+\tstruct dummy_device *ddevices[MAX_DEVICES_ON_BUS];\n+};\n+\n+struct rte_bus_list orig_bus_list =\n+\tTAILQ_HEAD_INITIALIZER(orig_bus_list);\n+\n+struct dummy_bus busA = {\n+\t.name = \"busA_impl\", /* busA */\n+\t.bus = {\n+\t\t.name = \"busA\",\n+\t},\n+};\n+\n+struct dummy_bus busB = {\n+\t.name = \"busB_impl\", /* busB */\n+\t.bus = {\n+\t\t.name = \"busB\",\n+\t},\n+};\n+\n+struct dummy_driver driverA = {\n+\t.name = \"driverA_impl\",\n+\t.drv = {\n+\t\t.name = \"driverA\",\n+\t},\n+};\n+\n+struct dummy_device devA1 = {\n+\t.name = \"devA1\",\n+\t.dev = {\n+\t\t.driver = NULL,\n+\t}\n+};\n+\n+struct dummy_device devA2 = {\n+\t.name = \"devA2\",\n+\t.dev = {\n+\t\t.driver = NULL,\n+\t}\n+};\n+\n+struct dummy_driver driverB = {\n+\t.name = \"driverB_impl\",\n+\t.drv = {\n+\t\t.name = \"driverB\",\n+\t},\n+};\n+\n+struct dummy_device devB1 = {\n+\t.name = \"devB1\",\n+\t.dev = {\n+\t\t.driver = NULL,\n+\t}\n+};\n+\n+struct dummy_device devB2 = {\n+\t.name = \"devB2\",\n+\t.dev = {\n+\t\t.driver = NULL,\n+\t}\n+};\n+\n+struct dummy_bus_map bus_map[] = {\n+\t{\n+\t\t.name = \"busA\",\n+\t\t.dbus = &busA,\n+\t\t.ddrivers = {&driverA, NULL},\n+\t\t.ddevices = {&devA1, &devA2, NULL},\n+\t},\n+\t{\n+\t\t.name = \"busB\",\n+\t\t.dbus = &busB,\n+\t\t.ddrivers = {&driverB, NULL},\n+\t\t.ddevices = {&devB1, &devB2, NULL},\n+\t},\n+\t{NULL, NULL, {NULL,}, {NULL,}, },\n+};\n+\n+/* @internal\n+ * Dump the device tree\n+ */\n+static void\n+dump_device_tree(void)\n+{\n+\tint i;\n+\tstruct dummy_bus_map *db;\n+\tstruct rte_bus *bus;\n+\tstruct dummy_bus *dbus;\n+\tstruct dummy_driver *ddriver;\n+\tstruct dummy_device *ddevice;\n+\n+\tprintf(\"------>8-------\\n\");\n+\tprintf(\"Device Tree:\\n\");\n+\tfor (i = 0; bus_map[i].name; i++) {\n+\t\tdb = &bus_map[i];\n+\n+\t\tbus = &db->dbus->bus;\n+\t\tif (!bus)\n+\t\t\treturn;\n+\n+\t\tdbus = container_of(bus, struct dummy_bus, bus);\n+\t\tprintf(\" Bus: %s (Implementation name: %s)\\n\",\n+\t\t       bus->name, dbus->name);\n+\n+\t\tprintf(\"  Drivers on bus:\\n\");\n+\t\tTAILQ_FOREACH(ddriver, &dbus->driver_list, next) {\n+\t\t\tprintf(\"    %s\\n\", ddriver->name);\n+\t\t}\n+\n+\t\tprintf(\"  Devices on bus:\\n\");\n+\t\tTAILQ_FOREACH(ddevice, &dbus->device_list, next) {\n+\t\t\tprintf(\"    Addr: %p\\n\", ddevice);\n+\t\t\tif (ddevice->dev.driver)\n+\t\t\t\tprintf(\"    Driver = %s\\n\",\n+\t\t\t\t       ddevice->dev.driver->name);\n+\t\t\telse\n+\t\t\t\tprintf(\"    Driver = None\\n\");\n+\t\t}\n+\t}\n+\tprintf(\"------>8-------\\n\");\n+}\n+\n+static int\n+test_bus_setup(void)\n+{\n+\tstruct rte_bus *bus_p = NULL;\n+\n+\t/* Preserve the original bus list before executing test */\n+\twhile (!TAILQ_EMPTY(&rte_bus_list)) {\n+\t\tbus_p = TAILQ_FIRST(&rte_bus_list);\n+\t\tTAILQ_REMOVE(&rte_bus_list, bus_p, next);\n+\t\tTAILQ_INSERT_TAIL(&orig_bus_list, bus_p, next);\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+test_bus_cleanup(void)\n+{\n+\tstruct rte_bus *bus_p = NULL;\n+\n+\t/* Cleanup rte_bus_list before restoring entries */\n+\twhile (!TAILQ_EMPTY(&rte_bus_list)) {\n+\t\tbus_p = TAILQ_FIRST(&rte_bus_list);\n+\t\trte_bus_unregister(bus_p);\n+\t\tTAILQ_REMOVE(&rte_bus_list, bus_p, next);\n+\t}\n+\n+\tbus_p = NULL;\n+\t/* Restore original entries */\n+\twhile (!TAILQ_EMPTY(&orig_bus_list)) {\n+\t\tbus_p = TAILQ_FIRST(&orig_bus_list);\n+\t\tTAILQ_REMOVE(&orig_bus_list, bus_p, next);\n+\t\tTAILQ_INSERT_TAIL(&rte_bus_list, bus_p, next);\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+test_bus_registration(void)\n+{\n+\tint i;\n+\tint ret;\n+\tstruct rte_bus *bus = NULL;\n+\n+\tfor (i = 0; bus_map[i].name != NULL; i++) {\n+\t\tbus = &(bus_map[i].dbus->bus);\n+\t\trte_bus_register(bus);\n+\t\tprintf(\"Registered Bus %s\\n\", bus_map[i].name);\n+\t}\n+\n+\t/* Verify that all buses have been successfully registered */\n+\ti = 0;\n+\tTAILQ_FOREACH(bus, &rte_bus_list, next) {\n+\t\t/* Or, if the name of the bus is NULL */\n+\t\tif (!bus->name) {\n+\t\t\t/* Incorrect entry in list */\n+\t\t\tprintf(\"Incorrect bus registered.\\n\");\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\t/* Or, if the bus name doesn't match that of bus_map */\n+\t\tret = strcmp(bus->name, bus_map[i].name);\n+\t\tif (ret) {\n+\t\t\t/* Bus name doesn't match */\n+\t\t\tprintf(\"Unable to correctly register bus (%s).\\n\",\n+\t\t\t       bus_map[i].name);\n+\t\t\treturn -1;\n+\t\t}\n+\t\ti++;\n+\t}\n+\n+\t/* Current value of bus_map[i] should be the NULL entry */\n+\tif (bus_map[i].name != NULL) {\n+\t\tprintf(\"Not all buses were registered. For e.g. (%s)\\n\",\n+\t\t       bus_map[i].name);\n+\t\treturn -1;\n+\t}\n+\n+\tprintf(\"Buses registered are:\\n\");\n+\trte_bus_dump(stdout);\n+\n+\treturn 0;\n+}\n+\n+static int\n+test_bus_unregistration(void)\n+{\n+\tint i;\n+\tstruct rte_bus *bus = NULL;\n+\n+\tfor (i = 0; bus_map[i].name != NULL; i++) {\n+\t\tbus = &(bus_map[i].dbus->bus);\n+\t\tif (bus) {\n+\t\t\tprintf(\"Unregistering bus: '%s'\\n\", bus->name);\n+\t\t\trte_bus_unregister(bus);\n+\t\t}\n+\t}\n+\n+\tif (!TAILQ_EMPTY(&rte_bus_list)) {\n+\t\t/* Unable to unregister all dummy buses */\n+\t\tprintf(\"Unable to unregister all buses\\n\");\n+\t\treturn -1;\n+\t}\n+\n+\tprintf(\"All buses have been unregistered.\\n\");\n+\tdump_device_tree();\n+\treturn 0;\n+}\n+\n+int\n+test_bus(void)\n+{\n+\t/* Make necessary arrangements before starting test */\n+\tif (test_bus_setup())\n+\t\treturn -1;\n+\n+\tif (test_bus_registration())\n+\t\treturn -1;\n+\n+\tif (test_bus_unregistration())\n+\t\treturn -1;\n+\n+\t/* Restore the original environment/settings */\n+\tif (test_bus_cleanup())\n+\t\treturn -1;\n+\n+\treturn 0;\n+}\n+\n+REGISTER_TEST_COMMAND(bus_autotest, test_bus);\ndiff --git a/lib/librte_eal/bsdapp/eal/rte_eal_version.map b/lib/librte_eal/bsdapp/eal/rte_eal_version.map\nindex 2cf1ac8..a3d9fac 100644\n--- a/lib/librte_eal/bsdapp/eal/rte_eal_version.map\n+++ b/lib/librte_eal/bsdapp/eal/rte_eal_version.map\n@@ -178,6 +178,7 @@ DPDK_16.11 {\n DPDK_17.02 {\n \tglobal:\n \n+\trte_bus_list;\n \trte_bus_dump;\n \trte_bus_probe;\n \trte_bus_register;\ndiff --git a/lib/librte_eal/common/include/rte_bus.h b/lib/librte_eal/common/include/rte_bus.h\nindex 7c36969..19954f4 100644\n--- a/lib/librte_eal/common/include/rte_bus.h\n+++ b/lib/librte_eal/common/include/rte_bus.h\n@@ -56,6 +56,9 @@ extern \"C\" {\n /** Double linked list of buses */\n TAILQ_HEAD(rte_bus_list, rte_bus);\n \n+/* Bus list exposed */\n+extern struct rte_bus_list rte_bus_list;\n+\n /**\n  * Bus specific scan for devices attached on the bus.\n  * For each bus object, the scan would be reponsible for finding devices and\ndiff --git a/lib/librte_eal/linuxapp/eal/rte_eal_version.map b/lib/librte_eal/linuxapp/eal/rte_eal_version.map\nindex 3c68ff5..69e0e7b 100644\n--- a/lib/librte_eal/linuxapp/eal/rte_eal_version.map\n+++ b/lib/librte_eal/linuxapp/eal/rte_eal_version.map\n@@ -182,6 +182,7 @@ DPDK_16.11 {\n DPDK_17.02 {\n \tglobal:\n \n+\trte_bus_list;\n \trte_bus_dump;\n \trte_bus_probe;\n \trte_bus_register;\n",
    "prefixes": [
        "dpdk-dev",
        "v11",
        "04/13"
    ]
}