Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/16931/?format=api
https://patches.dpdk.org/api/patches/16931/?format=api", "web_url": "https://patches.dpdk.org/project/dpdk/patch/1478250651-37307-2-git-send-email-qiming.yang@intel.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": "<1478250651-37307-2-git-send-email-qiming.yang@intel.com>", "list_archive_url": "https://inbox.dpdk.org/dev/1478250651-37307-2-git-send-email-qiming.yang@intel.com", "date": "2016-11-04T09:10:51", "name": "[dpdk-dev,v4,2/2] net/i40e: fix VF bonded device link down", "commit_ref": null, "pull_url": null, "state": "accepted", "archived": true, "hash": "112a95138d5b04b393649fc0dbfcfe85f957de9f", "submitter": { "id": 522, "url": "https://patches.dpdk.org/api/people/522/?format=api", "name": "Qiming Yang", "email": "qiming.yang@intel.com" }, "delegate": { "id": 10, "url": "https://patches.dpdk.org/api/users/10/?format=api", "username": "bruce", "first_name": "Bruce", "last_name": "Richardson", "email": "bruce.richardson@intel.com" }, "mbox": "https://patches.dpdk.org/project/dpdk/patch/1478250651-37307-2-git-send-email-qiming.yang@intel.com/mbox/", "series": [], "comments": "https://patches.dpdk.org/api/patches/16931/comments/", "check": "warning", "checks": "https://patches.dpdk.org/api/patches/16931/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 59D0547CD;\n\tFri, 4 Nov 2016 10:14:18 +0100 (CET)", "from mga07.intel.com (mga07.intel.com [134.134.136.100])\n\tby dpdk.org (Postfix) with ESMTP id 65BFB293C\n\tfor <dev@dpdk.org>; Fri, 4 Nov 2016 10:13:48 +0100 (CET)", "from orsmga004.jf.intel.com ([10.7.209.38])\n\tby orsmga105.jf.intel.com with ESMTP; 04 Nov 2016 02:13:47 -0700", "from dpdk1.bj.intel.com ([172.16.182.84])\n\tby orsmga004.jf.intel.com with ESMTP; 04 Nov 2016 02:13:46 -0700" ], "X-ExtLoop1": "1", "X-IronPort-AV": "E=Sophos;i=\"5.31,442,1473145200\"; d=\"scan'208\";a=\"27711675\"", "From": "Qiming Yang <qiming.yang@intel.com>", "To": "dev@dpdk.org", "Cc": "jingjing.wu@intel.com, bruce.richardson@intel.com,\n\tQiming Yang <qiming.yang@intel.com>", "Date": "Fri, 4 Nov 2016 17:10:51 +0800", "Message-Id": "<1478250651-37307-2-git-send-email-qiming.yang@intel.com>", "X-Mailer": "git-send-email 2.5.5", "In-Reply-To": "<1478250651-37307-1-git-send-email-qiming.yang@intel.com>", "References": "<1477628339-5816-2-git-send-email-qiming.yang@intel.com>\n\t<1478250651-37307-1-git-send-email-qiming.yang@intel.com>", "Subject": "[dpdk-dev] [PATCH v4 2/2] net/i40e: fix VF bonded device link down", "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": "If VF device is used as slave of a bond device, it will be polled\nperiodically through alarm. Interrupt is involved here. And then\nVF will send I40E_VIRTCHNL_OP_GET_LINK_STAT message to\nPF to query the status. The response is handled by interrupt\ncallback. Interrupt is involved here again. That's why bond\ndevice cannot bring up.\n\nThis patch removes I40E_VIRTCHNL_OP_GET_LINK_STAT\nmessage. Link status in VF driver will be updated when PF driver\nnotify it, and VF stores this link status locally. VF driver just\nreturns the local status when being required.\n\nFixes: 4861cde46116 (\"i40e: new poll mode driver\")\n\nSigned-off-by: Qiming Yang <qiming.yang@intel.com>\nAcked-by: Jingjing Wu <jingjing.wu@intel.com>\n---\n v3 changes:\n * resolved the conflict with other changes, rework based\n on version: 16.11-rc2\n v4 changes:\n *fixed compilation error with icc\n\n drivers/net/i40e/i40e_ethdev.c | 22 ++++++++++-\n drivers/net/i40e/i40e_ethdev.h | 4 +-\n drivers/net/i40e/i40e_ethdev_vf.c | 81 +++++++++++++--------------------------\n drivers/net/i40e/i40e_pf.c | 33 ++++++++--------\n drivers/net/i40e/i40e_pf.h | 3 +-\n 5 files changed, 67 insertions(+), 76 deletions(-)", "diff": "diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c\nindex 078c581..fbaec23 100644\n--- a/drivers/net/i40e/i40e_ethdev.c\n+++ b/drivers/net/i40e/i40e_ethdev.c\n@@ -5441,6 +5441,24 @@ i40e_dev_handle_vfr_event(struct rte_eth_dev *dev)\n }\n \n static void\n+i40e_notify_all_vfs_link_status(struct rte_eth_dev *dev)\n+{\n+\tstruct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);\n+\tstruct i40e_virtchnl_pf_event event;\n+\tint i;\n+\n+\tevent.event = I40E_VIRTCHNL_EVENT_LINK_CHANGE;\n+\tevent.event_data.link_event.link_status =\n+\t\tdev->data->dev_link.link_status;\n+\tevent.event_data.link_event.link_speed =\n+\t\t(enum i40e_aq_link_speed)dev->data->dev_link.link_speed;\n+\n+\tfor (i = 0; i < pf->vf_num; i++)\n+\t\ti40e_pf_host_send_msg_to_vf(&pf->vfs[i], I40E_VIRTCHNL_OP_EVENT,\n+\t\t\t\tI40E_SUCCESS, (uint8_t *)&event, sizeof(event));\n+}\n+\n+static void\n i40e_dev_handle_aq_msg(struct rte_eth_dev *dev)\n {\n \tstruct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n@@ -5478,9 +5496,11 @@ i40e_dev_handle_aq_msg(struct rte_eth_dev *dev)\n \t\t\tbreak;\n \t\tcase i40e_aqc_opc_get_link_status:\n \t\t\tret = i40e_dev_link_update(dev, 0);\n-\t\t\tif (!ret)\n+\t\t\tif (!ret) {\n+\t\t\t\ti40e_notify_all_vfs_link_status(dev);\n \t\t\t\t_rte_eth_dev_callback_process(dev,\n \t\t\t\t\tRTE_ETH_EVENT_INTR_LSC, NULL);\n+\t\t\t}\n \t\t\tbreak;\n \t\tdefault:\n \t\t\tPMD_DRV_LOG(ERR, \"Request %u is not supported yet\",\ndiff --git a/drivers/net/i40e/i40e_ethdev.h b/drivers/net/i40e/i40e_ethdev.h\nindex 24b8580..298cef4 100644\n--- a/drivers/net/i40e/i40e_ethdev.h\n+++ b/drivers/net/i40e/i40e_ethdev.h\n@@ -609,7 +609,9 @@ int i40e_hash_filter_inset_select(struct i40e_hw *hw,\n \t\t\t struct rte_eth_input_set_conf *conf);\n int i40e_fdir_filter_inset_select(struct i40e_pf *pf,\n \t\t\t struct rte_eth_input_set_conf *conf);\n-\n+int i40e_pf_host_send_msg_to_vf(struct i40e_pf_vf *vf, uint32_t opcode,\n+\t\t\t\tuint32_t retval, uint8_t *msg,\n+\t\t\t\tuint16_t msglen);\n void i40e_rxq_info_get(struct rte_eth_dev *dev, uint16_t queue_id,\n \tstruct rte_eth_rxq_info *qinfo);\n void i40e_txq_info_get(struct rte_eth_dev *dev, uint16_t queue_id,\ndiff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c\nindex 4b835cb..aa306d6 100644\n--- a/drivers/net/i40e/i40e_ethdev_vf.c\n+++ b/drivers/net/i40e/i40e_ethdev_vf.c\n@@ -126,8 +126,6 @@ static void i40evf_dev_promiscuous_enable(struct rte_eth_dev *dev);\n static void i40evf_dev_promiscuous_disable(struct rte_eth_dev *dev);\n static void i40evf_dev_allmulticast_enable(struct rte_eth_dev *dev);\n static void i40evf_dev_allmulticast_disable(struct rte_eth_dev *dev);\n-static int i40evf_get_link_status(struct rte_eth_dev *dev,\n-\t\t\t\t struct rte_eth_link *link);\n static int i40evf_init_vlan(struct rte_eth_dev *dev);\n static int i40evf_dev_rx_queue_start(struct rte_eth_dev *dev,\n \t\t\t\t uint16_t rx_queue_id);\n@@ -1084,31 +1082,6 @@ i40evf_del_vlan(struct rte_eth_dev *dev, uint16_t vlanid)\n \treturn err;\n }\n \n-static int\n-i40evf_get_link_status(struct rte_eth_dev *dev, struct rte_eth_link *link)\n-{\n-\tstruct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);\n-\tint err;\n-\tstruct vf_cmd_info args;\n-\tstruct rte_eth_link *new_link;\n-\n-\targs.ops = (enum i40e_virtchnl_ops)I40E_VIRTCHNL_OP_GET_LINK_STAT;\n-\targs.in_args = NULL;\n-\targs.in_args_size = 0;\n-\targs.out_buffer = vf->aq_resp;\n-\targs.out_size = I40E_AQ_BUF_SZ;\n-\terr = i40evf_execute_vf_cmd(dev, &args);\n-\tif (err) {\n-\t\tPMD_DRV_LOG(ERR, \"fail to execute command OP_GET_LINK_STAT\");\n-\t\treturn err;\n-\t}\n-\n-\tnew_link = (struct rte_eth_link *)args.out_buffer;\n-\t(void)rte_memcpy(link, new_link, sizeof(*link));\n-\n-\treturn 0;\n-}\n-\n static const struct rte_pci_id pci_id_i40evf_map[] = {\n \t{ RTE_PCI_DEVICE(I40E_INTEL_VENDOR_ID, I40E_DEV_ID_VF) },\n \t{ RTE_PCI_DEVICE(I40E_INTEL_VENDOR_ID, I40E_DEV_ID_VF_HV) },\n@@ -2146,35 +2119,33 @@ i40evf_dev_link_update(struct rte_eth_dev *dev,\n \t * DPDK pf host provide interfacet to acquire link status\n \t * while Linux driver does not\n \t */\n-\tif (vf->version_major == I40E_DPDK_VERSION_MAJOR)\n-\t\ti40evf_get_link_status(dev, &new_link);\n-\telse {\n-\t\t/* Linux driver PF host */\n-\t\tswitch (vf->link_speed) {\n-\t\tcase I40E_LINK_SPEED_100MB:\n-\t\t\tnew_link.link_speed = ETH_SPEED_NUM_100M;\n-\t\t\tbreak;\n-\t\tcase I40E_LINK_SPEED_1GB:\n-\t\t\tnew_link.link_speed = ETH_SPEED_NUM_1G;\n-\t\t\tbreak;\n-\t\tcase I40E_LINK_SPEED_10GB:\n-\t\t\tnew_link.link_speed = ETH_SPEED_NUM_10G;\n-\t\t\tbreak;\n-\t\tcase I40E_LINK_SPEED_20GB:\n-\t\t\tnew_link.link_speed = ETH_SPEED_NUM_20G;\n-\t\t\tbreak;\n-\t\tcase I40E_LINK_SPEED_40GB:\n-\t\t\tnew_link.link_speed = ETH_SPEED_NUM_40G;\n-\t\t\tbreak;\n-\t\tdefault:\n-\t\t\tnew_link.link_speed = ETH_SPEED_NUM_100M;\n-\t\t\tbreak;\n-\t\t}\n-\t\t/* full duplex only */\n-\t\tnew_link.link_duplex = ETH_LINK_FULL_DUPLEX;\n-\t\tnew_link.link_status = vf->link_up ? ETH_LINK_UP :\n-\t\t\t\t\t\t ETH_LINK_DOWN;\n+\n+\t/* Linux driver PF host */\n+\tswitch (vf->link_speed) {\n+\tcase I40E_LINK_SPEED_100MB:\n+\t\tnew_link.link_speed = ETH_SPEED_NUM_100M;\n+\t\tbreak;\n+\tcase I40E_LINK_SPEED_1GB:\n+\t\tnew_link.link_speed = ETH_SPEED_NUM_1G;\n+\t\tbreak;\n+\tcase I40E_LINK_SPEED_10GB:\n+\t\tnew_link.link_speed = ETH_SPEED_NUM_10G;\n+\t\tbreak;\n+\tcase I40E_LINK_SPEED_20GB:\n+\t\tnew_link.link_speed = ETH_SPEED_NUM_20G;\n+\t\tbreak;\n+\tcase I40E_LINK_SPEED_40GB:\n+\t\tnew_link.link_speed = ETH_SPEED_NUM_40G;\n+\t\tbreak;\n+\tdefault:\n+\t\tnew_link.link_speed = ETH_SPEED_NUM_100M;\n+\t\tbreak;\n \t}\n+\t/* full duplex only */\n+\tnew_link.link_duplex = ETH_LINK_FULL_DUPLEX;\n+\tnew_link.link_status = vf->link_up ? ETH_LINK_UP :\n+\t\t\t\t\t ETH_LINK_DOWN;\n+\n \ti40evf_dev_atomic_write_link_status(dev, &new_link);\n \n \treturn 0;\ndiff --git a/drivers/net/i40e/i40e_pf.c b/drivers/net/i40e/i40e_pf.c\nindex d5b2d45..ddfc140 100644\n--- a/drivers/net/i40e/i40e_pf.c\n+++ b/drivers/net/i40e/i40e_pf.c\n@@ -250,7 +250,7 @@ i40e_pf_host_vf_reset(struct i40e_pf_vf *vf, bool do_hw_reset)\n \treturn ret;\n }\n \n-static int\n+int\n i40e_pf_host_send_msg_to_vf(struct i40e_pf_vf *vf,\n \t\t\t uint32_t opcode,\n \t\t\t uint32_t retval,\n@@ -847,18 +847,6 @@ i40e_pf_host_process_cmd_get_stats(struct i40e_pf_vf *vf)\n \treturn I40E_SUCCESS;\n }\n \n-static void\n-i40e_pf_host_process_cmd_get_link_status(struct i40e_pf_vf *vf)\n-{\n-\tstruct rte_eth_dev *dev = I40E_VSI_TO_ETH_DEV(vf->pf->main_vsi);\n-\n-\t/* Update link status first to acquire latest link change */\n-\ti40e_dev_link_update(dev, 1);\n-\ti40e_pf_host_send_msg_to_vf(vf, I40E_VIRTCHNL_OP_GET_LINK_STAT,\n-\t\tI40E_SUCCESS, (uint8_t *)&dev->data->dev_link,\n-\t\t\t\tsizeof(struct rte_eth_link));\n-}\n-\n static int\n i40e_pf_host_process_cmd_cfg_vlan_offload(\n \t\t\t\t\tstruct i40e_pf_vf *vf,\n@@ -909,6 +897,20 @@ send_msg:\n \treturn ret;\n }\n \n+static void\n+i40e_notify_vf_link_status(struct rte_eth_dev *dev, struct i40e_pf_vf *vf)\n+{\n+\tstruct i40e_virtchnl_pf_event event;\n+\n+\tevent.event = I40E_VIRTCHNL_EVENT_LINK_CHANGE;\n+\tevent.event_data.link_event.link_status =\n+\t\tdev->data->dev_link.link_status;\n+\tevent.event_data.link_event.link_speed =\n+\t\t(enum i40e_aq_link_speed)dev->data->dev_link.link_speed;\n+\ti40e_pf_host_send_msg_to_vf(vf, I40E_VIRTCHNL_OP_EVENT,\n+\t\tI40E_SUCCESS, (uint8_t *)&event, sizeof(event));\n+}\n+\n void\n i40e_pf_host_handle_vf_msg(struct rte_eth_dev *dev,\n \t\t\t uint16_t abs_vf_id, uint32_t opcode,\n@@ -964,6 +966,7 @@ i40e_pf_host_handle_vf_msg(struct rte_eth_dev *dev,\n \tcase I40E_VIRTCHNL_OP_ENABLE_QUEUES:\n \t\tPMD_DRV_LOG(INFO, \"OP_ENABLE_QUEUES received\");\n \t\ti40e_pf_host_process_cmd_enable_queues(vf, msg, msglen);\n+\t\ti40e_notify_vf_link_status(dev, vf);\n \t\tbreak;\n \tcase I40E_VIRTCHNL_OP_DISABLE_QUEUES:\n \t\tPMD_DRV_LOG(INFO, \"OP_DISABLE_QUEUE received\");\n@@ -993,10 +996,6 @@ i40e_pf_host_handle_vf_msg(struct rte_eth_dev *dev,\n \t\tPMD_DRV_LOG(INFO, \"OP_GET_STATS received\");\n \t\ti40e_pf_host_process_cmd_get_stats(vf);\n \t\tbreak;\n-\tcase I40E_VIRTCHNL_OP_GET_LINK_STAT:\n-\t\tPMD_DRV_LOG(INFO, \"OP_GET_LINK_STAT received\");\n-\t\ti40e_pf_host_process_cmd_get_link_status(vf);\n-\t\tbreak;\n \tcase I40E_VIRTCHNL_OP_CFG_VLAN_OFFLOAD:\n \t\tPMD_DRV_LOG(INFO, \"OP_CFG_VLAN_OFFLOAD received\");\n \t\ti40e_pf_host_process_cmd_cfg_vlan_offload(vf, msg, msglen);\ndiff --git a/drivers/net/i40e/i40e_pf.h b/drivers/net/i40e/i40e_pf.h\nindex 9c01829..cddc45c 100644\n--- a/drivers/net/i40e/i40e_pf.h\n+++ b/drivers/net/i40e/i40e_pf.h\n@@ -59,9 +59,8 @@ enum i40e_virtchnl_ops_dpdk {\n \t * Keep some gap between Linux PF commands and\n \t * DPDK PF extended commands.\n \t */\n-\tI40E_VIRTCHNL_OP_GET_LINK_STAT = I40E_VIRTCHNL_OP_VERSION +\n+\tI40E_VIRTCHNL_OP_CFG_VLAN_OFFLOAD = I40E_VIRTCHNL_OP_VERSION +\n \t\t\t\t\t\tI40E_DPDK_OFFSET,\n-\tI40E_VIRTCHNL_OP_CFG_VLAN_OFFLOAD,\n \tI40E_VIRTCHNL_OP_CFG_VLAN_PVID,\n \tI40E_VIRTCHNL_OP_CONFIG_VSI_QUEUES_EXT,\n };\n", "prefixes": [ "dpdk-dev", "v4", "2/2" ] }{ "id": 16931, "url": "