get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 1725,
    "url": "https://patches.dpdk.org/api/patches/1725/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1417513268-6040-1-git-send-email-xiaobo.chi@nsn.com/",
    "project": {
        "id": 1,
        "url": "https://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": "<1417513268-6040-1-git-send-email-xiaobo.chi@nsn.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1417513268-6040-1-git-send-email-xiaobo.chi@nsn.com",
    "date": "2014-12-02T09:41:08",
    "name": "[dpdk-dev] add one option memory-only for those secondary PRBs",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": true,
    "hash": "d782065f814939b7c0ddc8ee72d5cab3ffc01555",
    "submitter": {
        "id": 124,
        "url": "https://patches.dpdk.org/api/people/124/?format=api",
        "name": "chixiaobo",
        "email": "xiaobo.chi@nsn.com"
    },
    "delegate": null,
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/1417513268-6040-1-git-send-email-xiaobo.chi@nsn.com/mbox/",
    "series": [],
    "comments": "https://patches.dpdk.org/api/patches/1725/comments/",
    "check": "pending",
    "checks": "https://patches.dpdk.org/api/patches/1725/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 8323232A5;\n\tTue,  2 Dec 2014 10:41:15 +0100 (CET)",
            "from demumfd001.nsn-inter.net (demumfd001.nsn-inter.net\n\t[93.183.12.32]) by dpdk.org (Postfix) with ESMTP id 6EAEFDE0\n\tfor <dev@dpdk.org>; Tue,  2 Dec 2014 10:41:11 +0100 (CET)",
            "from demuprx017.emea.nsn-intra.net ([10.150.129.56])\n\tby demumfd001.nsn-inter.net (8.14.3/8.14.3) with ESMTP id\n\tsB29fAgx018918\n\t(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK)\n\tfor <dev@dpdk.org>; Tue, 2 Dec 2014 09:41:10 GMT",
            "from localhost ([10.140.132.118])\n\tby demuprx017.emea.nsn-intra.net (8.12.11.20060308/8.12.11) with\n\tESMTP id sB29f8oD009297; Tue, 2 Dec 2014 10:41:09 +0100"
        ],
        "From": "chixiaobo <xiaobo.chi@nsn.com>",
        "To": "dev@dpdk.org",
        "Date": "Tue,  2 Dec 2014 17:41:08 +0800",
        "Message-Id": "<1417513268-6040-1-git-send-email-xiaobo.chi@nsn.com>",
        "X-Mailer": "git-send-email 1.9.4.msysgit.2",
        "X-purgate-type": "clean",
        "X-purgate-Ad": "Categorized by eleven eXpurgate (R) http://www.eleven.de",
        "X-purgate": [
            "clean",
            "This mail is considered clean (visit http://www.eleven.de for\n\tfurther information)"
        ],
        "X-purgate-size": "9637",
        "X-purgate-ID": "151667::1417513270-0000658F-D890E314/0/0",
        "Subject": "[dpdk-dev] [PATCH] add one option memory-only for those secondary\n\tPRBs",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "patches and discussions about DPDK <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": "---\n lib/librte_eal/common/eal_common_options.c |  18 +++-\n lib/librte_eal/common/eal_internal_cfg.h   |   1 +\n lib/librte_eal/common/eal_options.h        |   4 +-\n lib/librte_eal/linuxapp/eal/eal.c          | 137 +++++++++++++++--------------\n 4 files changed, 89 insertions(+), 71 deletions(-)\n mode change 100644 => 100755 lib/librte_eal/common/eal_common_options.c\n mode change 100644 => 100755 lib/librte_eal/common/eal_internal_cfg.h\n mode change 100644 => 100755 lib/librte_eal/common/eal_options.h\n mode change 100644 => 100755 lib/librte_eal/linuxapp/eal/eal.c",
    "diff": "diff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c\nold mode 100644\nnew mode 100755\nindex e2810ab..5ab4b87\n--- a/lib/librte_eal/common/eal_common_options.c\n+++ b/lib/librte_eal/common/eal_common_options.c\n@@ -85,6 +85,7 @@ eal_long_options[] = {\n \t{OPT_XEN_DOM0, 0, 0, OPT_XEN_DOM0_NUM},\n \t{OPT_CREATE_UIO_DEV, 1, NULL, OPT_CREATE_UIO_DEV_NUM},\n \t{OPT_VFIO_INTR, 1, NULL, OPT_VFIO_INTR_NUM},\n+    {OPT_MEMORY_ONLY, 0, NULL, OPT_MEMORY_ONLY_NUM},\n \t{0, 0, 0, 0}\n };\n \n@@ -126,6 +127,7 @@ eal_reset_internal_config(struct internal_config *internal_cfg)\n \tinternal_cfg->no_hpet = 1;\n #endif\n \tinternal_cfg->vmware_tsc_map = 0;\n+    internal_cfg->memory_only= 0;\n }\n \n /*\n@@ -454,6 +456,10 @@ eal_parse_common_option(int opt, const char *optarg,\n \t\tconf->process_type = eal_parse_proc_type(optarg);\n \t\tbreak;\n \n+\tcase OPT_MEMORY_ONLY_NUM:\n+\t\tconf->memory_only= 1;\n+\t\tbreak;\n+\n \tcase OPT_MASTER_LCORE_NUM:\n \t\tif (eal_parse_master_lcore(optarg) < 0) {\n \t\t\tRTE_LOG(ERR, EAL, \"invalid parameter for --\"\n@@ -525,9 +531,9 @@ eal_check_common_options(struct internal_config *internal_cfg)\n {\n \tstruct rte_config *cfg = rte_eal_get_configuration();\n \n-\tif (!lcores_parsed) {\n-\t\tRTE_LOG(ERR, EAL, \"CPU cores must be enabled with options \"\n-\t\t\t\"-c or -l\\n\");\n+\tif (!lcores_parsed && !(internal_cfg->process_type == RTE_PROC_SECONDARY&& internal_cfg->memory_only) ) {\n+\t\tRTE_LOG(ERR, EAL, \"For those processes without memory-only option, CPU cores \"\n+            \"must be enabled with options -c or -l\\n\");\n \t\treturn -1;\n \t}\n \tif (cfg->lcore_role[cfg->master_lcore] != ROLE_RTE) {\n@@ -545,6 +551,11 @@ eal_check_common_options(struct internal_config *internal_cfg)\n \t\t\t\"specified\\n\");\n \t\treturn -1;\n \t}\n+\tif ( internal_cfg->process_type != RTE_PROC_SECONDARY &&\n+\t\t\tinternal_cfg->memory_only) {\n+\t\tRTE_LOG(ERR, EAL, \"only secondary processes can specify memory-only option.\\n\");\n+\t\treturn -1;\n+\t}\n \tif (index(internal_cfg->hugefile_prefix, '%') != NULL) {\n \t\tRTE_LOG(ERR, EAL, \"Invalid char, '%%', in --\"OPT_FILE_PREFIX\" \"\n \t\t\t\"option\\n\");\n@@ -590,6 +601,7 @@ eal_common_usage(void)\n \t       \"  --\"OPT_SYSLOG\"     : set syslog facility\\n\"\n \t       \"  --\"OPT_LOG_LEVEL\"  : set default log level\\n\"\n \t       \"  --\"OPT_PROC_TYPE\"  : type of this process\\n\"\n+           \"  --\"OPT_MEMORY_ONLY\": only use shared memory, valid only for secondary process.\"\n \t       \"  --\"OPT_PCI_BLACKLIST\", -b: add a PCI device in black list.\\n\"\n \t       \"               Prevent EAL from using this PCI device. The argument\\n\"\n \t       \"               format is <domain:bus:devid.func>.\\n\"\ndiff --git a/lib/librte_eal/common/eal_internal_cfg.h b/lib/librte_eal/common/eal_internal_cfg.h\nold mode 100644\nnew mode 100755\nindex aac6abf..68b982c\n--- a/lib/librte_eal/common/eal_internal_cfg.h\n+++ b/lib/librte_eal/common/eal_internal_cfg.h\n@@ -85,6 +85,7 @@ struct internal_config {\n \n \tunsigned num_hugepage_sizes;      /**< how many sizes on this system */\n \tstruct hugepage_info hugepage_info[MAX_HUGEPAGE_SIZES];\n+    volatile unsigned memory_only;    /**<wheter the seconday process only need shared momory only or not */\n };\n extern struct internal_config internal_config; /**< Global EAL configuration. */\n \ndiff --git a/lib/librte_eal/common/eal_options.h b/lib/librte_eal/common/eal_options.h\nold mode 100644\nnew mode 100755\nindex e476f8d..6ddff1b\n--- a/lib/librte_eal/common/eal_options.h\n+++ b/lib/librte_eal/common/eal_options.h\n@@ -76,7 +76,9 @@ enum {\n #define OPT_CREATE_UIO_DEV \"create-uio-dev\"\n \tOPT_CREATE_UIO_DEV_NUM,\n #define OPT_VFIO_INTR    \"vfio-intr\"\n-\tOPT_VFIO_INTR_NUM,\n+        OPT_VFIO_INTR_NUM,\n+#define OPT_MEMORY_ONLY  \"memory-only\"\n+        OPT_MEMORY_ONLY_NUM,\n \tOPT_LONG_MAX_NUM\n };\n \ndiff --git a/lib/librte_eal/linuxapp/eal/eal.c b/lib/librte_eal/linuxapp/eal/eal.c\nold mode 100644\nnew mode 100755\nindex 89f3b5e..a03e511\n--- a/lib/librte_eal/linuxapp/eal/eal.c\n+++ b/lib/librte_eal/linuxapp/eal/eal.c\n@@ -752,14 +752,16 @@ rte_eal_init(int argc, char **argv)\n \n \trte_config_init();\n \n-\tif (rte_eal_pci_init() < 0)\n-\t\trte_panic(\"Cannot init PCI\\n\");\n+    /*with memory-only option, we need not cpu affinity, pci device, alarm, external devices, interrupt, etc. */\n+    if( !internal_config.memory_only ){\n+    \tif (rte_eal_pci_init() < 0)\n+    \t\trte_panic(\"Cannot init PCI\\n\");\n \n #ifdef RTE_LIBRTE_IVSHMEM\n \tif (rte_eal_ivshmem_init() < 0)\n \t\trte_panic(\"Cannot init IVSHMEM\\n\");\n #endif\n-\n+    }\n \tif (rte_eal_memory_init() < 0)\n \t\trte_panic(\"Cannot init memory\\n\");\n \n@@ -772,73 +774,73 @@ rte_eal_init(int argc, char **argv)\n \tif (rte_eal_tailqs_init() < 0)\n \t\trte_panic(\"Cannot init tail queues for objects\\n\");\n \n-#ifdef RTE_LIBRTE_IVSHMEM\n-\tif (rte_eal_ivshmem_obj_init() < 0)\n-\t\trte_panic(\"Cannot init IVSHMEM objects\\n\");\n-#endif\n-\n \tif (rte_eal_log_init(logid, internal_config.syslog_facility) < 0)\n \t\trte_panic(\"Cannot init logs\\n\");\n \n-\tif (rte_eal_alarm_init() < 0)\n-\t\trte_panic(\"Cannot init interrupt-handling thread\\n\");\n-\n-\tif (rte_eal_intr_init() < 0)\n-\t\trte_panic(\"Cannot init interrupt-handling thread\\n\");\n-\n-\tif (rte_eal_timer_init() < 0)\n-\t\trte_panic(\"Cannot init HPET or TSC timers\\n\");\n-\n-\teal_check_mem_on_local_socket();\n-\n-\trte_eal_mcfg_complete();\n-\n-\tTAILQ_FOREACH(solib, &solib_list, next) {\n-\t\tRTE_LOG(INFO, EAL, \"open shared lib %s\\n\", solib->name);\n-\t\tsolib->lib_handle = dlopen(solib->name, RTLD_NOW);\n-\t\tif (solib->lib_handle == NULL)\n-\t\t\tRTE_LOG(WARNING, EAL, \"%s\\n\", dlerror());\n-\t}\n-\n-\teal_thread_init_master(rte_config.master_lcore);\n-\n-\tRTE_LOG(DEBUG, EAL, \"Master core %u is ready (tid=%x)\\n\",\n-\t\trte_config.master_lcore, (int)thread_id);\n-\n-\tif (rte_eal_dev_init() < 0)\n-\t\trte_panic(\"Cannot init pmd devices\\n\");\n-\n-\tRTE_LCORE_FOREACH_SLAVE(i) {\n-\n-\t\t/*\n-\t\t * create communication pipes between master thread\n-\t\t * and children\n-\t\t */\n-\t\tif (pipe(lcore_config[i].pipe_master2slave) < 0)\n-\t\t\trte_panic(\"Cannot create pipe\\n\");\n-\t\tif (pipe(lcore_config[i].pipe_slave2master) < 0)\n-\t\t\trte_panic(\"Cannot create pipe\\n\");\n-\n-\t\tlcore_config[i].state = WAIT;\n-\n-\t\t/* create a thread for each lcore */\n-\t\tret = pthread_create(&lcore_config[i].thread_id, NULL,\n-\t\t\t\t     eal_thread_loop, NULL);\n-\t\tif (ret != 0)\n-\t\t\trte_panic(\"Cannot create thread\\n\");\n-\t}\n-\n-\t/*\n-\t * Launch a dummy function on all slave lcores, so that master lcore\n-\t * knows they are all ready when this function returns.\n-\t */\n-\trte_eal_mp_remote_launch(sync_func, NULL, SKIP_MASTER);\n-\trte_eal_mp_wait_lcore();\n-\n-\t/* Probe & Initialize PCI devices */\n-\tif (rte_eal_pci_probe())\n-\t\trte_panic(\"Cannot probe PCI\\n\");\n-\n+    if( !internal_config.memory_only ){\n+#ifdef RTE_LIBRTE_IVSHMEM\n+        if (rte_eal_ivshmem_obj_init() < 0)\n+            rte_panic(\"Cannot init IVSHMEM objects\\n\");\n+#endif        \n+        if (rte_eal_alarm_init() < 0)\n+    \t\trte_panic(\"Cannot init interrupt-handling thread\\n\");\n+\n+    \tif (rte_eal_intr_init() < 0)\n+    \t\trte_panic(\"Cannot init interrupt-handling thread\\n\");\n+\n+    \tif (rte_eal_timer_init() < 0)\n+    \t\trte_panic(\"Cannot init HPET or TSC timers\\n\");\n+\n+    \teal_check_mem_on_local_socket();\n+\n+    \trte_eal_mcfg_complete();\n+\n+    \tTAILQ_FOREACH(solib, &solib_list, next) {\n+    \t\tRTE_LOG(INFO, EAL, \"open shared lib %s\\n\", solib->name);\n+    \t\tsolib->lib_handle = dlopen(solib->name, RTLD_NOW);\n+    \t\tif (solib->lib_handle == NULL)\n+    \t\t\tRTE_LOG(WARNING, EAL, \"%s\\n\", dlerror());\n+    \t}\n+\n+    \teal_thread_init_master(rte_config.master_lcore);\n+\n+    \tRTE_LOG(DEBUG, EAL, \"Master core %u is ready (tid=%x)\\n\",\n+    \t\trte_config.master_lcore, (int)thread_id);\n+\n+    \tif (rte_eal_dev_init() < 0)\n+    \t\trte_panic(\"Cannot init pmd devices\\n\");\n+\n+    \tRTE_LCORE_FOREACH_SLAVE(i) {\n+\n+    \t\t/*\n+        \t\t * create communication pipes between master thread\n+        \t\t * and children\n+        \t\t */\n+    \t\tif (pipe(lcore_config[i].pipe_master2slave) < 0)\n+    \t\t\trte_panic(\"Cannot create pipe\\n\");\n+    \t\tif (pipe(lcore_config[i].pipe_slave2master) < 0)\n+    \t\t\trte_panic(\"Cannot create pipe\\n\");\n+\n+    \t\tlcore_config[i].state = WAIT;\n+\n+    \t\t/* create a thread for each lcore */\n+    \t\tret = pthread_create(&lcore_config[i].thread_id, NULL,\n+    \t\t\t\t     eal_thread_loop, NULL);\n+    \t\tif (ret != 0)\n+    \t\t\trte_panic(\"Cannot create thread\\n\");\n+    \t}\n+\n+    \t/*\n+        \t * Launch a dummy function on all slave lcores, so that master lcore\n+        \t * knows they are all ready when this function returns.\n+        \t */\n+        \trte_eal_mp_remote_launch(sync_func, NULL, SKIP_MASTER);\n+        \trte_eal_mp_wait_lcore();\n+\n+    \t/* Probe & Initialize PCI devices */\n+    \tif (rte_eal_pci_probe())\n+    \t\trte_panic(\"Cannot probe PCI\\n\");\n+    }\n \treturn fctret;\n }\n \n@@ -859,3 +861,4 @@ int rte_eal_has_hugepages(void)\n {\n \treturn ! internal_config.no_hugetlbfs;\n }\n+\n",
    "prefixes": [
        "dpdk-dev"
    ]
}