[{"id":1772707,"web_url":"http://patchwork.ozlabs.org/comment/1772707/","msgid":"<024e7fb3-9b53-f4f2-3901-38a63c47d76c@huawei.com>","list_archive_url":null,"date":"2017-09-21T11:19:06","subject":"Re: [PATCH net 2/4] net:ethernet:aquantia: Fix Tx queue hangups","submitter":{"id":71804,"url":"http://patchwork.ozlabs.org/api/people/71804/","name":"Yunsheng Lin","email":"linyunsheng@huawei.com"},"content":"Hi, Igor\n\nOn 2017/9/21 18:53, Igor Russkikh wrote:\n> Driver did a poor job in managing its Tx queues: Sometimes it could stop\n> tx queues due to link down condition in aq_nic_xmit - but never waked up\n> them. That led to Tx path total suspend.\n> This patch fixes this and improves generic queue management:\n> - introduces queue restart counter\n> - uses generic netif_ interface to disable and enable tx path\n> - refactors link up/down condition and introduces dmesg log event when\n>   link changes.\n> - introduces new constant for minimum descriptors count required for queue\n>   wakeup\n> \n> Signed-off-by: Pavel Belous <Pavel.Belous@aquantia.com>\n> Signed-off-by: Igor Russkikh <igor.russkikh@aquantia.com>\n> ---\n>  drivers/net/ethernet/aquantia/atlantic/aq_cfg.h  |  4 ++\n>  drivers/net/ethernet/aquantia/atlantic/aq_nic.c  | 91 +++++++++++-------------\n>  drivers/net/ethernet/aquantia/atlantic/aq_nic.h  |  2 -\n>  drivers/net/ethernet/aquantia/atlantic/aq_ring.c | 26 +++++++\n>  drivers/net/ethernet/aquantia/atlantic/aq_ring.h |  4 ++\n>  drivers/net/ethernet/aquantia/atlantic/aq_vec.c  |  8 +--\n>  6 files changed, 76 insertions(+), 59 deletions(-)\n> \n> diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_cfg.h b/drivers/net/ethernet/aquantia/atlantic/aq_cfg.h\n> index 2149864..0fdaaa6 100644\n> --- a/drivers/net/ethernet/aquantia/atlantic/aq_cfg.h\n> +++ b/drivers/net/ethernet/aquantia/atlantic/aq_cfg.h\n> @@ -51,6 +51,10 @@\n>  \n>  #define AQ_CFG_SKB_FRAGS_MAX   32U\n>  \n> +/* Number of descriptors available in one ring to resume this ring queue\n> + */\n> +#define AQ_CFG_RESTART_DESC_THRES   (AQ_CFG_SKB_FRAGS_MAX * 2)\n> +\n>  #define AQ_CFG_NAPI_WEIGHT     64U\n>  \n>  #define AQ_CFG_MULTICAST_ADDRESS_MAX     32U\n> diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c\n> index f281392..24f573c 100644\n> --- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c\n> +++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c\n> @@ -119,6 +119,35 @@ int aq_nic_cfg_start(struct aq_nic_s *self)\n>  \treturn 0;\n>  }\n>  \n> +static int aq_nic_update_link_status(struct aq_nic_s *self)\n> +{\n> +\tint err = self->aq_hw_ops.hw_get_link_status(self->aq_hw);\n> +\n> +\tif (err < 0)\n> +\t\treturn -1;\n\n\nwhy not just return err?\n\n> +\n> +\tif (self->link_status.mbps != self->aq_hw->aq_link_status.mbps)\n> +\t\tpr_info(\"%s: link change old %d new %d\\n\",\n> +\t\t\tAQ_CFG_DRV_NAME, self->link_status.mbps,\n> +\t\t\tself->aq_hw->aq_link_status.mbps);\n\nYou has ndev in struct aq_nic_s *self, why not use netdev_*?\n\n\n> +\n> +\tself->link_status = self->aq_hw->aq_link_status;\n> +\tif (!netif_carrier_ok(self->ndev) && self->link_status.mbps) {\n> +\t\taq_utils_obj_set(&self->header.flags,\n> +\t\t\t\t AQ_NIC_FLAG_STARTED);\n> +\t\taq_utils_obj_clear(&self->header.flags,\n> +\t\t\t\t   AQ_NIC_LINK_DOWN);\n> +\t\tnetif_carrier_on(self->ndev);\n> +\t\tnetif_tx_wake_all_queues(self->ndev);\n> +\t}\n> +\tif (netif_carrier_ok(self->ndev) && !self->link_status.mbps) {\n> +\t\tnetif_carrier_off(self->ndev);\n> +\t\tnetif_tx_disable(self->ndev);\n> +\t\taq_utils_obj_set(&self->header.flags, AQ_NIC_LINK_DOWN);\n> +\t}\n> +\treturn 0;\n> +}\n> +\n>  static void aq_nic_service_timer_cb(unsigned long param)\n>  {\n>  \tstruct aq_nic_s *self = (struct aq_nic_s *)param;\n> @@ -131,26 +160,13 @@ static void aq_nic_service_timer_cb(unsigned long param)\n>  \tif (aq_utils_obj_test(&self->header.flags, AQ_NIC_FLAGS_IS_NOT_READY))\n>  \t\tgoto err_exit;\n>  \n> -\terr = self->aq_hw_ops.hw_get_link_status(self->aq_hw);\n> -\tif (err < 0)\n> +\terr = aq_nic_update_link_status(self);\n> +\tif (err)\n>  \t\tgoto err_exit;\n>  \n> -\tself->link_status = self->aq_hw->aq_link_status;\n> -\n>  \tself->aq_hw_ops.hw_interrupt_moderation_set(self->aq_hw,\n>  \t\t    self->aq_nic_cfg.is_interrupt_moderation);\n>  \n> -\tif (self->link_status.mbps) {\n> -\t\taq_utils_obj_set(&self->header.flags,\n> -\t\t\t\t AQ_NIC_FLAG_STARTED);\n> -\t\taq_utils_obj_clear(&self->header.flags,\n> -\t\t\t\t   AQ_NIC_LINK_DOWN);\n> -\t\tnetif_carrier_on(self->ndev);\n> -\t} else {\n> -\t\tnetif_carrier_off(self->ndev);\n> -\t\taq_utils_obj_set(&self->header.flags, AQ_NIC_LINK_DOWN);\n> -\t}\n> -\n>  \tmemset(&stats_rx, 0U, sizeof(struct aq_ring_stats_rx_s));\n>  \tmemset(&stats_tx, 0U, sizeof(struct aq_ring_stats_tx_s));\n>  \tfor (i = AQ_DIMOF(self->aq_vec); i--;) {\n> @@ -240,7 +256,6 @@ struct aq_nic_s *aq_nic_alloc_cold(const struct net_device_ops *ndev_ops,\n>  int aq_nic_ndev_register(struct aq_nic_s *self)\n>  {\n>  \tint err = 0;\n> -\tunsigned int i = 0U;\n>  \n>  \tif (!self->ndev) {\n>  \t\terr = -EINVAL;\n> @@ -262,8 +277,7 @@ int aq_nic_ndev_register(struct aq_nic_s *self)\n>  \n>  \tnetif_carrier_off(self->ndev);\n>  \n> -\tfor (i = AQ_CFG_VECS_MAX; i--;)\n> -\t\taq_nic_ndev_queue_stop(self, i);\n> +\tnetif_tx_disable(self->ndev);\n>  \n>  \terr = register_netdev(self->ndev);\n>  \tif (err < 0)\n> @@ -319,12 +333,8 @@ struct aq_nic_s *aq_nic_alloc_hot(struct net_device *ndev)\n>  \t\terr = -EINVAL;\n>  \t\tgoto err_exit;\n>  \t}\n> -\tif (netif_running(ndev)) {\n> -\t\tunsigned int i;\n> -\n> -\t\tfor (i = AQ_CFG_VECS_MAX; i--;)\n> -\t\t\tnetif_stop_subqueue(ndev, i);\n> -\t}\n> +\tif (netif_running(ndev))\n> +\t\tnetif_tx_disable(ndev);\n>  \n>  \tfor (self->aq_vecs = 0; self->aq_vecs < self->aq_nic_cfg.vecs;\n>  \t\tself->aq_vecs++) {\n> @@ -384,16 +394,6 @@ int aq_nic_init(struct aq_nic_s *self)\n>  \treturn err;\n>  }\n>  \n> -void aq_nic_ndev_queue_start(struct aq_nic_s *self, unsigned int idx)\n> -{\n> -\tnetif_start_subqueue(self->ndev, idx);\n> -}\n> -\n> -void aq_nic_ndev_queue_stop(struct aq_nic_s *self, unsigned int idx)\n> -{\n> -\tnetif_stop_subqueue(self->ndev, idx);\n> -}\n> -\n>  int aq_nic_start(struct aq_nic_s *self)\n>  {\n>  \tstruct aq_vec_s *aq_vec = NULL;\n> @@ -452,10 +452,6 @@ int aq_nic_start(struct aq_nic_s *self)\n>  \t\t\tgoto err_exit;\n>  \t}\n>  \n> -\tfor (i = 0U, aq_vec = self->aq_vec[0];\n> -\t\tself->aq_vecs > i; ++i, aq_vec = self->aq_vec[i])\n> -\t\taq_nic_ndev_queue_start(self, i);\n> -\n>  \terr = netif_set_real_num_tx_queues(self->ndev, self->aq_vecs);\n>  \tif (err < 0)\n>  \t\tgoto err_exit;\n> @@ -464,6 +460,8 @@ int aq_nic_start(struct aq_nic_s *self)\n>  \tif (err < 0)\n>  \t\tgoto err_exit;\n>  \n> +\tnetif_tx_start_all_queues(self->ndev);\n> +\n>  err_exit:\n>  \treturn err;\n>  }\n> @@ -603,7 +601,6 @@ int aq_nic_xmit(struct aq_nic_s *self, struct sk_buff *skb)\n>  \tunsigned int vec = skb->queue_mapping % self->aq_nic_cfg.vecs;\n>  \tunsigned int tc = 0U;\n>  \tint err = NETDEV_TX_OK;\n> -\tbool is_nic_in_bad_state;\n>  \n>  \tfrags = skb_shinfo(skb)->nr_frags + 1;\n>  \n> @@ -614,13 +611,10 @@ int aq_nic_xmit(struct aq_nic_s *self, struct sk_buff *skb)\n>  \t\tgoto err_exit;\n>  \t}\n>  \n> -\tis_nic_in_bad_state = aq_utils_obj_test(&self->header.flags,\n> -\t\t\t\t\t\tAQ_NIC_FLAGS_IS_NOT_TX_READY) ||\n> -\t\t\t\t\t\t(aq_ring_avail_dx(ring) <\n> -\t\t\t\t\t\tAQ_CFG_SKB_FRAGS_MAX);\n> +\taq_ring_update_queue_state(ring);\n>  \n> -\tif (is_nic_in_bad_state) {\n> -\t\taq_nic_ndev_queue_stop(self, ring->idx);\n> +\t/* Above status update may stop the queue. Check this. */\n> +\tif (__netif_subqueue_stopped(self->ndev, ring->idx)) {\n>  \t\terr = NETDEV_TX_BUSY;\n>  \t\tgoto err_exit;\n>  \t}\n> @@ -632,9 +626,6 @@ int aq_nic_xmit(struct aq_nic_s *self, struct sk_buff *skb)\n>  \t\t\t\t\t\t      ring,\n>  \t\t\t\t\t\t      frags);\n>  \t\tif (err >= 0) {\n> -\t\t\tif (aq_ring_avail_dx(ring) < AQ_CFG_SKB_FRAGS_MAX + 1)\n> -\t\t\t\taq_nic_ndev_queue_stop(self, ring->idx);\n> -\n>  \t\t\t++ring->stats.tx.packets;\n>  \t\t\tring->stats.tx.bytes += skb->len;\n>  \t\t}\n> @@ -906,9 +897,7 @@ int aq_nic_stop(struct aq_nic_s *self)\n>  \tstruct aq_vec_s *aq_vec = NULL;\n>  \tunsigned int i = 0U;\n>  \n> -\tfor (i = 0U, aq_vec = self->aq_vec[0];\n> -\t\tself->aq_vecs > i; ++i, aq_vec = self->aq_vec[i])\n> -\t\taq_nic_ndev_queue_stop(self, i);\n> +\tnetif_tx_disable(self->ndev);\n>  \n>  \tdel_timer_sync(&self->service_timer);\n>  \n> diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.h b/drivers/net/ethernet/aquantia/atlantic/aq_nic.h\n> index 7fc2a5e..0ddd556 100644\n> --- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.h\n> +++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.h\n> @@ -83,8 +83,6 @@ struct net_device *aq_nic_get_ndev(struct aq_nic_s *self);\n>  int aq_nic_init(struct aq_nic_s *self);\n>  int aq_nic_cfg_start(struct aq_nic_s *self);\n>  int aq_nic_ndev_register(struct aq_nic_s *self);\n> -void aq_nic_ndev_queue_start(struct aq_nic_s *self, unsigned int idx);\n> -void aq_nic_ndev_queue_stop(struct aq_nic_s *self, unsigned int idx);\n>  void aq_nic_ndev_free(struct aq_nic_s *self);\n>  int aq_nic_start(struct aq_nic_s *self);\n>  int aq_nic_xmit(struct aq_nic_s *self, struct sk_buff *skb);\n> diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_ring.c b/drivers/net/ethernet/aquantia/atlantic/aq_ring.c\n> index 4eee199..02f79b0 100644\n> --- a/drivers/net/ethernet/aquantia/atlantic/aq_ring.c\n> +++ b/drivers/net/ethernet/aquantia/atlantic/aq_ring.c\n> @@ -104,6 +104,32 @@ int aq_ring_init(struct aq_ring_s *self)\n>  \treturn 0;\n>  }\n>  \n> +void aq_ring_update_queue_state(struct aq_ring_s *ring)\n> +{\n> +\tif (aq_ring_avail_dx(ring) <= AQ_CFG_SKB_FRAGS_MAX)\n> +\t\taq_ring_queue_stop(ring);\n> +\telse if (aq_ring_avail_dx(ring) > AQ_CFG_RESTART_DESC_THRES)\n> +\t\taq_ring_queue_wake(ring);\n> +}\n> +\n> +void aq_ring_queue_wake(struct aq_ring_s *ring)\n> +{\n> +\tstruct net_device *ndev = aq_nic_get_ndev(ring->aq_nic);\n> +\n> +\tif (__netif_subqueue_stopped(ndev, ring->idx)) {\n> +\t\tnetif_wake_subqueue(ndev, ring->idx);\n> +\t\tring->stats.tx.queue_restarts++;\n> +\t}\n> +}\n> +\n> +void aq_ring_queue_stop(struct aq_ring_s *ring)\n> +{\n> +\tstruct net_device *ndev = aq_nic_get_ndev(ring->aq_nic);\n> +\n> +\tif (!__netif_subqueue_stopped(ndev, ring->idx))\n> +\t\tnetif_stop_subqueue(ndev, ring->idx);\n> +}\n> +\n>  void aq_ring_tx_clean(struct aq_ring_s *self)\n>  {\n>  \tstruct device *dev = aq_nic_get_dev(self->aq_nic);\n> diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_ring.h b/drivers/net/ethernet/aquantia/atlantic/aq_ring.h\n> index 782176c..24523b5 100644\n> --- a/drivers/net/ethernet/aquantia/atlantic/aq_ring.h\n> +++ b/drivers/net/ethernet/aquantia/atlantic/aq_ring.h\n> @@ -94,6 +94,7 @@ struct aq_ring_stats_tx_s {\n>  \tu64 errors;\n>  \tu64 packets;\n>  \tu64 bytes;\n> +\tu64 queue_restarts;\n>  };\n>  \n>  union aq_ring_stats_s {\n> @@ -147,6 +148,9 @@ struct aq_ring_s *aq_ring_rx_alloc(struct aq_ring_s *self,\n>  int aq_ring_init(struct aq_ring_s *self);\n>  void aq_ring_rx_deinit(struct aq_ring_s *self);\n>  void aq_ring_free(struct aq_ring_s *self);\n> +void aq_ring_update_queue_state(struct aq_ring_s *ring);\n> +void aq_ring_queue_wake(struct aq_ring_s *ring);\n> +void aq_ring_queue_stop(struct aq_ring_s *ring);\n>  void aq_ring_tx_clean(struct aq_ring_s *self);\n>  int aq_ring_rx_clean(struct aq_ring_s *self,\n>  \t\t     struct napi_struct *napi,\n> diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_vec.c b/drivers/net/ethernet/aquantia/atlantic/aq_vec.c\n> index ebf5880..305ff8f 100644\n> --- a/drivers/net/ethernet/aquantia/atlantic/aq_vec.c\n> +++ b/drivers/net/ethernet/aquantia/atlantic/aq_vec.c\n> @@ -59,12 +59,7 @@ static int aq_vec_poll(struct napi_struct *napi, int budget)\n>  \t\t\tif (ring[AQ_VEC_TX_ID].sw_head !=\n>  \t\t\t    ring[AQ_VEC_TX_ID].hw_head) {\n>  \t\t\t\taq_ring_tx_clean(&ring[AQ_VEC_TX_ID]);\n> -\n> -\t\t\t\tif (aq_ring_avail_dx(&ring[AQ_VEC_TX_ID]) >\n> -\t\t\t\t    AQ_CFG_SKB_FRAGS_MAX) {\n> -\t\t\t\t\taq_nic_ndev_queue_start(self->aq_nic,\n> -\t\t\t\t\t\tring[AQ_VEC_TX_ID].idx);\n> -\t\t\t\t}\n> +\t\t\t\taq_ring_update_queue_state(&ring[AQ_VEC_TX_ID]);\n>  \t\t\t\twas_tx_cleaned = true;\n>  \t\t\t}\n>  \n> @@ -364,6 +359,7 @@ void aq_vec_add_stats(struct aq_vec_s *self,\n>  \t\tstats_tx->packets += tx->packets;\n>  \t\tstats_tx->bytes += tx->bytes;\n>  \t\tstats_tx->errors += tx->errors;\n> +\t\tstats_tx->queue_restarts += tx->queue_restarts;\n>  \t}\n>  }\n>  \n>","headers":{"Return-Path":"<netdev-owner@vger.kernel.org>","X-Original-To":"patchwork-incoming@ozlabs.org","Delivered-To":"patchwork-incoming@ozlabs.org","Authentication-Results":"ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=netdev-owner@vger.kernel.org;\n\treceiver=<UNKNOWN>)","Received":["from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3xyYzg5RDGz9t3m\n\tfor <patchwork-incoming@ozlabs.org>;\n\tThu, 21 Sep 2017 21:19:43 +1000 (AEST)","(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1751618AbdIULTl (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tThu, 21 Sep 2017 07:19:41 -0400","from szxga04-in.huawei.com ([45.249.212.190]:6949 \"EHLO\n\tszxga04-in.huawei.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S1751450AbdIULTk (ORCPT\n\t<rfc822;netdev@vger.kernel.org>); Thu, 21 Sep 2017 07:19:40 -0400","from 172.30.72.59 (EHLO DGGEMS411-HUB.china.huawei.com)\n\t([172.30.72.59])\n\tby dggrg04-dlp.huawei.com (MOS 4.4.6-GA FastPath queued)\n\twith ESMTP id DHR44322; Thu, 21 Sep 2017 19:19:34 +0800 (CST)","from [127.0.0.1] (10.74.191.121) by DGGEMS411-HUB.china.huawei.com\n\t(10.3.19.211) with Microsoft SMTP Server id 14.3.301.0;\n\tThu, 21 Sep 2017 19:19:32 +0800"],"Subject":"Re: [PATCH net 2/4] net:ethernet:aquantia: Fix Tx queue hangups","To":"Igor Russkikh <igor.russkikh@aquantia.com>,\n\t\"David S . Miller\" <davem@davemloft.net>","CC":"<netdev@vger.kernel.org>, David Arcari <darcari@redhat.com>,\n\tPavel Belous <Pavel.Belous@aquantia.com>,\n\tNadezhda Krupnina <Nadezhda.Krupnina@aquantia.com>,\n\tSimon Edelhaus <simon.edelhaus@aquantia.com>","References":"<cover.1505915085.git.igor.russkikh@aquantia.com>\n\t<cef3863edd8d504d7406f781c97260c52f21e156.1505915085.git.igor.russkikh@aquantia.com>","From":"Yunsheng Lin <linyunsheng@huawei.com>","Message-ID":"<024e7fb3-9b53-f4f2-3901-38a63c47d76c@huawei.com>","Date":"Thu, 21 Sep 2017 19:19:06 +0800","User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101\n\tThunderbird/52.2.0","MIME-Version":"1.0","In-Reply-To":"<cef3863edd8d504d7406f781c97260c52f21e156.1505915085.git.igor.russkikh@aquantia.com>","Content-Type":"text/plain; charset=\"utf-8\"","Content-Language":"en-US","Content-Transfer-Encoding":"7bit","X-Originating-IP":"[10.74.191.121]","X-CFilter-Loop":"Reflected","X-Mirapoint-Virus-RAPID-Raw":"score=unknown(0),\n\trefid=str=0001.0A010206.59C3A046.008E, ss=1, re=0.000, recu=0.000,\n\treip=0.000, cl=1, cld=1, fgs=0, ip=0.0.0.0,\n\tso=2014-11-16 11:51:01, dmn=2013-03-21 17:37:32","X-Mirapoint-Loop-Id":"d589cf5df55d606edc6fb3d08347045e","Sender":"netdev-owner@vger.kernel.org","Precedence":"bulk","List-ID":"<netdev.vger.kernel.org>","X-Mailing-List":"netdev@vger.kernel.org"}},{"id":1772857,"web_url":"http://patchwork.ozlabs.org/comment/1772857/","msgid":"<74f2e3bc-e1ef-92cf-d665-5e7abb68ae94@aquantia.com>","list_archive_url":null,"date":"2017-09-21T14:31:47","subject":"Re: [PATCH net 2/4] net:ethernet:aquantia: Fix Tx queue hangups","submitter":{"id":72409,"url":"http://patchwork.ozlabs.org/api/people/72409/","name":"Igor Russkikh","email":"igor.russkikh@aquantia.com"},"content":"Thanks for the comments, Yunsheng,\n\n>>  \n>> +static int aq_nic_update_link_status(struct aq_nic_s *self)\n>> +{\n>> +\tint err = self->aq_hw_ops.hw_get_link_status(self->aq_hw);\n>> +\n>> +\tif (err < 0)\n>> +\t\treturn -1;\n> why not just return err?\n\nAgreed, that could be improved.\n\n>> +\tif (self->link_status.mbps != self->aq_hw->aq_link_status.mbps)\n>> +\t\tpr_info(\"%s: link change old %d new %d\\n\",\n>> +\t\t\tAQ_CFG_DRV_NAME, self->link_status.mbps,\n>> +\t\t\tself->aq_hw->aq_link_status.mbps);\n> You has ndev in struct aq_nic_s *self, why not use netdev_*?\n\nWe are planning to introduce a generic rework commit separately and use netif_* set of macro's through all the driver's code.","headers":{"Return-Path":"<netdev-owner@vger.kernel.org>","X-Original-To":"patchwork-incoming@ozlabs.org","Delivered-To":"patchwork-incoming@ozlabs.org","Authentication-Results":["ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=netdev-owner@vger.kernel.org;\n\treceiver=<UNKNOWN>)","ozlabs.org; dkim=pass (1024-bit key;\n\tunprotected) header.d=AQUANTIA1COM.onmicrosoft.com\n\theader.i=@AQUANTIA1COM.onmicrosoft.com header.b=\"EVdjb3ti\"; \n\tdkim-atps=neutral","spf=none (sender IP is )\n\tsmtp.mailfrom=Igor.Russkikh@aquantia.com; "],"Received":["from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3xyfFk2Pmmz9s7g\n\tfor <patchwork-incoming@ozlabs.org>;\n\tFri, 22 Sep 2017 00:32:10 +1000 (AEST)","(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1752009AbdIUOcG (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tThu, 21 Sep 2017 10:32:06 -0400","from mail-by2nam01on0050.outbound.protection.outlook.com\n\t([104.47.34.50]:30590\n\t\"EHLO NAM01-BY2-obe.outbound.protection.outlook.com\"\n\trhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP\n\tid S1751726AbdIUOcE (ORCPT <rfc822;netdev@vger.kernel.org>);\n\tThu, 21 Sep 2017 10:32:04 -0400","from [10.0.3.15] (95.79.108.179) by\n\tCY1PR0701MB1962.namprd07.prod.outlook.com (10.163.141.16) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id\n\t15.20.77.7; Thu, 21 Sep 2017 14:31:59 +0000"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=AQUANTIA1COM.onmicrosoft.com; s=selector1-aquantia-com;\n\th=From:Date:Subject:Message-ID:Content-Type:MIME-Version;\n\tbh=q8xl2EQ7OTsZ5i4MSwXFKBqzBrU2/WJuA/u/EMJw+8c=;\n\tb=EVdjb3tiM0IxGLQvPmug6r4WjD/4kqckXj3hXg97gBOKSFuAC6Pse6vfRe5w/uMIlo0hprn67m7eM7yHbETootqfwMvCbEfyr9y3su8MVsup0OUBSRHM/etDbLXkHOx0f0UrIJIgB0f8Mf2+MJcAreY0ZR9E2WsHHQylyGARqNg=","Subject":"Re: [PATCH net 2/4] net:ethernet:aquantia: Fix Tx queue hangups","To":"Yunsheng Lin <linyunsheng@huawei.com>,\n\t\"David S . Miller\" <davem@davemloft.net>","Cc":"netdev@vger.kernel.org, David Arcari <darcari@redhat.com>,\n\tPavel Belous <Pavel.Belous@aquantia.com>,\n\tNadezhda Krupnina <Nadezhda.Krupnina@aquantia.com>,\n\tSimon Edelhaus <simon.edelhaus@aquantia.com>","References":"<cover.1505915085.git.igor.russkikh@aquantia.com>\n\t<cef3863edd8d504d7406f781c97260c52f21e156.1505915085.git.igor.russkikh@aquantia.com>\n\t<024e7fb3-9b53-f4f2-3901-38a63c47d76c@huawei.com>","From":"Igor Russkikh <igor.russkikh@aquantia.com>","Message-ID":"<74f2e3bc-e1ef-92cf-d665-5e7abb68ae94@aquantia.com>","Date":"Thu, 21 Sep 2017 17:31:47 +0300","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101\n\tThunderbird/52.3.0","MIME-Version":"1.0","In-Reply-To":"<024e7fb3-9b53-f4f2-3901-38a63c47d76c@huawei.com>","Content-Type":"text/plain; charset=utf-8","Content-Transfer-Encoding":"7bit","Content-Language":"en-US","X-Originating-IP":"[95.79.108.179]","X-ClientProxiedBy":"AM5PR0701CA0016.eurprd07.prod.outlook.com (10.168.161.26)\n\tTo CY1PR0701MB1962.namprd07.prod.outlook.com\n\t(10.163.141.16)","X-MS-PublicTrafficType":"Email","X-MS-Office365-Filtering-Correlation-Id":"dd287d40-2239-4e49-732c-08d500fd85f7","X-Microsoft-Antispam":"UriScan:; BCL:0; PCL:0;\n\tRULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(2017030254152)(300000503095)(300135400095)(2017052603199)(201703131423075)(201703031133081)(201702281549075)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095);\n\tSRVR:CY1PR0701MB1962; ","X-Microsoft-Exchange-Diagnostics":["1; CY1PR0701MB1962;\n\t3:h3ilCXzNw5kuEpz3COThg6RZZIdzxrFLNo6i1d49XaAf6WjsLCZ6NZXur/eSP8IQTyc+4g2qK41PnEn6KpKtSbfU7m9z0dLkhjyK0PlUXMuHgUdwraHHYdf9QlPNGkeF+buyxnlbVVgp9cb5aR5e6rOtBn4R6CpLEabjyV18WWwFFSLmFfVm9fkRUD/MJqSDKL6L1IKvzsKYRARQZ7rDCLdbmFG3uSca6YYIfdyF5314lzgAsGo6IVH2Ie0Wx2Ht;\n\t25:JsZ+q9TWciKpga+oJ3U2Uj1hYUlQQYmCu/28GqHhPNkn1qf1ULU1qtvjjc6cGBHfXNR2iVpCHW/xX82iNDs7AxnTOZ8FSBTnYaZOsS1l45mcnyVRMpAxr+Ee2jlwCh6Np4PlSSwktApwqCubxumeZ3g5rX+HbiAFrbSNQ+mccSEV+rMPP148J7tnqjsbhiJ6hfk6QKtjxIhqQt4z1F3JaND+DXr9Az5EO67XB7YAyzvvOP0D8Mbawx1OiebA+AKtF0KZUbjd8FJFzr8rxuWCqortAMJjKhJVGsIhJyZOIfkkbDKVlzIJJ6JiBC3pewQ1yuvrANA6fzX4WZp5bJ9UHA==;\n\t31:3NqK/TmtNcWEHAQqja8MsApXFi9uGIaPfiMR6OZGeRvx2hvo6r4Ytv3QOdtIVoqROCa0y3l2zJoQ4gG0D4XkAC6pTcGwnZmMMz2VyidrAzukKnNyxDMbfbeCkJzgK6UpSW7zQWK5WZFyGsFuCmaK6ZowWPwKpThdL2AvfRUDEJUIIzqOOnz7lNFvf8g3+N3W7fEe0mX5dd9A/dKLC+wPhnrIXfqS/t2rd4qamWOEJYs=","1; CY1PR0701MB1962;\n\t20:gEziAgZWS8hp5XcBhk/kQ4L1+O4WKBk8gd+T9Pa9nxHGzqDIwbrjIwLCE/apLiNO/98L4NpcseUC4duZx3ffRrvbHjppkbxqQwsie77FuKtFEdXPc/2G0qUjEgC71E1YHecmpyz3D244YrDumbZGKoYjmSeH+fKChL5u477sh9YpMp+tP/5+KtYyrDyPNAorhV0kTk2UKcKLjYu6Ldm8DAkkcVPOL8ULOWgg8Mf/+EaZAX5OQjvYdAdAGOjNkgE6kCpsbHI8znr1IgF312Bv3RnkcYY4XYBc13Tw9Zvfq95TqpFHNSGYC/24v81PQrU3bmNOgAbkffb9lIKiJHDaw0gBL0vkQRldDJiyU+xwbbfNDluxG/ao2zVS7sCGesnnOCltRTaWCl38ePKcZbfUXZIdRceN8mz/ou8KbehdvnlEOLuIEjDmRnxeblvco5/31LQDHsdnjO/g7QF2sJsqrFJ5tcZELx1cGb6lJpQ3MzZ7e3JhJoYYaxfzVz3Nr7xa;\n\t4:5JcgEtRcUGchAZCzLmwuI71W7xfNQ+nIcqykSzAMtYaOjspgP6HkCtxXfpd1uEVx6vBw81ECpyVS33WhGeKVtncUrrrN4V3BSPNE4x02rMUtYPiQIOE+Fq88QWWuaO8/I0urgr8MtXNWxRfYooZjhGo5wgw+eOfRRd13jod9V4+V0+u9O2XX/HVNum1Yxpb0s17DF7KPvl1UtJeVlQUh4GPGWj3lvZHSQhNbCO3v7fN5e+iVmFhJ0XPWckob/zXB","=?utf-8?q?1=3BCY1PR0701MB1962=3B23=3AFi?=\n\t=?utf-8?q?+PmIPRZaY27n86gcCPt487tjsKc9QR2J/Kpqe+4+SYn31CS0ach4zF+r?=\n\t=?utf-8?q?glvH9W189SwJwJ/HMGr9yPuVypai3Wj7Qe80hIZyfFG9xMIp80x+EQ96?=\n\t=?utf-8?q?7TIBue+CaM6rA5drZGIPv/1TnoeBE/Q64+vSJMxuvv4umeXmp7U0Y6xq?=\n\t=?utf-8?q?ZT/7cyrSDBwODJtZ0/dyNomAZQ2ISV2b44sHWlkDwSu0HY/Xq30C5iZ9?=\n\t=?utf-8?q?YKSM4PxdclZGd5ynAXQ1d4r0K2SOSS0L3OAMywTQYjMEIb15QuGfJN0z?=\n\t=?utf-8?q?9ukrlKiWOivE+lEmRBzYv14OlvAh09QfzG4VazK911KiC5rVsNkydRrU?=\n\t=?utf-8?q?1JDv73ghHh95MaIwtfH1sQiDmSLFnwV7GLSPnEoiMgO1FTolnDcJS1i5?=\n\t=?utf-8?q?qHAXBowrrfcfUXFtSvDpI28NMLwOpOhchDP0JKPBl4dQHJuRz2ViGVO2?=\n\t=?utf-8?q?I88OwR2fNeybH3CaDgSXdhW4ziPSJ8RTDkDMLDEIKeoOWOyzRXLwL+m0?=\n\t=?utf-8?q?2EXWT0UVOKOTTTXtHuft8tm1MFgD5YUVWqK8x80thqdCDNWOObEUTKdt?=\n\t=?utf-8?q?6tdbW1np5dpYnuc3WIPHPLHCZvwLzEqhzEFwvcR5D1dS/cfnKF9dnN54?=\n\t=?utf-8?q?UdXotEOY8PmzGYTpZ2cLhIFIFjSstJaTkL8zhjX5xzPQI6/GZ/af4pW2?=\n\t=?utf-8?q?2qtsFMpM1mvE9nPEbDW1LxSv5N41kx4lFHtOnMV79QjFq4h82lR8oYLd?=\n\t=?utf-8?q?hALsdbJl4atnJ9eSco5E4qKvUCKvETjqXqMdgCux/jYOoIPE4Q84tZ/q?=\n\t=?utf-8?q?lQQuj2ayZV596Si17oqtVf8TcE5+GUjVNc53D8znamC1wwlnD/NVs8C+?=\n\t=?utf-8?q?FRkPTv6Yvz1DtaOUmH9eDgaeJFOK/mwv+OIZkTOA6lONgPEtyEnJD7wM?=\n\t=?utf-8?q?tnTBFPspSPFRAd/GoHfZuizdUzWwEy12URIKLqTf82sWAetllv8kwjf8?=\n\t=?utf-8?q?Jn0N0TcXzZJBM6SQdQ+G8+y3xP8pU6h2eP0Bye37KBQpIacHUX2fw3pb?=\n\t=?utf-8?q?KP4hq9yRkAXUImI8SMaMKMyDKCojE13yHcdFLfKRg5uRGjWDznlE46W4?=\n\t=?utf-8?q?m4tqDalfQhZJBNVzJP/YeQUXsvOCo7RLil+6urwWEjx+VFyvqVILGjJ4?=\n\t=?utf-8?q?vYBZwFHgwcZfR3x26RpiNUK7VSZvLJwt2w7U4bUUNghjLdNjN9g2oTMK?=\n\t=?utf-8?q?2uE5Q835QQkGk1HeIWCWRr8ji7Yiwun9SYOQZ2G4uILP87Q2HkTTPcdX?=\n\t=?utf-8?q?twpKu7kvgB8EqqvzOqVhDVi7zotgRhCpN+E5eaABxLwGnTo2S19vYOAS?=\n\t=?utf-8?q?bZxbvYZ8O7ter6XO9Zxqkr39CyOXt9eSe9+mqx5ZT2CA+N1GgX3+NhdG?=\n\t=?utf-8?q?qMYls2jg8fMjRb1xvGa0+seGxcs10pABzcQWKSWx0=3D?=","1; CY1PR0701MB1962;\n\t6:K7qpi0Ni1Z/fdfdhYaBuLNwUqWXJDgIEBF5XxLNqF72q5xwkXT+nzkOCP6SV+jHidLZExfhL9HyB+jLza1vrHclRg5DY6PAtBxGrSwLaWd9U+jLlg42uTTyRTAeIAyLaMagj3zCg6526HllzkEyDso/RlJfnY2+FZEhP2smDF5U3WKFbfIuZS/513jrZ8ZStJaWQxpqu+s1sNt1IQgaNgBgrPFcBEepbNTGLty+cFpfazs8TH8K0M0tcsTx8z9q3VxjbuKWA0JI5ftsckUlFNJa+Yzt3mU9waL/4US6KpuxerfFAK8tK74NUEMRYxftc74RhMAGfE/c+3fy/JgSqXw==;\n\t5:yVLfRbyvxLb9jt1VhsDoJZtjVP0ftrEgVLtH8H36JmSDigXCm0K9RVgZ7IofupmH4xkM7UYlBqlb7yV3PbbefWd1GEZUR4RrkxY338UsggHgpNrayhdIOapHZl25OzKiCodlYVAPpx39yzXYqmRWNw==;\n\t24:DMl/sE80AwlAqGKA1EFYI/hgaP2vMqvPdxYSSqDrbnjbS4+5Z04XbmYqtJ8iwBHSHY+CllbFO1Y7ZB2WbiQVB+9J57Ol7lRnGYC015LvyVE=;\n\t7:PrlrbaGAMCw+HVGbA6BYq/5+IGX4qm8vwUWmDlXz53GfnYgf/ppJbtr/6L/a/yQMXk7qyY3PCviFidMrBlpv/GGeJptTwLerk4Lwm2pHC6imxfme4krwTPrZI+piL4gj/I/vvJM6crOySoUmgAub0J1UGEF9V1fP3MYk85mSLJxgDzEUK22865OCBZRSqBcTTcUYxdFC1y2R6AQUshXavlbSC23//aT2PRZQNUuMm+U="],"X-MS-TrafficTypeDiagnostic":"CY1PR0701MB1962:","X-Exchange-Antispam-Report-Test":"UriScan:;","X-Microsoft-Antispam-PRVS":"<CY1PR0701MB19621B6095B8959945DC861698660@CY1PR0701MB1962.namprd07.prod.outlook.com>","X-Exchange-Antispam-Report-CFA-Test":"BCL:0; PCL:0;\n\tRULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(100000703101)(100105400095)(10201501046)(6041248)(20161123562025)(20161123555025)(20161123564025)(20161123560025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123558100)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);\n\tSRVR:CY1PR0701MB1962; BCL:0; PCL:0;\n\tRULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);\n\tSRVR:CY1PR0701MB1962; ","X-Forefront-PRVS":"04371797A5","X-Forefront-Antispam-Report":"SFV:NSPM;\n\tSFS:(10009020)(6049001)(6009001)(346002)(376002)(51914003)(199003)(189002)(72206003)(31696002)(50466002)(33646002)(31686004)(2950100002)(86362001)(64126003)(230700001)(77096006)(4326008)(6486002)(101416001)(65826007)(6666003)(25786009)(229853002)(5660300001)(53936002)(3846002)(106356001)(23676002)(107886003)(54356999)(76176999)(50986999)(90366009)(6116002)(6246003)(105586002)(65956001)(66066001)(58126008)(478600001)(65806001)(8676002)(81166006)(81156014)(16576012)(316002)(16526017)(7736002)(83506001)(68736007)(305945005)(36756003)(54906003)(97736004)(2906002)(47776003)(189998001)(8936002)(110136005);\n\tDIR:OUT; SFP:1101; SCL:1; SRVR:CY1PR0701MB1962; H:[10.0.3.15];\n\tFPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; ","Received-SPF":"None (protection.outlook.com: aquantia.com does not designate\n\tpermitted sender hosts)","SpamDiagnosticOutput":"1:99","SpamDiagnosticMetadata":"NSPM","X-OriginatorOrg":"aquantia.com","X-MS-Exchange-CrossTenant-OriginalArrivalTime":"21 Sep 2017 14:31:59.5386\n\t(UTC)","X-MS-Exchange-CrossTenant-FromEntityHeader":"Hosted","X-MS-Exchange-CrossTenant-Id":"83e2e134-991c-4ede-8ced-34d47e38e6b1","X-MS-Exchange-Transport-CrossTenantHeadersStamped":"CY1PR0701MB1962","Sender":"netdev-owner@vger.kernel.org","Precedence":"bulk","List-ID":"<netdev.vger.kernel.org>","X-Mailing-List":"netdev@vger.kernel.org"}}]