get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 35064,
    "url": "http://patches.dpdk.org/api/patches/35064/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1518092427-4333-3-git-send-email-matan@mellanox.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": "<1518092427-4333-3-git-send-email-matan@mellanox.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1518092427-4333-3-git-send-email-matan@mellanox.com",
    "date": "2018-02-08T12:20:27",
    "name": "[dpdk-dev,v4,2/2] net/failsafe: fix calling device during RMV events",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "40a120c895dca45a23249554015a48a1e34e2947",
    "submitter": {
        "id": 796,
        "url": "http://patches.dpdk.org/api/people/796/?format=api",
        "name": "Matan Azrad",
        "email": "matan@mellanox.com"
    },
    "delegate": {
        "id": 319,
        "url": "http://patches.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/1518092427-4333-3-git-send-email-matan@mellanox.com/mbox/",
    "series": [],
    "comments": "http://patches.dpdk.org/api/patches/35064/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/35064/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 [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 5DC301B7E6;\n\tThu,  8 Feb 2018 13:20:56 +0100 (CET)",
            "from EUR03-VE1-obe.outbound.protection.outlook.com\n\t(mail-eopbgr50043.outbound.protection.outlook.com [40.107.5.43])\n\tby dpdk.org (Postfix) with ESMTP id 5791B1B7DD;\n\tThu,  8 Feb 2018 13:20:54 +0100 (CET)",
            "from mellanox.com (37.142.13.130) by\n\tHE1PR0501MB2666.eurprd05.prod.outlook.com (2603:10a6:3:cb::20) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.485.10;\n\tThu, 8 Feb 2018 12:20:50 +0000"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=Mellanox.com;\n\ts=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version;\n\tbh=AsBLU4t3gA5xNFyfCb83mPhXo+IAi2d0ve3EOklgyrk=;\n\tb=rms6Ov01iVmYAoqSAcKRhfk5yfAbf2ugpB1avB5kXwirgXQieKohsvNbR+C4CNlpJAXssEG87tPaeDvtC5v5/9xAPNWb1INGSI1sD5fqhEjbdbTFqFuWqJvK1+bhDwMKjBScN2jFcwhT9PJyt+/R/9BO2VzI1elmKdHUWNrGR0o=",
        "Authentication-Results": "spf=none (sender IP is )\n\tsmtp.mailfrom=matan@mellanox.com; ",
        "From": "Matan Azrad <matan@mellanox.com>",
        "To": "Gaetan Rivet <gaetan.rivet@6wind.com>",
        "Cc": "dev@dpdk.org,\n\tOphir Munk <ophirmu@mellanox.com>,\n\tstable@dpdk.org",
        "Date": "Thu,  8 Feb 2018 12:20:27 +0000",
        "Message-Id": "<1518092427-4333-3-git-send-email-matan@mellanox.com>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "In-Reply-To": "<1518092427-4333-1-git-send-email-matan@mellanox.com>",
        "References": "<1507243328-11287-1-git-send-email-ophirmu@mellanox.com>\n\t<1518092427-4333-1-git-send-email-matan@mellanox.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-Originating-IP": "[37.142.13.130]",
        "X-ClientProxiedBy": "DB3PR0202CA0026.eurprd02.prod.outlook.com\n\t(2603:10a6:8:1::39) To HE1PR0501MB2666.eurprd05.prod.outlook.com\n\t(2603:10a6:3:cb::20)",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-Office365-Filtering-HT": "Tenant",
        "X-MS-Office365-Filtering-Correlation-Id": "b0188757-7acc-45d3-80af-08d56eee650c",
        "X-Microsoft-Antispam": "UriScan:; BCL:0; PCL:0;\n\tRULEID:(7020095)(4652020)(48565401081)(4534165)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020);\n\tSRVR:HE1PR0501MB2666; ",
        "X-Microsoft-Exchange-Diagnostics": [
            "1; HE1PR0501MB2666;\n\t3:vOxccBDo3UeRpGKTUoACJzpGZnCSh1mBWrQV9LVoug55fu19kTEwAw2Jj1/4/gLLqaHGSCRJyBMIfashRXWJhHcZiZj313rjwOqrvZqe85uk01SJ6NU4K8HPGaNMdo89ZHITHN0l1jmMm41uJXenahdc1YbC5W+39hRaTpuwBEU9p0/chX0PPNXOuby45TnXBAurYDAN3yadQSKvSMkVrhAZcP/MWy+oQHYBVTjt0HZyQEdEV+p1BHsObFbTNSim;\n\t25:B5JM49I6HyFqtAPKo3+iEywKADKRL5o34T8wdqbWsCVaehL3/MkkYa2hE6uv5yJ1GdhrhPu8mbSO3ZAcS5hUQZ9E7NmUXoSc+hzoTIiMkORREJQnt1QjVvAZ0dXj4T85VImSBkJDEBtpxa7+AtKmQGGSODPuk4og+KzxoYGmsPRJDt8n3z/O7Fh/Ccty5XmNdCiUEH8cUHT/pKwBbs5b98D36glJTQr646hoRHlfK/3BeLVg25+tBniiSM2b6LdPQW07rYuFNRAryeJStZZvt8+rwKfxlRO/1pBeOIh4SdXVLTH7RMgLQaVAt8wCv4hFFK/zWSZeKtpfNT7l02Hmiw==;\n\t31:B4TJwR7sYNiH/0AeOXLErRLGS7QSPjkSq6q2pV3sfv0c7MLA6IWN6mTMRXvKZZzJKjXA48xTDUFkYBo6AaD1NBmHrX39C6pdMub8L9hD/zB8Dxv+YN94+YsfLClx5SJdERYEnDL76Svj+vFlmpUYZJNEXb9dKa9jbWlND1GgZ4E0z4ILa/R3q4Y/IPUIwcMM9S3VZ77xR6n2JgJtyRx9jQoVJRlly5M+oLsn2WMQrVM=",
            "1; HE1PR0501MB2666;\n\t20:Zjqq7DOr3MBVmeEbQypoyG435mJKiv2cl9mUMk/2OToek6AJaAol7Ofu6Du3sqwEoFgoGCzMC2ODP4NGsUcVxjQr4MeDEzmmh7MyPPY3hJtQoKs/1JY15xTfNlKBmpctUnfFEWM3ME3slt2OuPn/FlVNiMhgNk8yrNaaHEUg+vNH/Aa/NvEW5Jt/sAxDESGb+BFclkJTzQAOIkIoN37MY2WK5rdTvHkl03fYxD2A/9LqwvoimwaEHLNeiFRpKwfqrJXNTRouy53H8r52PWO1VbpDm0+jBebdX5OqZaHdYW2SNPE74lxC33x0lCjKuTrJDzGoN3BTK8J4J5XlcOBerNeMzbs4AZN0dZJL1Gp1TF+lb80adov/eXkynZ6eDOVnGpYktBge+3DuOWEEFQ0x+VRnAxjvArc+mhyaYVVh5J5YhPUAk4Dy0E1qlXeQgIqOtFb0dJZnflJ1kH6MmW7V1gtwWD0dSo5Vd4+i1PeuvkSEHz9MbSBrsOf6HDswLyBu;\n\t4:Lj4wh/njnJ1MpxjB8brPUYQHTfi5OKyryBLodvqTJpq/eZht+aD36uKB7evkI9KCZKcGmRJnTiknirGGS5WWxZ23YLWrt9o/uJpzxGQx+C9b0+x6e55/KHTXbH2l34ajZScYsrLNj3vU4VEB+9O5s5qnbXcKF7EwQcLHeaKam6AGygj4RpxwpQEPTKj4JClZzPwlaYXAeBa9/IRZUJpFAYXb7mxOEzpxPNVtz2xYxdkcguDXSFrTgoNfHC+zdxzSWgy1lsvh8cKhpjnvFmD0bA==",
            "=?us-ascii?Q?1; HE1PR0501MB2666;\n\t23:/3hfQIlc+6K4NuxLRKWH+wLiPh+0axBATMQc/IL?=\n\tokHYgzdEWrOsHTiRAObaCw+eVss8tPUHoHCJueRrVoHPOLTdNyf3VYMFi1wiJGJrBudiXn4IxB/sq8QcblwzspHRbBdDwjzKOUzk/ya+cZ6jtLge/8dQ+pWQ0XWyNlf/YywwLL8mOlcMKxaaggP9eJ2r14iy7A1sr+48YXnVvHKKpTXBQPfyEHNMTwivpM3AGNEeZYJERonKSzBTL7aHLROOyloBMLVlWVvjfVtNLxZtAG1+Gs0pVCdQjaSJ6Woy+Mxo2DSuuXrFdlgiE+9UyN6nfMZrLo+snYH1F9JKD9lBkbZguzkagPKybkJnLYhRGVk/pQegQTCWwYn0QuVJ3zsza46ao6qKZ68C3T98uaqr/A6cHlx2iBR9fXOAoEc4DPdav9tQuwHn5aD5hio3xx19FKnLmaKkNWubc4eB+cSLuLzheJpkITkuxlvSEHqmVwodJCT1ufyikdi1Rge41LoHeZqnsCEqHwwuh24N8a/7sh8I4vydWSiNxRFr/FGtAnL5Pr+mjzeVrJReg1zxl31pygczYaADnZFaiVvJx/bctZ1Ial9cLeK129tC+dDszoRFMUIgIKvaDkhWmrWdsP0IGqodrae8y527JF9/dkKS3/m/NCB3UQnFSXBxY4bL3OiCx1JREl5pvZ79nJdNVY7eisLy7s5k0rlffF2j6vmeN/daxUPfe4mmmrtd6P7519Y/nGTlbueRq6QL7RBWzLB/dBsTQ5xEK+PK+hBMXewOYrM7VOLwpdXmlWLhwnrn0WV7s+M3xWY+MWAtle5gO2xa36hLvodUyoBG+ufKmYza1T2OHUUVq/3WGu4Kgk0YwQ9CwSC7K4UaLZX/VPDczn2IOLBkDTJ1XTgBimsJalhEAmMjyLidb3wWACFLW6wyezBYyRYqEkZ0OjdrVPRzNyNzRzVBtGPKGh6ZRmWlpFS66fj0JGfPKR+IVt+wgeu0fA2s8AvG4w8l3vQe41dMEFAxvf8n//izlR60xq0sIAn+90yx3G82JZ1vbG9XxbqpvMI/UZXu5rMFobuRf8gNFCQJWMBT9J+3/uLcx9vbmjBpjMdG+eWnWSm6UK4Pva3hyLETSE/PgOs3nL9Q8HX9xtxfkr7kINosAqWoeF2mxRVIJ3HcFetNhyQ1twaUIvYLofNdePLkfl4MDSlPIpl1TCmFb",
            "1; HE1PR0501MB2666;\n\t6:9d39TMvuaGw6lB16RuVZ3aIINoPCz6ITuL/REz8FpvPy0Zft2fyCAm4U1YcxYQZaeQ7f70yg1Mhs1c8azR0nvD08CrpMkqUWOPC3GIbOomb44lDkN7I7UQL35iIMRoKlfehgxMQZFYkeYHB2M4S4T2cJP1ray0NeEueu5Lu5t00gGXZIs72KfMgrpx8MecRYn/VFFZ0cuyEy2szII+K3LE7KCUCBekLJN8JNxr5risfv2C8OZhFAxLwNJ0YHMX0AXqlw3I68XQx06Bt+P7DHudAi6PJIPKOxdO9CB0gLIwKl078ZaK8dOqZ0rK+U3ncpZlmD/hBOmNNmka6MmhhVM48U1qPpbzHs1tD5vQV78Qg=;\n\t5:4RHLU6xWaf8PwEoim55+gWipXhK8aewdma2jLagQk9zkcxqWhwdT/md9LFbms/eQa36p953p/I5Ua1SVzE4yBwlxNNF+OeE85uXOLqY4lGB54NddXUh3DoWpUVYWfNb5zjkAORmEdrXn62/TxKcWL8TAf3UEkkmy4ZdU3qAy2Pc=;\n\t24:/0mzsI0PZ5RH3uXhbSCrq6KivKpEaXMa1NRzQIH2C18ncPw3S/vc3ynJRa1wO1ZKadkScp/b4p7EdD9Iop06y5Uuyn4tCIsuaICqd9d7tiA=;\n\t7:vBEg1l8g5LTVlHIvyO6T/a7qug+jV4oFXN3uefWu7G49gMM8m1Ss9H35KZn4ct2HGLMarbcG3AMwU3+QY/PEyWO9sHu8fyu5R13jpKVOfMphsWaM+pu93A7tTZmaG2QW1x/UknU/dgh4qYgG0T9vSka54TlcHe/4/JLxYFqCyVNtKDM3mQJJ9922tsv4ipq4hPvZYOG3EUuxAN+yJomczKJXrL8IheDdvaNE/P4NIxkyRK5/jDVnBgzA76++zBLo"
        ],
        "X-MS-TrafficTypeDiagnostic": "HE1PR0501MB2666:",
        "X-Microsoft-Antispam-PRVS": "<HE1PR0501MB26668348A596FDC153DE2A31D2F30@HE1PR0501MB2666.eurprd05.prod.outlook.com>",
        "X-Exchange-Antispam-Report-Test": "UriScan:;",
        "X-Exchange-Antispam-Report-CFA-Test": "BCL:0; PCL:0;\n\tRULEID:(6040501)(2401047)(8121501046)(5005006)(3231101)(2400082)(944501161)(10201501046)(3002001)(93006095)(93001095)(6055026)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123562045)(20161123564045)(20161123560045)(6072148)(201708071742011);\n\tSRVR:HE1PR0501MB2666; BCL:0; PCL:0; RULEID:; SRVR:HE1PR0501MB2666; ",
        "X-Forefront-PRVS": "0577AD41D6",
        "X-Forefront-Antispam-Report": "SFV:NSPM;\n\tSFS:(10009020)(39380400002)(39860400002)(376002)(396003)(346002)(366004)(189003)(199004)(66066001)(16586007)(53936002)(47776003)(68736007)(5660300001)(59450400001)(105586002)(50226002)(106356001)(316002)(86362001)(69596002)(21086003)(97736004)(81156014)(8676002)(26005)(386003)(81166006)(52116002)(51416003)(6916009)(7696005)(2950100002)(76176011)(2906002)(4720700003)(8936002)(3846002)(36756003)(6116002)(6666003)(186003)(16526019)(33026002)(7736002)(25786009)(48376002)(55016002)(4326008)(478600001)(305945005)(50466002);\n\tDIR:OUT; SFP:1101; SCL:1; SRVR:HE1PR0501MB2666; H:mellanox.com; FPR:;\n\tSPF:None; \n\tPTR:InfoNoRecords; MX:1; A:1; LANG:en; ",
        "Received-SPF": "None (protection.outlook.com: mellanox.com does not designate\n\tpermitted sender hosts)",
        "SpamDiagnosticOutput": "1:99",
        "SpamDiagnosticMetadata": "NSPM",
        "X-OriginatorOrg": "Mellanox.com",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "08 Feb 2018 12:20:50.9695\n\t(UTC)",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "b0188757-7acc-45d3-80af-08d56eee650c",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "Hosted",
        "X-MS-Exchange-CrossTenant-Id": "a652971c-7d2e-4d9b-a6a4-d149256f461b",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "HE1PR0501MB2666",
        "Subject": "[dpdk-dev] [PATCH v4 2/2] net/failsafe: fix calling device during\n\tRMV events",
        "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://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": "<https://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: Ophir Munk <ophirmu@mellanox.com>\n\nThis commit prevents control path operations from failing after a sub\ndevice removal.\n\nFollowing are the failure steps:\n1. The physical device is removed due to change in one of PF parameters\n(e.g. MTU)\n2. The interrupt thread flags the device\n3. Within 2 seconds Interrupt thread initializes the actual device removal,\nthen every 2 seconds it tries to re-sync (plug in) the device. The trials\nfail as long as VF parameter mismatches the PF parameter.\n4. A control thread initiates a control operation on failsafe which\ninitiates this operation on the device.\n5. A race condition occurs between the control thread and interrupt thread\nwhen accessing the device data structures.\n\nThis commit mitigates the race condition in step 5.\n\nThis commit fixes failsafe criteria to determine when the device is removed\nsuch that it will avoid calling the sub device operations during that time\nand will only call them otherwise.\n\nFixes: a46f8d584eb8 (\"net/failsafe: add fail-safe PMD\")\nCc: stable@dpdk.org\n\nSigned-off-by: Ophir Munk <ophirmu@mellanox.com>\nSigned-off-by: Matan Azrad <matan@mellanox.com>\n---\n drivers/net/failsafe/failsafe_ether.c   |  2 ++\n drivers/net/failsafe/failsafe_flow.c    |  8 +++---\n drivers/net/failsafe/failsafe_ops.c     | 50 ++++++++++++++++++++-------------\n drivers/net/failsafe/failsafe_private.h | 26 ++++++++++++++---\n 4 files changed, 58 insertions(+), 28 deletions(-)",
    "diff": "diff --git a/drivers/net/failsafe/failsafe_ether.c b/drivers/net/failsafe/failsafe_ether.c\nindex 4c6e938..ca42376 100644\n--- a/drivers/net/failsafe/failsafe_ether.c\n+++ b/drivers/net/failsafe/failsafe_ether.c\n@@ -377,6 +377,8 @@\n \t\t\t\t      i);\n \t\t\t\tgoto err_remove;\n \t\t\t}\n+\t\t\tif (PRIV(dev)->state < DEV_STARTED)\n+\t\t\t\tsdev->remove = 0;\n \t\t}\n \t}\n \t/*\ndiff --git a/drivers/net/failsafe/failsafe_flow.c b/drivers/net/failsafe/failsafe_flow.c\nindex 4d18e8e..d4a69cf 100644\n--- a/drivers/net/failsafe/failsafe_flow.c\n+++ b/drivers/net/failsafe/failsafe_flow.c\n@@ -55,7 +55,7 @@\n \tuint8_t i;\n \tint ret;\n \n-\tFOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) {\n+\tFOREACH_SUBDEV_STATE_SAFE(sdev, i, dev, DEV_ACTIVE) {\n \t\tDEBUG(\"Calling rte_flow_validate on sub_device %d\", i);\n \t\tret = rte_flow_validate(PORT_ID(sdev),\n \t\t\t\tattr, patterns, actions, error);\n@@ -80,7 +80,7 @@\n \tuint8_t i;\n \n \tflow = fs_flow_allocate(attr, patterns, actions);\n-\tFOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) {\n+\tFOREACH_SUBDEV_STATE_SAFE(sdev, i, dev, DEV_ACTIVE) {\n \t\tflow->flows[i] = rte_flow_create(PORT_ID(sdev),\n \t\t\t\tattr, patterns, actions, error);\n \t\tif (flow->flows[i] == NULL && fs_err(sdev, -rte_errno)) {\n@@ -115,7 +115,7 @@\n \t\treturn -EINVAL;\n \t}\n \tret = 0;\n-\tFOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) {\n+\tFOREACH_SUBDEV_STATE_SAFE(sdev, i, dev, DEV_ACTIVE) {\n \t\tint local_ret;\n \n \t\tif (flow->flows[i] == NULL)\n@@ -144,7 +144,7 @@\n \tuint8_t i;\n \tint ret;\n \n-\tFOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) {\n+\tFOREACH_SUBDEV_STATE_SAFE(sdev, i, dev, DEV_ACTIVE) {\n \t\tDEBUG(\"Calling rte_flow_flush on sub_device %d\", i);\n \t\tret = rte_flow_flush(PORT_ID(sdev), error);\n \t\tif ((ret = fs_err(sdev, ret))) {\ndiff --git a/drivers/net/failsafe/failsafe_ops.c b/drivers/net/failsafe/failsafe_ops.c\nindex 7a67e16..3312cb2 100644\n--- a/drivers/net/failsafe/failsafe_ops.c\n+++ b/drivers/net/failsafe/failsafe_ops.c\n@@ -131,7 +131,6 @@\n \t\t\tdev->data->dev_conf.intr_conf.lsc = 0;\n \t\t}\n \t\tDEBUG(\"Configuring sub-device %d\", i);\n-\t\tsdev->remove = 0;\n \t\tret = rte_eth_dev_configure(PORT_ID(sdev),\n \t\t\t\t\tdev->data->nb_rx_queues,\n \t\t\t\t\tdev->data->nb_tx_queues,\n@@ -182,6 +181,9 @@\n \tFOREACH_SUBDEV(sdev, i, dev) {\n \t\tif (sdev->state != DEV_ACTIVE)\n \t\t\tcontinue;\n+\t\tif (sdev->remove == 1 && PRIV(dev)->state < DEV_STARTED)\n+\t\t\t/* Application shouldn't start removed sub-devices. */\n+\t\t\tcontinue;\n \t\tDEBUG(\"Starting sub_device %d\", i);\n \t\tret = rte_eth_dev_start(PORT_ID(sdev));\n \t\tif (ret) {\n@@ -197,6 +199,7 @@\n \t\t\treturn ret;\n \t\t}\n \t\tsdev->state = DEV_STARTED;\n+\t\tsdev->remove = 0;\n \t}\n \tif (PRIV(dev)->state < DEV_STARTED)\n \t\tPRIV(dev)->state = DEV_STARTED;\n@@ -211,7 +214,7 @@\n \tuint8_t i;\n \n \tPRIV(dev)->state = DEV_STARTED - 1;\n-\tFOREACH_SUBDEV_STATE(sdev, i, dev, DEV_STARTED) {\n+\tFOREACH_SUBDEV_STATE_SAFE(sdev, i, dev, DEV_STARTED) {\n \t\trte_eth_dev_stop(PORT_ID(sdev));\n \t\tfailsafe_rx_intr_uninstall_subdevice(sdev);\n \t\tsdev->state = DEV_STARTED - 1;\n@@ -226,7 +229,7 @@\n \tuint8_t i;\n \tint ret;\n \n-\tFOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) {\n+\tFOREACH_SUBDEV_STATE_SAFE(sdev, i, dev, DEV_ACTIVE) {\n \t\tDEBUG(\"Calling rte_eth_dev_set_link_up on sub_device %d\", i);\n \t\tret = rte_eth_dev_set_link_up(PORT_ID(sdev));\n \t\tif ((ret = fs_err(sdev, ret))) {\n@@ -245,7 +248,7 @@\n \tuint8_t i;\n \tint ret;\n \n-\tFOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) {\n+\tFOREACH_SUBDEV_STATE_SAFE(sdev, i, dev, DEV_ACTIVE) {\n \t\tDEBUG(\"Calling rte_eth_dev_set_link_down on sub_device %d\", i);\n \t\tret = rte_eth_dev_set_link_down(PORT_ID(sdev));\n \t\tif ((ret = fs_err(sdev, ret))) {\n@@ -265,8 +268,15 @@\n \tuint8_t i;\n \n \tfailsafe_hotplug_alarm_cancel(dev);\n-\tif (PRIV(dev)->state == DEV_STARTED)\n+\tif (PRIV(dev)->state == DEV_STARTED) {\n+\t\t/*\n+\t\t * Clean remove flags to allow stop for all sub-devices because\n+\t\t * there is not hot-plug alarm to stop the removed sub-devices.\n+\t\t */\n+\t\tFOREACH_SUBDEV_STATE(sdev, i, dev, DEV_STARTED)\n+\t\t\tsdev->remove = 0;\n \t\tdev->dev_ops->dev_stop(dev);\n+\t}\n \tPRIV(dev)->state = DEV_ACTIVE - 1;\n \tFOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) {\n \t\tDEBUG(\"Closing sub_device %d\", i);\n@@ -417,7 +427,7 @@\n \t\treturn -rte_errno;\n \t}\n \trxq->enable_events = 1;\n-\tFOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) {\n+\tFOREACH_SUBDEV_STATE_SAFE(sdev, i, dev, DEV_ACTIVE) {\n \t\tret = rte_eth_dev_rx_intr_enable(PORT_ID(sdev), idx);\n \t\tret = fs_err(sdev, ret);\n \t\tif (ret)\n@@ -448,7 +458,7 @@\n \t\treturn -rte_errno;\n \t}\n \trxq->enable_events = 0;\n-\tFOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) {\n+\tFOREACH_SUBDEV_STATE_SAFE(sdev, i, dev, DEV_ACTIVE) {\n \t\tret = rte_eth_dev_rx_intr_disable(PORT_ID(sdev), idx);\n \t\tret = fs_err(sdev, ret);\n \t\tif (ret)\n@@ -587,7 +597,7 @@\n \tstruct sub_device *sdev;\n \tuint8_t i;\n \n-\tFOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE)\n+\tFOREACH_SUBDEV_STATE_SAFE(sdev, i, dev, DEV_ACTIVE)\n \t\trte_eth_promiscuous_enable(PORT_ID(sdev));\n }\n \n@@ -597,7 +607,7 @@\n \tstruct sub_device *sdev;\n \tuint8_t i;\n \n-\tFOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE)\n+\tFOREACH_SUBDEV_STATE_SAFE(sdev, i, dev, DEV_ACTIVE)\n \t\trte_eth_promiscuous_disable(PORT_ID(sdev));\n }\n \n@@ -607,7 +617,7 @@\n \tstruct sub_device *sdev;\n \tuint8_t i;\n \n-\tFOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE)\n+\tFOREACH_SUBDEV_STATE_SAFE(sdev, i, dev, DEV_ACTIVE)\n \t\trte_eth_allmulticast_enable(PORT_ID(sdev));\n }\n \n@@ -617,7 +627,7 @@\n \tstruct sub_device *sdev;\n \tuint8_t i;\n \n-\tFOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE)\n+\tFOREACH_SUBDEV_STATE_SAFE(sdev, i, dev, DEV_ACTIVE)\n \t\trte_eth_allmulticast_disable(PORT_ID(sdev));\n }\n \n@@ -629,7 +639,7 @@\n \tuint8_t i;\n \tint ret;\n \n-\tFOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) {\n+\tFOREACH_SUBDEV_STATE_SAFE(sdev, i, dev, DEV_ACTIVE) {\n \t\tDEBUG(\"Calling link_update on sub_device %d\", i);\n \t\tret = (SUBOPS(sdev, link_update))(ETH(sdev), wait_to_complete);\n \t\tif (ret && ret != -1 && sdev->remove == 0 &&\n@@ -692,7 +702,7 @@\n \tstruct sub_device *sdev;\n \tuint8_t i;\n \n-\tFOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) {\n+\tFOREACH_SUBDEV_STATE_SAFE(sdev, i, dev, DEV_ACTIVE) {\n \t\trte_eth_stats_reset(PORT_ID(sdev));\n \t\tmemset(&sdev->stats_snapshot, 0, sizeof(struct rte_eth_stats));\n \t}\n@@ -797,7 +807,7 @@\n \tuint8_t i;\n \tint ret;\n \n-\tFOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) {\n+\tFOREACH_SUBDEV_STATE_SAFE(sdev, i, dev, DEV_ACTIVE) {\n \t\tDEBUG(\"Calling rte_eth_dev_set_mtu on sub_device %d\", i);\n \t\tret = rte_eth_dev_set_mtu(PORT_ID(sdev), mtu);\n \t\tif ((ret = fs_err(sdev, ret))) {\n@@ -816,7 +826,7 @@\n \tuint8_t i;\n \tint ret;\n \n-\tFOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) {\n+\tFOREACH_SUBDEV_STATE_SAFE(sdev, i, dev, DEV_ACTIVE) {\n \t\tDEBUG(\"Calling rte_eth_dev_vlan_filter on sub_device %d\", i);\n \t\tret = rte_eth_dev_vlan_filter(PORT_ID(sdev), vlan_id, on);\n \t\tif ((ret = fs_err(sdev, ret))) {\n@@ -850,7 +860,7 @@\n \tuint8_t i;\n \tint ret;\n \n-\tFOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) {\n+\tFOREACH_SUBDEV_STATE_SAFE(sdev, i, dev, DEV_ACTIVE) {\n \t\tDEBUG(\"Calling rte_eth_dev_flow_ctrl_set on sub_device %d\", i);\n \t\tret = rte_eth_dev_flow_ctrl_set(PORT_ID(sdev), fc_conf);\n \t\tif ((ret = fs_err(sdev, ret))) {\n@@ -871,7 +881,7 @@\n \t/* No check: already done within the rte_eth_dev_mac_addr_remove\n \t * call for the fail-safe device.\n \t */\n-\tFOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE)\n+\tFOREACH_SUBDEV_STATE_SAFE(sdev, i, dev, DEV_ACTIVE)\n \t\trte_eth_dev_mac_addr_remove(PORT_ID(sdev),\n \t\t\t\t&dev->data->mac_addrs[index]);\n \tPRIV(dev)->mac_addr_pool[index] = 0;\n@@ -888,7 +898,7 @@\n \tuint8_t i;\n \n \tRTE_ASSERT(index < FAILSAFE_MAX_ETHADDR);\n-\tFOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) {\n+\tFOREACH_SUBDEV_STATE_SAFE(sdev, i, dev, DEV_ACTIVE) {\n \t\tret = rte_eth_dev_mac_addr_add(PORT_ID(sdev), mac_addr, vmdq);\n \t\tif ((ret = fs_err(sdev, ret))) {\n \t\t\tERROR(\"Operation rte_eth_dev_mac_addr_add failed for sub_device %\"\n@@ -910,7 +920,7 @@\n \tstruct sub_device *sdev;\n \tuint8_t i;\n \n-\tFOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE)\n+\tFOREACH_SUBDEV_STATE_SAFE(sdev, i, dev, DEV_ACTIVE)\n \t\trte_eth_dev_default_mac_addr_set(PORT_ID(sdev), mac_addr);\n }\n \n@@ -929,7 +939,7 @@\n \t\t*(const void **)arg = &fs_flow_ops;\n \t\treturn 0;\n \t}\n-\tFOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) {\n+\tFOREACH_SUBDEV_STATE_SAFE(sdev, i, dev, DEV_ACTIVE) {\n \t\tDEBUG(\"Calling rte_eth_dev_filter_ctrl on sub_device %d\", i);\n \t\tret = rte_eth_dev_filter_ctrl(PORT_ID(sdev), type, op, arg);\n \t\tif ((ret = fs_err(sdev, ret))) {\ndiff --git a/drivers/net/failsafe/failsafe_private.h b/drivers/net/failsafe/failsafe_private.h\nindex f3be152..0f3b543 100644\n--- a/drivers/net/failsafe/failsafe_private.h\n+++ b/drivers/net/failsafe/failsafe_private.h\n@@ -250,10 +250,23 @@ int failsafe_eth_lsc_event_callback(uint16_t port_id,\n  * dev:   (struct rte_eth_dev *), fail-safe ethdev\n  * state: (enum dev_state), minimum acceptable device state\n  */\n+\n #define FOREACH_SUBDEV_STATE(s, i, dev, state)\t\t\\\n-\tfor (s = fs_find_next((dev), 0, state, &i);\t\\\n+\tfor (s = fs_find_next((dev), 0, state, 0, &i);\t\\\n \t     s != NULL;\t\t\t\t\t\\\n-\t     s = fs_find_next((dev), i + 1, state, &i))\n+\t     s = fs_find_next((dev), i + 1, state, 0, &i))\n+\n+/**\n+ * Stateful iterator construct over fail-safe safe sub-devices:\n+ * s:     (struct sub_device *), iterator\n+ * i:     (uint8_t), increment\n+ * dev:   (struct rte_eth_dev *), fail-safe ethdev\n+ * state: (enum dev_state), minimum acceptable device state\n+ */\n+#define FOREACH_SUBDEV_STATE_SAFE(s, i, dev, state)\t\t\\\n+\tfor (s = fs_find_next((dev), 0, state, 1, &i);\t\t\\\n+\t     s != NULL;\t\t\t\t\t\t\\\n+\t     s = fs_find_next((dev), i + 1, state, 1, &i))\n \n /**\n  * Iterator construct over fail-safe sub-devices:\n@@ -328,6 +341,7 @@ int failsafe_eth_lsc_event_callback(uint16_t port_id,\n fs_find_next(struct rte_eth_dev *dev,\n \t     uint8_t sid,\n \t     enum dev_state min_state,\n+\t     uint8_t check_remove,\n \t     uint8_t *sid_out)\n {\n \tstruct sub_device *subs;\n@@ -336,8 +350,12 @@ int failsafe_eth_lsc_event_callback(uint16_t port_id,\n \tsubs = PRIV(dev)->subs;\n \ttail = PRIV(dev)->subs_tail;\n \twhile (sid < tail) {\n-\t\tif (subs[sid].state >= min_state)\n-\t\t\tbreak;\n+\t\tif (subs[sid].state >= min_state) {\n+\t\t\tif (check_remove == 0)\n+\t\t\t\tbreak;\n+\t\t\tif (PRIV(dev)->subs[sid].remove == 0)\n+\t\t\t\tbreak;\n+\t\t}\n \t\tsid++;\n \t}\n \t*sid_out = sid;\n",
    "prefixes": [
        "dpdk-dev",
        "v4",
        "2/2"
    ]
}