From patchwork Thu Oct 26 23:18:20 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Manlunas, Felix" X-Patchwork-Id: 830978 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=CAVIUMNETWORKS.onmicrosoft.com header.i=@CAVIUMNETWORKS.onmicrosoft.com header.b="bTnAKsI+"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3yNNGv1BjLz9t0F for ; Fri, 27 Oct 2017 10:18:31 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932376AbdJZXS1 (ORCPT ); Thu, 26 Oct 2017 19:18:27 -0400 Received: from mail-sn1nam01on0079.outbound.protection.outlook.com ([104.47.32.79]:60992 "EHLO NAM01-SN1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751533AbdJZXSY (ORCPT ); Thu, 26 Oct 2017 19:18:24 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=CAVIUMNETWORKS.onmicrosoft.com; s=selector1-cavium-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=PP0CsFyu6nkfAZunhiN34p/Je8ySlRiqHBpqtLOCtlI=; b=bTnAKsI+JemtVtYm2sozMPvXiD/sOtUBNZTx47RgKhKEWNov+f7hk2rV9ZK8RoLzgc1oN+ABO1lcTzDWXCm4D7DDZ60D9IVhqmERSVFFsrp/uPO7GNniW/r82Uu957c7Qi0QJJFDw7X/vUe+QDdWWUQo/ZKRbNYzoZPOBjDREzU= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Felix.Manlunas@cavium.com; Received: from localhost (50.233.148.156) by CY4PR07MB3173.namprd07.prod.outlook.com (10.172.115.139) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.178.6; Thu, 26 Oct 2017 23:18:22 +0000 Date: Thu, 26 Oct 2017 16:18:20 -0700 From: Felix Manlunas To: davem@davemloft.net Cc: netdev@vger.kernel.org, raghu.vatsavayi@cavium.com, derek.chickles@cavium.com, satananda.burla@cavium.com, intiyaz.basha@cavium.com Subject: [PATCH V2 net-next] liquidio: xmit_more support Message-ID: <20171026231820.GA18787@felix-thinkpad.cavium.com> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.6.1 (2016-04-27) X-Originating-IP: [50.233.148.156] X-ClientProxiedBy: DM5PR0401CA0092.namprd04.prod.outlook.com (10.167.105.33) To CY4PR07MB3173.namprd07.prod.outlook.com (10.172.115.139) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: d855eb5c-c3a0-4fcd-5442-08d51cc7da79 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(4534020)(4602075)(4627075)(201703031133081)(201702281549075)(2017052603199); SRVR:CY4PR07MB3173; X-Microsoft-Exchange-Diagnostics: 1; CY4PR07MB3173; 3:lNEkrOT3ghON6VfbOoqYbTCFr02FbhAO6/hGG7xg0SG9SXezoTsDQwKa52JxY8JYfXynnhG4RT8aTNdtDe+8NjkthmmH4yUgUTpKq4GiIPttKqKFBgkpa/G5gwaHyMvbhDvOdixnSAQKfa7/CNank0RJVmaKkmdd/ZtByFVyONjcVsnj/nisi7Z+F85CjcPwaAkxFezpdjawrsNY0byDHELQBNF4uXliXPWp714SLhwgV6WjXW+JK472jS++O1hR; 25:THTua7K+X9wWsfJKReAnBBA2mZrHjO/TLZZWxcCu7SwVhlyh1W9AjTiRMqZw1oIND1P/DuBOdeUbtuTQE+S9H4SRqqY319cp33DdYYNllM1VDzn95f4WjpBizKcgI8u/ytI45qrvetYWIbFoRwsQbBRWXnNroNkRbmTouWS0V1Tj2omnubrYCc52ajBTXHSrYniPDW63Y7qan0D6sAnj+h7zT/kzQRVrdsPkZyDtxgtity8gh6oWcjIdBT2tFpQmVIZpjbge80HJO86bFkfgmTjFsd4cvULja/H+a6bgdiYFfwJsHa+owOjecDGOp+YpWtYoeXHOC2R/thisDOKDeg==; 31:n5d2sx4+0ScnY2VlWxhf7Zo5Hm1ZB1XvUI51F2rbJIAhT0frpms/BdFEGe59CN9ch0M0XCE4aryNmPRUXnLOw8teEmlp81wPsGPwzfK3tvQgoywH/rhP81PP9BpsunVZZ0g6ck4JCKDnW81h0e4jdVupxCjHfhSG7V0m0/rxK3ghWeoRPBagIzgDBXrM/GUybwX3OD2XUrfPedQcD8xRuLD3gCuoX5PAexxVPUB3lco= X-MS-TrafficTypeDiagnostic: CY4PR07MB3173: X-Microsoft-Exchange-Diagnostics: 1; CY4PR07MB3173; 20:O6uYwMKIYrGhl7VQTsg2mu4gaLQltDFQZ/+gqEu0AF/awRC8iove8YZ1NzI5zad4wI5IiKr5vr2RX3Ls878XjmH32yVHJzqswK4a662Uo+W1ck//7pSX8qkeCt64BxhZnYsgxl752UaiQ1wa/oQ6cOfO6bgkLZn7I7ocz/WgGujqJGhXhNGxmo0enYBUZgysSUGLKhB9cAwMadA1XtEUYfRcoSjY80D68a2TNr9cvTHm85eSETT1DBhKACWFAraTb3fMWKch66eyVp8KYQCtfV9ULhJw/HUhYgtdIxhl3nrUK91lT9JTzAtJp+0SzbTVVY/KjUvYPBdM8hNUsd9+bHRrGe5JvGSG56kZFsPa+dgzy+ZINoveQc4yhQu5nmGPF3rTTdA/1Gs4HKURaBhgJu5n49xI4cvJnwrj03VbiO3JMc3kF9mnwXsLedUnjndXJFP8A4v/crXIk8vYNo0KsWkNoFYNltsSlkxDHYCxpx74b3xGMKu6GNgk8BySKR9b; 4:JVW3VZpne6M3ZFeRMH7NeCo144Sn1dtywUEX2Rynkusd8bCMGS7+0HX74CgEEumSC+UyISS8ssINgpKd6rf+Klj4soxmHWqzcUKxnz7dwU25HG9RFaKmVf9WHaPCj+TD9fdi7sfmk/iwEDI0hpi0Mqm8gFNPxUpYZhv/gJM/bq7kLy5aSH77uc4tc4BHiO6ZC2sdARFBrvc1JgpkJkTf3x00HXVYzXV4O7fxbmy8ASZoIaOKbiFB7rKQP9FBLgic0+q4uUcu840dLRMlKeNOQw== X-Exchange-Antispam-Report-Test: UriScan:; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(5005006)(8121501046)(3002001)(10201501046)(100000703101)(100105400095)(93006095)(93001095)(3231020)(6041248)(20161123555025)(20161123564025)(20161123558100)(20161123560025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123562025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:CY4PR07MB3173; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:CY4PR07MB3173; X-Forefront-PRVS: 04724A515E X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(6069001)(6009001)(346002)(376002)(189002)(199003)(54534003)(107886003)(50986999)(54356999)(66066001)(2351001)(16526018)(316002)(47776003)(23726003)(106356001)(105586002)(76506005)(16586007)(2906002)(58126008)(3846002)(101416001)(33656002)(83506002)(6116002)(8676002)(81166006)(81156014)(189998001)(6496005)(2361001)(53936002)(1076002)(6486002)(8936002)(72206003)(478600001)(25786009)(68736007)(5660300001)(6916009)(97736004)(50466002)(86362001)(575784001)(4326008)(7736002)(305945005)(18370500001); DIR:OUT; SFP:1101; SCL:1; SRVR:CY4PR07MB3173; H:localhost; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: cavium.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: 1; CY4PR07MB3173; 23:Qatf5KVx0HlC/y2jQrhv7Q41pyvPtrppB21EVR/DBfMn0IBfl6N3CJ+MY51Nw4hyWScBG6HAUi4xN1ZZWuEC5bzCvtt44/c681gm9/vpwhbEqbqK9Owl6JfSPWCAfa/TKIcsQIVl6Mu1Xp/wgkOBp7687vQpPZieWZVf3WlE9lodaaI2kzMs2cc0EOq81ZQxAUc22ihcFgdIII+Z6S//bi1/rS76Y2ilPdPXUaG2nrzKjCjeWQxwr4S6N63Hn1u1WVWnzRA4I4GSpjGssVosFwMgOLJQETzGp+515SVTdVio18tXRL9qd+S2ctUiUbaeWHCLFeB63XAm4JzmF5zIA0Oy1Fb349O59hyfl7z/mluX1KsmbnEXLkt5Bv7J48ziKmxElWLD6LDownv0B0rGFnWohFdyrVI2Csbtm4GE7EdhEYNldgSfsqyaW2yimz4ARp+ke01NMnfnsssR/pj3FWDP41C9sOrtnOQjs6A8GGL8Te7O9dVB8oVXiqszWlfnqXc1slxTAQAr7RcIpVgyo17Y3kuKIBKazLMa0Gx+4XCYast+KrnwHvP3djVYBpV8OjGdz/oeMzegaXjdVgjcz/k7f/aZGhcKF0PYxjU/nrbJRQVyMxSaG90+FlGmZ1r/4BhxIbLVQBw5zNJE/TxTy65TqIK7XJoA4K6Tqu40flw5jJfiESpPRzF+cAt2ewSwL+Ss4LJrlDZKoKSBXRnsBYb0dJf0wscGb00aV/GBo8EKJuFOCIRfAXNS1UvDxHZOKOP9bGHfivTGBiCMVTl71Q8nHLGQF8xzM52Ixk+XLv/pkuTxwj9z8nOyfVbIW0zDoGx8YzwJ3QWuZIJWVcKHCEtJllBxCWwXWStOSqqhxxDb8fVN1AOf/BpDM2RxTTUWTsZSqhp1p63G+i/Vp7PrwYScU7aj827PjHTH3EIuKbNfxNNb7uivUArVivWyWHgphxvq3eioyBj3iMgkSx4bal0lZ+NbDf0zodvU78bYSOPappxykvBVWtzTFiPhv0KZhSrFB10H5qOvXsa/lbSpNTkMV1xDdyAwpGFMZNUZaHM6BoLxyeGAhcxcvKtJg2+Mw8XQZio+w1j82UtsyGH5eLMP5GNfA89EIzc05F81wwp/ozNhQGnZQ/jrJc1EJIgwt+oTtn4dAo1hwK3bXnzMl/7tJEP1Fys5ixx6D+D/aRM= X-Microsoft-Exchange-Diagnostics: 1; CY4PR07MB3173; 6:f4QneCbhPDrnFsE63OxllHDaaD4IkFH3YS4E67o57I7s6AfPXy1xrPQFSV4UmbM0T2wFadf1cDY87y1Hm1HuWm/JacQfsKMLdh6ZoERjAvIFYdjPWUuUvdpteunZZ4LgbhgH4Eru1LwWCExxeZ7lSxMldT6GohhGe+nuBqjrHPUgQa7kvA42xWd74p8dCuOHR0ZKHKYj+Vt/XAslwpGIo3Ri/LqRKQuZawCxS19Z+Tsd9rz0UKetNoCfH3EhM0PossZMwVofcoc7K40gkLQzbPKPxotMGO5ZseiyRrMYpzdR35wZXvQZH9Cwx6/r/vW5kWPHuc8eD0svKnzPLB6jH7PJxrPsypgan/lxtawAGj4=; 5:w1zT765prYdFMZzu0TOiZWnq6oa+4x3zO/gbeh4/Jm3Ti0oERGree0wnyb/JBFc/hPxx2VCJgCGWsIL1qN/prY/OuJO5zRHnQ2Ik25epOo7dHSY9mGLQzgkBqBWDqJ0WOJYOND8TiZ3f8YIZO/ez+iC8wCKHM15SXZkmS1twfpo=; 24:10JcJppCrBnN45vkfDXBYE/SS81znafohpzb4sXqdVtvVmugSmKREqx3d/cSOOedH/45sld7U/SyHoFQ42kQ5ylkFluFvAnM2hOZMD/4pOQ=; 7:hJm8O6zQtsNdP446Nr7abzE82ya8VE1mY/OyTz6gMdaIhhrt5wInrF/KlIMgqKL4vXxZAEKSxB3seVAp8tRQC5kCuZwWoxbzzR/3V3fJfvCbO+O4f4Ov5iAUXfC+wpDCVK2zonKfwWM6XIeMH7bpHulxnUhHtcIEGd7rd5YeN51zx0iuymsslxfhJy3u8T0spjrVyW3r+TgB5J8CEMIc7XKILi3G1eM7nOfOVE1Khib9g1jqp/XKk0abWJWZ0ZCL SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: cavium.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Oct 2017 23:18:22.8341 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: d855eb5c-c3a0-4fcd-5442-08d51cc7da79 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 711e4ccf-2e9b-4bcf-a551-4094005b6194 X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY4PR07MB3173 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Intiyaz Basha Defer ringing the Tx doorbell if skb->xmit_more is set unless the Tx queue is full or stopped. To keep latency low, use a deferral limit of 8 packets. We chose 8 because Octeon can fetch at most 8 packets in a single PCI read, and our tests show that 8 results in low latency. Signed-off-by: Intiyaz Basha Signed-off-by: Satanand Burla Signed-off-by: Felix Manlunas --- Patch Change Log: V1 -> V2: Add a Tx doorbell ring deferral limit as suggested by David Miller drivers/net/ethernet/cavium/liquidio/lio_core.c | 6 ++++-- drivers/net/ethernet/cavium/liquidio/lio_main.c | 18 ++++++++++++------ drivers/net/ethernet/cavium/liquidio/lio_vf_main.c | 17 ++++++++++++----- drivers/net/ethernet/cavium/liquidio/octeon_config.h | 2 ++ drivers/net/ethernet/cavium/liquidio/octeon_iq.h | 3 +++ drivers/net/ethernet/cavium/liquidio/octeon_main.h | 2 +- drivers/net/ethernet/cavium/liquidio/octeon_nic.c | 5 +++-- drivers/net/ethernet/cavium/liquidio/octeon_nic.h | 3 ++- drivers/net/ethernet/cavium/liquidio/request_manager.c | 18 ++++++++++++++++-- 9 files changed, 55 insertions(+), 19 deletions(-) diff --git a/drivers/net/ethernet/cavium/liquidio/lio_core.c b/drivers/net/ethernet/cavium/liquidio/lio_core.c index 23f6b60..b891d85 100644 --- a/drivers/net/ethernet/cavium/liquidio/lio_core.c +++ b/drivers/net/ethernet/cavium/liquidio/lio_core.c @@ -91,7 +91,7 @@ void octeon_update_tx_completion_counters(void *buf, int reqtype, *bytes_compl += skb->len; } -void octeon_report_sent_bytes_to_bql(void *buf, int reqtype) +int octeon_report_sent_bytes_to_bql(void *buf, int reqtype) { struct octnet_buf_free_info *finfo; struct sk_buff *skb; @@ -112,11 +112,13 @@ void octeon_report_sent_bytes_to_bql(void *buf, int reqtype) break; default: - return; + return 0; } txq = netdev_get_tx_queue(skb->dev, skb_get_queue_mapping(skb)); netdev_tx_sent_queue(txq, skb->len); + + return netif_xmit_stopped(txq); } void liquidio_link_ctrl_cmd_completion(void *nctrl_ptr) diff --git a/drivers/net/ethernet/cavium/liquidio/lio_main.c b/drivers/net/ethernet/cavium/liquidio/lio_main.c index eafae3e..fb25b0b 100644 --- a/drivers/net/ethernet/cavium/liquidio/lio_main.c +++ b/drivers/net/ethernet/cavium/liquidio/lio_main.c @@ -2479,7 +2479,8 @@ static void handle_timestamp(struct octeon_device *oct, */ static inline int send_nic_timestamp_pkt(struct octeon_device *oct, struct octnic_data_pkt *ndata, - struct octnet_buf_free_info *finfo) + struct octnet_buf_free_info *finfo, + int xmit_more) { int retval; struct octeon_soft_command *sc; @@ -2514,7 +2515,7 @@ static inline int send_nic_timestamp_pkt(struct octeon_device *oct, len = (u32)((struct octeon_instr_ih2 *) (&sc->cmd.cmd2.ih2))->dlengsz; - ring_doorbell = 1; + ring_doorbell = !xmit_more; retval = octeon_send_command(oct, sc->iq_no, ring_doorbell, &sc->cmd, sc, len, ndata->reqtype); @@ -2548,7 +2549,7 @@ static int liquidio_xmit(struct sk_buff *skb, struct net_device *netdev) union tx_info *tx_info; int status = 0; int q_idx = 0, iq_no = 0; - int j; + int j, xmit_more = 0; u64 dptr = 0; u32 tag = 0; @@ -2753,17 +2754,19 @@ static int liquidio_xmit(struct sk_buff *skb, struct net_device *netdev) irh->vlan = skb_vlan_tag_get(skb) & 0xfff; } + xmit_more = skb->xmit_more; + if (unlikely(cmdsetup.s.timestamp)) - status = send_nic_timestamp_pkt(oct, &ndata, finfo); + status = send_nic_timestamp_pkt(oct, &ndata, finfo, xmit_more); else - status = octnet_send_nic_data_pkt(oct, &ndata); + status = octnet_send_nic_data_pkt(oct, &ndata, xmit_more); if (status == IQ_SEND_FAILED) goto lio_xmit_failed; netif_info(lio, tx_queued, lio->netdev, "Transmit queued successfully\n"); if (status == IQ_SEND_STOP) - stop_q(lio->netdev, q_idx); + stop_q(netdev, q_idx); netif_trans_update(netdev); @@ -2782,6 +2785,9 @@ static int liquidio_xmit(struct sk_buff *skb, struct net_device *netdev) if (dptr) dma_unmap_single(&oct->pci_dev->dev, dptr, ndata.datasize, DMA_TO_DEVICE); + + octeon_ring_doorbell_locked(oct, iq_no); + tx_buffer_free(skb); return NETDEV_TX_OK; } diff --git a/drivers/net/ethernet/cavium/liquidio/lio_vf_main.c b/drivers/net/ethernet/cavium/liquidio/lio_vf_main.c index 4c3b568..00c1930 100644 --- a/drivers/net/ethernet/cavium/liquidio/lio_vf_main.c +++ b/drivers/net/ethernet/cavium/liquidio/lio_vf_main.c @@ -1690,7 +1690,8 @@ static void handle_timestamp(struct octeon_device *oct, u32 status, void *buf) */ static int send_nic_timestamp_pkt(struct octeon_device *oct, struct octnic_data_pkt *ndata, - struct octnet_buf_free_info *finfo) + struct octnet_buf_free_info *finfo, + int xmit_more) { struct octeon_soft_command *sc; int ring_doorbell; @@ -1720,7 +1721,7 @@ static int send_nic_timestamp_pkt(struct octeon_device *oct, len = (u32)((struct octeon_instr_ih3 *)(&sc->cmd.cmd3.ih3))->dlengsz; - ring_doorbell = 1; + ring_doorbell = !xmit_more; retval = octeon_send_command(oct, sc->iq_no, ring_doorbell, &sc->cmd, sc, len, ndata->reqtype); @@ -1752,6 +1753,7 @@ static int liquidio_xmit(struct sk_buff *skb, struct net_device *netdev) struct octeon_device *oct; int q_idx = 0, iq_no = 0; union tx_info *tx_info; + int xmit_more = 0; struct lio *lio; int status = 0; u64 dptr = 0; @@ -1940,10 +1942,12 @@ static int liquidio_xmit(struct sk_buff *skb, struct net_device *netdev) irh->vlan = skb_vlan_tag_get(skb) & VLAN_VID_MASK; } + xmit_more = skb->xmit_more; + if (unlikely(cmdsetup.s.timestamp)) - status = send_nic_timestamp_pkt(oct, &ndata, finfo); + status = send_nic_timestamp_pkt(oct, &ndata, finfo, xmit_more); else - status = octnet_send_nic_data_pkt(oct, &ndata); + status = octnet_send_nic_data_pkt(oct, &ndata, xmit_more); if (status == IQ_SEND_FAILED) goto lio_xmit_failed; @@ -1952,7 +1956,7 @@ static int liquidio_xmit(struct sk_buff *skb, struct net_device *netdev) if (status == IQ_SEND_STOP) { dev_err(&oct->pci_dev->dev, "Rcvd IQ_SEND_STOP signal; stopping IQ-%d\n", iq_no); - stop_q(lio->netdev, q_idx); + stop_q(netdev, q_idx); } netif_trans_update(netdev); @@ -1972,6 +1976,9 @@ static int liquidio_xmit(struct sk_buff *skb, struct net_device *netdev) if (dptr) dma_unmap_single(&oct->pci_dev->dev, dptr, ndata.datasize, DMA_TO_DEVICE); + + octeon_ring_doorbell_locked(oct, iq_no); + tx_buffer_free(skb); return NETDEV_TX_OK; } diff --git a/drivers/net/ethernet/cavium/liquidio/octeon_config.h b/drivers/net/ethernet/cavium/liquidio/octeon_config.h index 63bd9c9..ceac743 100644 --- a/drivers/net/ethernet/cavium/liquidio/octeon_config.h +++ b/drivers/net/ethernet/cavium/liquidio/octeon_config.h @@ -37,6 +37,8 @@ #define MAX_OCTEON_LINKS MAX_OCTEON_NICIF #define MAX_OCTEON_MULTICAST_ADDR 32 +#define MAX_OCTEON_FILL_COUNT 8 + /* CN6xxx IQ configuration macros */ #define CN6XXX_MAX_INPUT_QUEUES 32 #define CN6XXX_MAX_IQ_DESCRIPTORS 2048 diff --git a/drivers/net/ethernet/cavium/liquidio/octeon_iq.h b/drivers/net/ethernet/cavium/liquidio/octeon_iq.h index 5c3c8da..81c9876 100644 --- a/drivers/net/ethernet/cavium/liquidio/octeon_iq.h +++ b/drivers/net/ethernet/cavium/liquidio/octeon_iq.h @@ -343,6 +343,9 @@ int octeon_init_instr_queue(struct octeon_device *octeon_dev, int lio_wait_for_instr_fetch(struct octeon_device *oct); +void +octeon_ring_doorbell_locked(struct octeon_device *oct, u32 iq_no); + int octeon_register_reqtype_free_fn(struct octeon_device *oct, int reqtype, void (*fn)(void *)); diff --git a/drivers/net/ethernet/cavium/liquidio/octeon_main.h b/drivers/net/ethernet/cavium/liquidio/octeon_main.h index 32ef3a7..c846eec 100644 --- a/drivers/net/ethernet/cavium/liquidio/octeon_main.h +++ b/drivers/net/ethernet/cavium/liquidio/octeon_main.h @@ -63,7 +63,7 @@ struct octnet_buf_free_info { }; /* BQL-related functions */ -void octeon_report_sent_bytes_to_bql(void *buf, int reqtype); +int octeon_report_sent_bytes_to_bql(void *buf, int reqtype); void octeon_update_tx_completion_counters(void *buf, int reqtype, unsigned int *pkts_compl, unsigned int *bytes_compl); diff --git a/drivers/net/ethernet/cavium/liquidio/octeon_nic.c b/drivers/net/ethernet/cavium/liquidio/octeon_nic.c index b457cf2..150609b 100644 --- a/drivers/net/ethernet/cavium/liquidio/octeon_nic.c +++ b/drivers/net/ethernet/cavium/liquidio/octeon_nic.c @@ -82,9 +82,10 @@ } int octnet_send_nic_data_pkt(struct octeon_device *oct, - struct octnic_data_pkt *ndata) + struct octnic_data_pkt *ndata, + int xmit_more) { - int ring_doorbell = 1; + int ring_doorbell = !xmit_more; return octeon_send_command(oct, ndata->q_no, ring_doorbell, &ndata->cmd, ndata->buf, ndata->datasize, diff --git a/drivers/net/ethernet/cavium/liquidio/octeon_nic.h b/drivers/net/ethernet/cavium/liquidio/octeon_nic.h index 6480ef8..de4130d 100644 --- a/drivers/net/ethernet/cavium/liquidio/octeon_nic.h +++ b/drivers/net/ethernet/cavium/liquidio/octeon_nic.h @@ -279,7 +279,8 @@ static inline int octnet_iq_is_full(struct octeon_device *oct, u32 q_no) * queue should be stopped, and IQ_SEND_OK if it sent okay. */ int octnet_send_nic_data_pkt(struct octeon_device *oct, - struct octnic_data_pkt *ndata); + struct octnic_data_pkt *ndata, + int xmit_more); /** Send a NIC control packet to the device * @param oct - octeon device pointer diff --git a/drivers/net/ethernet/cavium/liquidio/request_manager.c b/drivers/net/ethernet/cavium/liquidio/request_manager.c index 1e0fbce..a104597 100644 --- a/drivers/net/ethernet/cavium/liquidio/request_manager.c +++ b/drivers/net/ethernet/cavium/liquidio/request_manager.c @@ -278,6 +278,18 @@ int lio_wait_for_instr_fetch(struct octeon_device *oct) } } +void +octeon_ring_doorbell_locked(struct octeon_device *oct, u32 iq_no) +{ + struct octeon_instr_queue *iq; + + iq = oct->instr_queue[iq_no]; + spin_lock(&iq->post_lock); + if (iq->fill_cnt) + ring_doorbell(oct, iq); + spin_unlock(&iq->post_lock); +} + static inline void __copy_cmd_into_iq(struct octeon_instr_queue *iq, u8 *cmd) { @@ -543,6 +555,7 @@ static void check_db_timeout(struct work_struct *work) u32 force_db, void *cmd, void *buf, u32 datasize, u32 reqtype) { + int xmit_stopped; struct iq_post_status st; struct octeon_instr_queue *iq = oct->instr_queue[iq_no]; @@ -554,12 +567,13 @@ static void check_db_timeout(struct work_struct *work) st = __post_command2(iq, cmd); if (st.status != IQ_SEND_FAILED) { - octeon_report_sent_bytes_to_bql(buf, reqtype); + xmit_stopped = octeon_report_sent_bytes_to_bql(buf, reqtype); __add_to_request_list(iq, st.index, buf, reqtype); INCR_INSTRQUEUE_PKT_COUNT(oct, iq_no, bytes_sent, datasize); INCR_INSTRQUEUE_PKT_COUNT(oct, iq_no, instr_posted, 1); - if (force_db) + if (iq->fill_cnt >= MAX_OCTEON_FILL_COUNT || force_db || + xmit_stopped || st.status == IQ_SEND_STOP) ring_doorbell(oct, iq); } else { INCR_INSTRQUEUE_PKT_COUNT(oct, iq_no, instr_dropped, 1);