From patchwork Sun Aug 24 13:42:16 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Borkmann X-Patchwork-Id: 382501 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 B9E801400A3 for ; Sun, 24 Aug 2014 23:42:37 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752693AbaHXNmZ (ORCPT ); Sun, 24 Aug 2014 09:42:25 -0400 Received: from mx1.redhat.com ([209.132.183.28]:1580 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752573AbaHXNmX (ORCPT ); Sun, 24 Aug 2014 09:42:23 -0400 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s7ODgM0W018552 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Sun, 24 Aug 2014 09:42:22 -0400 Received: from localhost (vpn1-7-202.ams2.redhat.com [10.36.7.202]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s7ODgLJ5029328; Sun, 24 Aug 2014 09:42:21 -0400 From: Daniel Borkmann To: davem@davemloft.net Cc: netdev@vger.kernel.org Subject: [RFC PATCH net-next 1/3] ixgbe: support netdev_ops->ndo_xmit_flush() Date: Sun, 24 Aug 2014 15:42:16 +0200 Message-Id: <1408887738-7661-2-git-send-email-dborkman@redhat.com> In-Reply-To: <1408887738-7661-1-git-send-email-dborkman@redhat.com> References: <1408887738-7661-1-git-send-email-dborkman@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This implements the deferred tail pointer flush API for the ixgbe driver. Similar version also proposed longer time ago by Alexander Duyck. Signed-off-by: Daniel Borkmann --- drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 28 +++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c index 87bd53f..4e073cf 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c @@ -6957,10 +6957,6 @@ static void ixgbe_tx_map(struct ixgbe_ring *tx_ring, i = 0; tx_ring->next_to_use = i; - - /* notify HW of packet */ - ixgbe_write_tail(tx_ring, i); - return; dma_error: dev_err(tx_ring->dev, "TX DMA map failed\n"); @@ -7301,6 +7297,29 @@ static netdev_tx_t ixgbe_xmit_frame(struct sk_buff *skb, return __ixgbe_xmit_frame(skb, netdev, NULL); } +static inline struct ixgbe_ring * +__ixgb_tx_queue_mapping(struct ixgbe_adapter *adapter, u16 queue) +{ + if (unlikely(queue >= adapter->num_tx_queues)) + queue = queue % adapter->num_tx_queues; + + return adapter->tx_ring[queue]; +} + +static void ixgbe_xmit_flush(struct net_device *netdev, u16 queue) +{ + struct ixgbe_adapter *adapter = netdev_priv(netdev); + struct ixgbe_ring *tx_ring; + + tx_ring = __ixgb_tx_queue_mapping(adapter, queue); + ixgbe_write_tail(tx_ring, tx_ring->next_to_use); + + /* we need this if more than one processor can write to our tail + * at a time, it synchronizes IO on IA64/Altix systems + */ + mmiowb(); +} + /** * ixgbe_set_mac - Change the Ethernet Address of the NIC * @netdev: network interface device structure @@ -7914,6 +7933,7 @@ static const struct net_device_ops ixgbe_netdev_ops = { .ndo_open = ixgbe_open, .ndo_stop = ixgbe_close, .ndo_start_xmit = ixgbe_xmit_frame, + .ndo_xmit_flush = ixgbe_xmit_flush, .ndo_select_queue = ixgbe_select_queue, .ndo_set_rx_mode = ixgbe_set_rx_mode, .ndo_validate_addr = eth_validate_addr,