From patchwork Wed Mar 22 00:59:14 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 741812 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 3vns591XJJz9s1h for ; Wed, 22 Mar 2017 12:08:45 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="VVdZh0rz"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758591AbdCVBIo (ORCPT ); Tue, 21 Mar 2017 21:08:44 -0400 Received: from mail-pf0-f182.google.com ([209.85.192.182]:35977 "EHLO mail-pf0-f182.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758583AbdCVBIm (ORCPT ); Tue, 21 Mar 2017 21:08:42 -0400 Received: by mail-pf0-f182.google.com with SMTP id o126so86735858pfb.3 for ; Tue, 21 Mar 2017 18:08:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=lJ8EFfdWWu51yk+6oFQTUpMBk/ch/xny2qUUXN3mjaU=; b=VVdZh0rzhlVJOzwKR7yk8oMboqZqHFVTJz0Anij1ojVxcV3evE4DNwtb8jeHUmvUbG SGdmdzq6l3TRhnKQfOGv20ubrwpZw6CENuVkdp7I7M9AgN4grW4ktMxvIiHMbLKfb8xh PxMzUMU4NhuZBZBpXumiIXuVVjM1WouD3iW6SKrWBOvD2xmdBYSyCGAxCjfS9MSVi0tV bcJZfo5cAW9XkzfzqAZmDUtNhHrvU69DmxtY4iaYpBUn6rqQKYXzQhku90O2l/cP1AZ0 y2Ja0RdOEsWR3KgoHvJS+c5LaEq8mAfVylZ9d/e0ZkJE9l4nTvM6EOF0KREwXOyf8HV8 lR/A== 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=lJ8EFfdWWu51yk+6oFQTUpMBk/ch/xny2qUUXN3mjaU=; b=VMQ2gQrFS9GrFuyxx04FAj+N2gQp8IHGP2JE4eliDidtNt3hFr8Oo4WNeeTk0VE5Q5 trarbeQbsHxGMwQOWLbJiPO0ms8w0qMYxY1KL4wuo65RC/gfLn2bEfamCV6G9EGLds6X aN5vfWm8zbBXfFy1IOR5IBPFCec0iMlJn1cIhy3npgehxdIi1ZYR1n1g++hmPHD+5hmr Al3fMyxCPTphAbRjMScb8e3eg/Wjnbjg2jTEOb0vmdGpSNC8kU2BpwUHfXDM/TQeyPYo X7t+COkITHHWnx2WmXa2Alw3LfCNQKPGG92wAaKlfkeY4zixuhEu32xM9r22q1Ec+YiD lpJQ== X-Gm-Message-State: AFeK/H3O8t0tzuLPemIAsgs8ErWRD7dgVdgwV63vuBunNWZgtNIUXVwimjLcoePKD3iETF66 X-Received: by 10.98.105.134 with SMTP id e128mr41749146pfc.19.1490144403680; Tue, 21 Mar 2017 18:00:03 -0700 (PDT) Received: from jkicinski-Precision-T1700.netronome.com ([75.53.12.129]) by smtp.gmail.com with ESMTPSA id x10sm41730182pfi.21.2017.03.21.18.00.02 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 21 Mar 2017 18:00:03 -0700 (PDT) From: Jakub Kicinski To: netdev@vger.kernel.org Cc: oss-drivers@netronome.com, kubakici@wp.pl, Jakub Kicinski Subject: [PATCH net-next 08/15] nfp: don't ignore return value of wait_event_interruptible Date: Tue, 21 Mar 2017 17:59:14 -0700 Message-Id: <20170322005921.10965-9-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170322005921.10965-1-jakub.kicinski@netronome.com> References: <20170322005921.10965-1-jakub.kicinski@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org When signal interrupts waiting for an area to become available we assume success. Pay attention to the return code. Unpack the code a little bit to make it more readable. Signed-off-by: Jakub Kicinski --- .../ethernet/netronome/nfp/nfpcore/nfp_cppcore.c | 56 +++++++++++++++------- 1 file changed, 38 insertions(+), 18 deletions(-) diff --git a/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_cppcore.c b/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_cppcore.c index 5189fedb0f4f..2e4796b52b84 100644 --- a/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_cppcore.c +++ b/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_cppcore.c @@ -411,9 +411,43 @@ nfp_cpp_area_alloc(struct nfp_cpp *cpp, u32 dest, */ void nfp_cpp_area_free(struct nfp_cpp_area *area) { + if (atomic_read(&area->refcount)) + nfp_warn(area->cpp, "Warning: freeing busy area\n"); nfp_cpp_area_put(area); } +static bool nfp_cpp_area_acquire_try(struct nfp_cpp_area *area, int *status) +{ + *status = area->cpp->op->area_acquire(area); + + return *status != -EAGAIN; +} + +static int __nfp_cpp_area_acquire(struct nfp_cpp_area *area) +{ + int err, status; + + if (atomic_inc_return(&area->refcount) > 1) + return 0; + + if (!area->cpp->op->area_acquire) + return 0; + + err = wait_event_interruptible(area->cpp->waitq, + nfp_cpp_area_acquire_try(area, &status)); + if (!err) + err = status; + if (err) { + nfp_warn(area->cpp, "Warning: area wait failed: %d\n", err); + atomic_dec(&area->refcount); + return err; + } + + nfp_cpp_area_get(area); + + return 0; +} + /** * nfp_cpp_area_acquire() - lock down a CPP area for access * @area: CPP area handle @@ -425,27 +459,13 @@ void nfp_cpp_area_free(struct nfp_cpp_area *area) */ int nfp_cpp_area_acquire(struct nfp_cpp_area *area) { - mutex_lock(&area->mutex); - if (atomic_inc_return(&area->refcount) == 1) { - int (*a_a)(struct nfp_cpp_area *); - - a_a = area->cpp->op->area_acquire; - if (a_a) { - int err; + int ret; - wait_event_interruptible(area->cpp->waitq, - (err = a_a(area)) != -EAGAIN); - if (err < 0) { - atomic_dec(&area->refcount); - mutex_unlock(&area->mutex); - return err; - } - } - } + mutex_lock(&area->mutex); + ret = __nfp_cpp_area_acquire(area); mutex_unlock(&area->mutex); - nfp_cpp_area_get(area); - return 0; + return ret; } /**