From patchwork Tue Feb 16 14:14:47 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Pirko X-Patchwork-Id: 583432 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 19F34140291 for ; Wed, 17 Feb 2016 01:15:39 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=resnulli-us.20150623.gappssmtp.com header.i=@resnulli-us.20150623.gappssmtp.com header.b=Nk3j3HqZ; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932996AbcBPOPJ (ORCPT ); Tue, 16 Feb 2016 09:15:09 -0500 Received: from mail-wm0-f41.google.com ([74.125.82.41]:33987 "EHLO mail-wm0-f41.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932849AbcBPOPF (ORCPT ); Tue, 16 Feb 2016 09:15:05 -0500 Received: by mail-wm0-f41.google.com with SMTP id b205so111968499wmb.1 for ; Tue, 16 Feb 2016 06:15:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=resnulli-us.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=mJp4Hn9klCA+YeTbA2GYRShcBiHYW5mSiZDJbjs1kdU=; b=Nk3j3HqZGeY+OX8SiPAsutVF4eIEmmoK0UK2ovbm6qEfviDrpY66H73KiRH+kYWtpX qNMWOrs+Aa8mZXUi9BrPIyu/fGOL/OVKhUHiOayWklBTfFVfXcEAAoeVBoAsmVb2y3go R6Le1OOEfCF3hPLXFGkDqShZAfECrgRBkVFOWR4Kdvy0bIoJU4Rsqbdi3Om1mo/gTXvM WBpd9HumJtqjoxsRTmfNKxMc0ynGAgZNUmlDyj+nJE1T1q6Bjxpi6AoYDRFEX8HOhabE Cu6Q45b8LCCu/T7JhO8wPoHiFslOi1hf+2MKUl4wcEB3kPDGHzZuZ3pQCuTHgiXv8XTX 8dOA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=mJp4Hn9klCA+YeTbA2GYRShcBiHYW5mSiZDJbjs1kdU=; b=QS/A68HWZAjX41p6CMKGzBvSwhT3vgGBExVq06//kA6aeDLmdXqaL3i/Ja6z/8tPUS 2jWQ/izho5406AO9YkXKH4pIh+gtSrCAVSS3YpjzaCty3iWI6xlG1LS5ZcojNmBwU2fW R6lxLUQEjXYLnmO5qPUsvPNOaKBFg685yoFl8O5vtjDfAYRFEDg6AYEEzeKngAUjabEQ LfoSWtHRFwhuzl87y+3F3NQEoTG63QE7liV2KhzN0VQHNrEy/ElV65RzqjZcpEtpsq/0 qpDoJRngGqEl6ulSBBd9zTPgURRNyBVdtfyF4LQqBgjg5xrRtSfzygLXEEsLdFd9QK/l Ktxw== X-Gm-Message-State: AG10YORUlNIsNwmywNo4hZgmIAUdVdlb4DdxRYtpr/cUj4FSwKtrIAH8W62A9IPpY61vTw== X-Received: by 10.28.188.195 with SMTP id m186mr18464080wmf.64.1455632104017; Tue, 16 Feb 2016 06:15:04 -0800 (PST) Received: from localhost (ip-94-113-120-24.net.upcbroadband.cz. [94.113.120.24]) by smtp.gmail.com with ESMTPSA id e9sm30452458wja.25.2016.02.16.06.15.03 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 16 Feb 2016 06:15:03 -0800 (PST) From: Jiri Pirko To: netdev@vger.kernel.org Cc: davem@davemloft.net, sfeldma@gmail.com, idosch@mellanox.com, eladr@mellanox.com, tgraf@suug.ch, David.Laight@ACULAB.COM, john.fastabend@gmail.com, alexei.starovoitov@gmail.com, daniel@iogearbox.net, prem@barefootnetworks.com Subject: [patch net-next v2 09/13] rocker: pre-allocate wait structures during cmd ring init Date: Tue, 16 Feb 2016 15:14:47 +0100 Message-Id: <1455632091-10716-10-git-send-email-jiri@resnulli.us> X-Mailer: git-send-email 1.9.3 In-Reply-To: <1455632091-10716-1-git-send-email-jiri@resnulli.us> References: <1455632091-10716-1-git-send-email-jiri@resnulli.us> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Jiri Pirko This avoids need to alloc/free wait structure for every command call. Signed-off-by: Jiri Pirko --- drivers/net/ethernet/rocker/rocker_main.c | 87 +++++++++++++++++++++++-------- 1 file changed, 66 insertions(+), 21 deletions(-) diff --git a/drivers/net/ethernet/rocker/rocker_main.c b/drivers/net/ethernet/rocker/rocker_main.c index 0015dcb..8585d98 100644 --- a/drivers/net/ethernet/rocker/rocker_main.c +++ b/drivers/net/ethernet/rocker/rocker_main.c @@ -338,23 +338,19 @@ static void rocker_wait_init(struct rocker_wait *wait) rocker_wait_reset(wait); } -static struct rocker_wait *rocker_wait_create(struct rocker_port *rocker_port, - struct switchdev_trans *trans, - int flags) +static struct rocker_wait *rocker_wait_create(void) { struct rocker_wait *wait; - wait = rocker_kzalloc(trans, flags, sizeof(*wait)); + wait = kzalloc(sizeof(*wait), GFP_KERNEL); if (!wait) return NULL; - rocker_wait_init(wait); return wait; } -static void rocker_wait_destroy(struct switchdev_trans *trans, - struct rocker_wait *wait) +static void rocker_wait_destroy(struct rocker_wait *wait) { - rocker_kfree(trans, wait); + kfree(wait); } static bool rocker_wait_event_timeout(struct rocker_wait *wait, @@ -831,6 +827,53 @@ static void rocker_dma_ring_bufs_free(const struct rocker *rocker, } } +static int rocker_dma_cmd_ring_wait_alloc(struct rocker_desc_info *desc_info) +{ + struct rocker_wait *wait; + + wait = rocker_wait_create(); + if (!wait) + return -ENOMEM; + rocker_desc_cookie_ptr_set(desc_info, wait); + return 0; +} + +static void +rocker_dma_cmd_ring_wait_free(const struct rocker_desc_info *desc_info) +{ + struct rocker_wait *wait = rocker_desc_cookie_ptr_get(desc_info); + + rocker_wait_destroy(wait); +} + +static int rocker_dma_cmd_ring_waits_alloc(const struct rocker *rocker) +{ + const struct rocker_dma_ring_info *cmd_ring = &rocker->cmd_ring; + int i; + int err; + + for (i = 0; i < cmd_ring->size; i++) { + err = rocker_dma_cmd_ring_wait_alloc(&cmd_ring->desc_info[i]); + if (err) + goto rollback; + } + return 0; + +rollback: + for (i--; i >= 0; i--) + rocker_dma_cmd_ring_wait_free(&cmd_ring->desc_info[i]); + return err; +} + +static void rocker_dma_cmd_ring_waits_free(const struct rocker *rocker) +{ + const struct rocker_dma_ring_info *cmd_ring = &rocker->cmd_ring; + int i; + + for (i = 0; i < cmd_ring->size; i++) + rocker_dma_cmd_ring_wait_free(&cmd_ring->desc_info[i]); +} + static int rocker_dma_rings_init(struct rocker *rocker) { const struct pci_dev *pdev = rocker->pdev; @@ -853,6 +896,12 @@ static int rocker_dma_rings_init(struct rocker *rocker) goto err_dma_cmd_ring_bufs_alloc; } + err = rocker_dma_cmd_ring_waits_alloc(rocker); + if (err) { + dev_err(&pdev->dev, "failed to alloc command dma ring waits\n"); + goto err_dma_cmd_ring_waits_alloc; + } + err = rocker_dma_ring_create(rocker, ROCKER_DMA_EVENT, ROCKER_DMA_EVENT_DEFAULT_SIZE, &rocker->event_ring); @@ -875,6 +924,8 @@ err_dma_event_ring_bufs_alloc: err_dma_event_ring_create: rocker_dma_ring_bufs_free(rocker, &rocker->cmd_ring, PCI_DMA_BIDIRECTIONAL); +err_dma_cmd_ring_waits_alloc: + rocker_dma_cmd_ring_waits_free(rocker); err_dma_cmd_ring_bufs_alloc: rocker_dma_ring_destroy(rocker, &rocker->cmd_ring); return err; @@ -885,6 +936,7 @@ static void rocker_dma_rings_fini(struct rocker *rocker) rocker_dma_ring_bufs_free(rocker, &rocker->event_ring, PCI_DMA_BIDIRECTIONAL); rocker_dma_ring_destroy(rocker, &rocker->event_ring); + rocker_dma_cmd_ring_waits_free(rocker); rocker_dma_ring_bufs_free(rocker, &rocker->cmd_ring, PCI_DMA_BIDIRECTIONAL); rocker_dma_ring_destroy(rocker, &rocker->cmd_ring); @@ -1106,7 +1158,6 @@ static irqreturn_t rocker_cmd_irq_handler(int irq, void *dev_id) wait = rocker_desc_cookie_ptr_get(desc_info); if (wait->nowait) { rocker_desc_gen_clear(desc_info); - rocker_wait_destroy(NULL, wait); } else { rocker_wait_wake_up(wait); } @@ -1298,28 +1349,24 @@ static int rocker_cmd_exec(struct rocker_port *rocker_port, unsigned long lock_flags; int err; - wait = rocker_wait_create(rocker_port, trans, flags); - if (!wait) - return -ENOMEM; - wait->nowait = nowait; - spin_lock_irqsave(&rocker->cmd_ring_lock, lock_flags); desc_info = rocker_desc_head_get(&rocker->cmd_ring); if (!desc_info) { spin_unlock_irqrestore(&rocker->cmd_ring_lock, lock_flags); - err = -EAGAIN; - goto out; + return -EAGAIN; } + wait = rocker_desc_cookie_ptr_get(desc_info); + rocker_wait_init(wait); + wait->nowait = nowait; + err = prepare(rocker_port, desc_info, prepare_priv); if (err) { spin_unlock_irqrestore(&rocker->cmd_ring_lock, lock_flags); - goto out; + return err; } - rocker_desc_cookie_ptr_set(desc_info, wait); - if (!switchdev_trans_ph_prepare(trans)) rocker_desc_head_set(rocker, &rocker->cmd_ring, desc_info); @@ -1340,8 +1387,6 @@ static int rocker_cmd_exec(struct rocker_port *rocker_port, err = process(rocker_port, desc_info, process_priv); rocker_desc_gen_clear(desc_info); -out: - rocker_wait_destroy(trans, wait); return err; }