From patchwork Mon Feb 6 21:55:39 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Chan X-Patchwork-Id: 724764 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3vHLsh34SWz9s2P for ; Tue, 7 Feb 2017 08:56:56 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=broadcom.com header.i=@broadcom.com header.b="MAp5D2xh"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751852AbdBFV4y (ORCPT ); Mon, 6 Feb 2017 16:56:54 -0500 Received: from mail-pf0-f179.google.com ([209.85.192.179]:35769 "EHLO mail-pf0-f179.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751746AbdBFV4I (ORCPT ); Mon, 6 Feb 2017 16:56:08 -0500 Received: by mail-pf0-f179.google.com with SMTP id f144so26939463pfa.2 for ; Mon, 06 Feb 2017 13:56:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=qp3KUbehhv4bv9TBz6x6cmlepJZufL+gpeE3ByfcOxk=; b=MAp5D2xhUbrhyOTHmj/vSY64amCxH2JXK3A+dwKtomt3DWf+9/xJNvYEaXshUJJ0Q9 X0ff28ACwSKTDIW9HJk1yMqcqev5Vl6Pc101GqyimZ8Lq50P+7M7A/2mnTMec8aLtXUN /1Aw7UFVZdrNMfwDVhs6s3oFXh5JZHtMGCYWk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=qp3KUbehhv4bv9TBz6x6cmlepJZufL+gpeE3ByfcOxk=; b=fTiEpNgXwL6Z9D4zFvx4JFmkLu/5rnp0cnJxByuCzAgZOBcesABJaAa9MVx3o5cbSI m3gwEQf9nhgtm1Hp7C1OXM6kc9gXbvfVvdQ7gf6mZwXwgtTRkgzpzBKQBm3y1GlZ1wpz 28MxGUmEvKn3CQ9rormr6YjA0RBpYgAPevgQwo2nJUPBSbvd1ZZMW+laE1v6dg3YMwKp 7pzkx1WwIcWU/HVZ0KNkasgBtZSvS4lb6wxvlCcZpC6KCxMZwWRpnLMTsTD3bpyne9BE xG7hHGIsKLKk4/ZOn9IqSl5QKsNeak+73fGSAmZG8njqFSRq++gzE+6XsDGipRa09xc2 mg3Q== X-Gm-Message-State: AIkVDXIf+yeqc/mjNuX1RvmkRfHrOxFf9kk6yZRnfTWhs2z/FrxtQNJXnqihgd6h6UjWItDw X-Received: by 10.84.136.135 with SMTP id 7mr20854650pll.149.1486418167526; Mon, 06 Feb 2017 13:56:07 -0800 (PST) Received: from localhost.broadcom.com ([192.19.255.250]) by smtp.gmail.com with ESMTPSA id q80sm5096374pfi.13.2017.02.06.13.56.06 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 06 Feb 2017 13:56:07 -0800 (PST) From: Michael Chan To: davem@davemloft.net Cc: netdev@vger.kernel.org Subject: [PATCH net-next v3 08/12] bnxt_en: Add tx ring mapping logic. Date: Mon, 6 Feb 2017 16:55:39 -0500 Message-Id: <1486418143-8958-9-git-send-email-michael.chan@broadcom.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1486418143-8958-1-git-send-email-michael.chan@broadcom.com> References: <1486418143-8958-1-git-send-email-michael.chan@broadcom.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org To support XDP_TX, we need to add a set of dedicated TX rings, each associated with the NAPI of an RX ring. To assign XDP rings and regular rings in a flexible way, we add a bp->tx_ring_map[] array to do the remapping. The netdev txq index is stored in the new field txq_index so that we can retrieve the netdev txq when handling TX completions. In this patch, before we introduce XDP_TX, the mapping is 1:1. v2: Fixed a bug in bnxt_tx_int(). Signed-off-by: Michael Chan --- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 15 ++++++++++++--- drivers/net/ethernet/broadcom/bnxt/bnxt.h | 2 ++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index 1b051f9..811bc82 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -262,8 +262,8 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev) return NETDEV_TX_OK; } - txr = &bp->tx_ring[i]; txq = netdev_get_tx_queue(dev, i); + txr = &bp->tx_ring[bp->tx_ring_map[i]]; prod = txr->tx_prod; free_size = bnxt_tx_avail(bp, txr); @@ -509,8 +509,7 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev) static void bnxt_tx_int(struct bnxt *bp, struct bnxt_napi *bnapi, int nr_pkts) { struct bnxt_tx_ring_info *txr = bnapi->tx_ring; - int index = txr - &bp->tx_ring[0]; - struct netdev_queue *txq = netdev_get_tx_queue(bp->dev, index); + struct netdev_queue *txq = netdev_get_tx_queue(bp->dev, txr->txq_index); u16 cons = txr->tx_cons; struct pci_dev *pdev = bp->pdev; int i; @@ -2975,6 +2974,8 @@ static void bnxt_free_mem(struct bnxt *bp, bool irq_re_init) bnxt_free_stats(bp); bnxt_free_ring_grps(bp); bnxt_free_vnics(bp); + kfree(bp->tx_ring_map); + bp->tx_ring_map = NULL; kfree(bp->tx_ring); bp->tx_ring = NULL; kfree(bp->rx_ring); @@ -3027,6 +3028,12 @@ static int bnxt_alloc_mem(struct bnxt *bp, bool irq_re_init) if (!bp->tx_ring) return -ENOMEM; + bp->tx_ring_map = kcalloc(bp->tx_nr_rings, sizeof(u16), + GFP_KERNEL); + + if (!bp->tx_ring_map) + return -ENOMEM; + if (bp->flags & BNXT_FLAG_SHARED_RINGS) j = 0; else @@ -3035,6 +3042,8 @@ static int bnxt_alloc_mem(struct bnxt *bp, bool irq_re_init) for (i = 0; i < bp->tx_nr_rings; i++, j++) { bp->tx_ring[i].bnapi = bp->bnapi[j]; bp->bnapi[j]->tx_ring = &bp->tx_ring[i]; + bp->tx_ring_map[i] = i; + bp->tx_ring[i].txq_index = i; } rc = bnxt_alloc_stats(bp); diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h index 3a079b8..97ccce1 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h @@ -566,6 +566,7 @@ struct bnxt_tx_ring_info { struct bnxt_napi *bnapi; u16 tx_prod; u16 tx_cons; + u16 txq_index; void __iomem *tx_doorbell; struct tx_bd *tx_desc_ring[MAX_TX_PAGES]; @@ -995,6 +996,7 @@ struct bnxt { struct bnxt_rx_ring_info *rx_ring; struct bnxt_tx_ring_info *tx_ring; + u16 *tx_ring_map; struct sk_buff * (*gro_func)(struct bnxt_tpa_info *, int, int, struct sk_buff *);