get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 77254,
    "url": "http://patches.dpdk.org/api/patches/77254/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20200911002207.31813-2-dmitry.kozliuk@gmail.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": "<20200911002207.31813-2-dmitry.kozliuk@gmail.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20200911002207.31813-2-dmitry.kozliuk@gmail.com",
    "date": "2020-09-11T00:22:06",
    "name": "[1/2] eal/windows: add interrupt thread skeleton",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "f4d9412a8d41dbb352703aae15ffd9558cc0d4e2",
    "submitter": {
        "id": 1581,
        "url": "http://patches.dpdk.org/api/people/1581/?format=api",
        "name": "Dmitry Kozlyuk",
        "email": "dmitry.kozliuk@gmail.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/20200911002207.31813-2-dmitry.kozliuk@gmail.com/mbox/",
    "series": [
        {
            "id": 12114,
            "url": "http://patches.dpdk.org/api/series/12114/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=12114",
            "date": "2020-09-11T00:22:05",
            "name": "eal/windows: implement alarms",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/12114/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/77254/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/77254/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 7688BA04B5;\n\tFri, 11 Sep 2020 02:22:23 +0200 (CEST)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 9532D1C0CC;\n\tFri, 11 Sep 2020 02:22:18 +0200 (CEST)",
            "from mail-lf1-f66.google.com (mail-lf1-f66.google.com\n [209.85.167.66]) by dpdk.org (Postfix) with ESMTP id B4E801C0B9\n for <dev@dpdk.org>; Fri, 11 Sep 2020 02:22:16 +0200 (CEST)",
            "by mail-lf1-f66.google.com with SMTP id u8so4582904lff.1\n for <dev@dpdk.org>; Thu, 10 Sep 2020 17:22:16 -0700 (PDT)",
            "from localhost.localdomain (broadband-37-110-65-23.ip.moscow.rt.ru.\n [37.110.65.23])\n by smtp.gmail.com with ESMTPSA id b16sm132765ljh.34.2020.09.10.17.22.14\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Thu, 10 Sep 2020 17:22:15 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;\n h=from:to:cc:subject:date:message-id:in-reply-to:references\n :mime-version:content-transfer-encoding;\n bh=y3qzjPoTey9ORwsAvnu8hpzcDKG6NLF1k3dCQgWhyjQ=;\n b=Xt5EJYmOfI3ZdPvNi6zLmVMTte9Qt0ZWAwkzLfl6UEHYnUjb/ZFhx53I2f4AlAqUJH\n kPQjnBOcrAUiNqRh5zoLZVCNPE3oNjKJkLQap4taCavPVxBOLc9Mt3swv2JxW+iAtecN\n Y9Zmkiw7jGcWMgwOySoCv4Dwq56eWurPeOcEeJ43ril3lDLc8jz+HuH6BwH8Ev3MU4U7\n 73urf/XQkCNL+t4Qy/9O74wScV/Y5ZyOpGy8lZvhpyqGvZQ9rMJVejBnIa6q6JH5+fpn\n ZdFKGAilBJJjyxRyb4VBszGwdYIv+dpgatYNncgE7AsujLe5mPOkj+zx+9cg+cDPQlE2\n l2kw==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20161025;\n h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n :references:mime-version:content-transfer-encoding;\n bh=y3qzjPoTey9ORwsAvnu8hpzcDKG6NLF1k3dCQgWhyjQ=;\n b=pC+BOAOKTH6piSCbCw8Rl7LYOKHD7bHcDKNwfGSvqfs9U3nkeR9x4sc7MCc8w9715N\n aF3BHy+LCRVG/n27XbYPPkpFTs3+OApYzEvfvaFI7bRVdyC8NPzY/3bBY60K7OErB+db\n yje/hEbv54sP9D4ja6XY7Vp0+3Gba8ESa+nItoAuietMooAwlzmgZeIKEXa8oI9xZW/t\n imFREB4l+CRjGAVm4LleUOn4xoMYZm/0tcBL1m1Q+yq+EbWlWkzqhUr4GMRiosuDX9z/\n fUlhPD6bBJmTA8i3qqHe4HRqMvnUuflHCRNYosaZ3Ux/ZEhcFWfWrUb/X4B9H2kW6fjo\n 3xlg==",
        "X-Gm-Message-State": "AOAM532UjcJUogsV9T6NPsFMk3wGdgf2UEPM8MgWAYvG1Us3/aTToxrD\n +2r0P+IyZsdXGR8p3OhFLls8PC0ZwvRxsg==",
        "X-Google-Smtp-Source": "\n ABdhPJxXF/mq9Hfuas/Jwo/JGyuOS9ORGADu3UoXZ9cuGFO8gbKxcjAmTHPwHExw3cmnd1CKIjH1BA==",
        "X-Received": "by 2002:a05:6512:32a8:: with SMTP id\n q8mr5563681lfe.209.1599783735723;\n Thu, 10 Sep 2020 17:22:15 -0700 (PDT)",
        "From": "Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>",
        "To": "dev@dpdk.org",
        "Cc": "Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>,\n Harman Kalra <hkalra@marvell.com>,\n Narcisa Ana Maria Vasile <navasile@linux.microsoft.com>,\n Dmitry Malloy <dmitrym@microsoft.com>,\n Pallavi Kadam <pallavi.kadam@intel.com>",
        "Date": "Fri, 11 Sep 2020 03:22:06 +0300",
        "Message-Id": "<20200911002207.31813-2-dmitry.kozliuk@gmail.com>",
        "X-Mailer": "git-send-email 2.25.4",
        "In-Reply-To": "<20200911002207.31813-1-dmitry.kozliuk@gmail.com>",
        "References": "<20200911002207.31813-1-dmitry.kozliuk@gmail.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH 1/2] eal/windows: add interrupt thread skeleton",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Windows interrupt support is based on IO completion ports (IOCP).\nInterrupt thread would send the devices requests to notify about\ninterrupts and then wait for any request completion. Add skeleton code\nof this model without any hardware support.\n\nAnother way to wake up the interrupt thread is APC (asynchronous procedure\ncall), scheduled by any other thread via eal_intr_thread_schedule().\nThis internal API is intended for alarm implementation.\n\nSigned-off-by: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>\n---\n lib/librte_eal/include/rte_eal_interrupts.h | 14 ++-\n lib/librte_eal/rte_eal_exports.def          |  1 +\n lib/librte_eal/windows/eal.c                |  5 ++\n lib/librte_eal/windows/eal_interrupts.c     | 99 +++++++++++++++++++++\n lib/librte_eal/windows/eal_windows.h        | 12 +++\n lib/librte_eal/windows/include/pthread.h    |  7 ++\n lib/librte_eal/windows/meson.build          |  1 +\n 7 files changed, 136 insertions(+), 3 deletions(-)\n create mode 100644 lib/librte_eal/windows/eal_interrupts.c",
    "diff": "diff --git a/lib/librte_eal/include/rte_eal_interrupts.h b/lib/librte_eal/include/rte_eal_interrupts.h\nindex b1e8a2934..b80edfc65 100644\n--- a/lib/librte_eal/include/rte_eal_interrupts.h\n+++ b/lib/librte_eal/include/rte_eal_interrupts.h\n@@ -69,10 +69,18 @@ struct rte_epoll_event {\n struct rte_intr_handle {\n \tRTE_STD_C11\n \tunion {\n-\t\tint vfio_dev_fd;  /**< VFIO device file descriptor */\n-\t\tint uio_cfg_fd;  /**< UIO cfg file desc for uio_pci_generic */\n+\t\tstruct {\n+\t\t\tRTE_STD_C11\n+\t\t\tunion {\n+\t\t\t\t/** VFIO device file descriptor */\n+\t\t\t\tint vfio_dev_fd;\n+\t\t\t\t/** UIO cfg file desc for uio_pci_generic */\n+\t\t\t\tint uio_cfg_fd;\n+\t\t\t};\n+\t\t\tint fd;\t/**< interrupt event file descriptor */\n+\t\t};\n+\t\tvoid *handle; /**< device driver handle (Windows) */\n \t};\n-\tint fd;\t /**< interrupt event file descriptor */\n \tenum rte_intr_handle_type type;  /**< handle type */\n \tuint32_t max_intr;             /**< max interrupt requested */\n \tuint32_t nb_efd;               /**< number of available efd(event fd) */\ndiff --git a/lib/librte_eal/rte_eal_exports.def b/lib/librte_eal/rte_eal_exports.def\nindex f54ed74a5..9baca0110 100644\n--- a/lib/librte_eal/rte_eal_exports.def\n+++ b/lib/librte_eal/rte_eal_exports.def\n@@ -72,6 +72,7 @@ EXPORTS\n \trte_vlog\n \trte_realloc\n \trte_strscpy\n+\trte_thread_is_intr\n \trte_zmalloc\n \trte_zmalloc_socket\n \ndiff --git a/lib/librte_eal/windows/eal.c b/lib/librte_eal/windows/eal.c\nindex bc48f27ab..141f22adb 100644\n--- a/lib/librte_eal/windows/eal.c\n+++ b/lib/librte_eal/windows/eal.c\n@@ -344,6 +344,11 @@ rte_eal_init(int argc, char **argv)\n \t\treturn -1;\n \t}\n \n+\tif (rte_eal_intr_init() < 0) {\n+\t\trte_eal_init_alert(\"Cannot init interrupt-handling thread\");\n+\t\treturn -1;\n+\t}\n+\n \tif (rte_eal_timer_init() < 0) {\n \t\trte_eal_init_alert(\"Cannot init TSC timer\");\n \t\trte_errno = EFAULT;\ndiff --git a/lib/librte_eal/windows/eal_interrupts.c b/lib/librte_eal/windows/eal_interrupts.c\nnew file mode 100644\nindex 000000000..d9bc5afc7\n--- /dev/null\n+++ b/lib/librte_eal/windows/eal_interrupts.c\n@@ -0,0 +1,99 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright (c) 2020 Dmitry Kozlyuk\n+ */\n+\n+#include <rte_interrupts.h>\n+\n+#include \"eal_private.h\"\n+#include \"eal_windows.h\"\n+\n+static pthread_t intr_thread;\n+\n+static HANDLE intr_iocp;\n+\n+static void\n+eal_intr_process(const OVERLAPPED_ENTRY *event)\n+{\n+\tRTE_SET_USED(event);\n+}\n+\n+static void *\n+eal_intr_thread_main(LPVOID arg __rte_unused)\n+{\n+\twhile (1) {\n+\t\tOVERLAPPED_ENTRY events[16];\n+\t\tULONG event_count, i;\n+\t\tBOOL result;\n+\n+\t\tresult = GetQueuedCompletionStatusEx(\n+\t\t\tintr_iocp, events, RTE_DIM(events), &event_count,\n+\t\t\tINFINITE, /* no timeout */\n+\t\t\tTRUE);    /* alertable wait for alarm APCs */\n+\n+\t\tif (!result) {\n+\t\t\tDWORD error = GetLastError();\n+\t\t\tif (error != WAIT_IO_COMPLETION) {\n+\t\t\t\tRTE_LOG_WIN32_ERR(\"GetQueuedCompletionStatusEx()\");\n+\t\t\t\tRTE_LOG(ERR, EAL, \"Failed waiting for interrupts\\n\");\n+\t\t\t\tbreak;\n+\t\t\t}\n+\n+\t\t\t/* No I/O events, all work is done in completed APCs. */\n+\t\t\tcontinue;\n+\t\t}\n+\n+\t\tfor (i = 0; i < event_count; i++)\n+\t\t\teal_intr_process(&events[i]);\n+\t}\n+\n+\tCloseHandle(intr_iocp);\n+\tintr_iocp = NULL;\n+\treturn NULL;\n+}\n+\n+int\n+rte_eal_intr_init(void)\n+{\n+\tint ret = 0;\n+\n+\tintr_iocp = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 1);\n+\tif (intr_iocp == NULL) {\n+\t\tRTE_LOG_WIN32_ERR(\"CreateIoCompletionPort()\");\n+\t\tRTE_LOG(ERR, EAL, \"Cannot create interrupt IOCP\\n\");\n+\t\treturn -1;\n+\t}\n+\n+\tret = rte_ctrl_thread_create(&intr_thread, \"eal-intr-thread\", NULL,\n+\t\t\teal_intr_thread_main, NULL);\n+\tif (ret != 0) {\n+\t\trte_errno = -ret;\n+\t\tRTE_LOG(ERR, EAL, \"Cannot create interrupt thread\\n\");\n+\t}\n+\n+\treturn ret;\n+}\n+\n+int\n+rte_thread_is_intr(void)\n+{\n+\treturn pthread_equal(intr_thread, pthread_self());\n+}\n+\n+int\n+eal_intr_thread_schedule(void (*func)(void *arg), void *arg)\n+{\n+\tHANDLE handle;\n+\n+\thandle = OpenThread(THREAD_ALL_ACCESS, FALSE, intr_thread);\n+\tif (handle == NULL) {\n+\t\tRTE_LOG_WIN32_ERR(\"OpenThread(%llu)\", intr_thread);\n+\t\treturn -ENOENT;\n+\t}\n+\n+\tif (!QueueUserAPC((PAPCFUNC)(ULONG_PTR)func, handle, (ULONG_PTR)arg)) {\n+\t\tRTE_LOG_WIN32_ERR(\"QueueUserAPC()\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\treturn 0;\n+}\ndiff --git a/lib/librte_eal/windows/eal_windows.h b/lib/librte_eal/windows/eal_windows.h\nindex d48ee0a12..478accc1b 100644\n--- a/lib/librte_eal/windows/eal_windows.h\n+++ b/lib/librte_eal/windows/eal_windows.h\n@@ -55,6 +55,18 @@ int eal_thread_create(pthread_t *thread);\n  */\n unsigned int eal_socket_numa_node(unsigned int socket_id);\n \n+/**\n+ * Schedule code for execution in the interrupt thread.\n+ *\n+ * @param func\n+ *  Function to call.\n+ * @param arg\n+ *  Argument to the called function.\n+ * @return\n+ *  0 on success, netagive error code on failure.\n+ */\n+int eal_intr_thread_schedule(void (*func)(void *arg), void *arg);\n+\n /**\n  * Open virt2phys driver interface device.\n  *\ndiff --git a/lib/librte_eal/windows/include/pthread.h b/lib/librte_eal/windows/include/pthread.h\nindex 99013dc94..a4ab4d094 100644\n--- a/lib/librte_eal/windows/include/pthread.h\n+++ b/lib/librte_eal/windows/include/pthread.h\n@@ -42,6 +42,13 @@ typedef SYNCHRONIZATION_BARRIER pthread_barrier_t;\n #define pthread_self() \\\n \t((pthread_t)GetCurrentThreadId())\n \n+\n+static inline int\n+pthread_equal(pthread_t t1, pthread_t t2)\n+{\n+\treturn t1 == t2;\n+}\n+\n static inline int\n pthread_setaffinity_np(pthread_t threadid, size_t cpuset_size,\n \t\t\trte_cpuset_t *cpuset)\ndiff --git a/lib/librte_eal/windows/meson.build b/lib/librte_eal/windows/meson.build\nindex 08c888e01..b690bc6b0 100644\n--- a/lib/librte_eal/windows/meson.build\n+++ b/lib/librte_eal/windows/meson.build\n@@ -8,6 +8,7 @@ sources += files(\n \t'eal_debug.c',\n \t'eal_file.c',\n \t'eal_hugepages.c',\n+\t'eal_interrupts.c',\n \t'eal_lcore.c',\n \t'eal_log.c',\n \t'eal_memalloc.c',\n",
    "prefixes": [
        "1/2"
    ]
}