From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga14.intel.com ([192.55.52.115]:61665 "EHLO mga14.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S965710AbeCSR4Z (ORCPT ); Mon, 19 Mar 2018 13:56:25 -0400 From: Jeff Kirsher To: davem@davemloft.net Cc: Alexander Duyck , netdev@vger.kernel.org, nhorman@redhat.com, sassmann@redhat.com, jogreene@redhat.com, Jeff Kirsher Subject: [net-next 1/9] i40evf: Reorder configure_clsflower to avoid deadlock on error Date: Mon, 19 Mar 2018 10:56:51 -0700 Message-Id: <20180319175659.17685-2-jeffrey.t.kirsher@intel.com> In-Reply-To: <20180319175659.17685-1-jeffrey.t.kirsher@intel.com> References: <20180319175659.17685-1-jeffrey.t.kirsher@intel.com> Sender: netdev-owner@vger.kernel.org List-ID: From: Alexander Duyck While doing some code review I noticed that we can get into a state where we exit with the "IN_CRITICAL_TASK" bit set while notifying the PF of flower filters. This patch is meant to address that plus tweak the ordering of the while loop waiting on it slightly so that we don't wait an extra period after we have failed for the last time. Signed-off-by: Alexander Duyck Tested-by: Andrew Bowers Signed-off-by: Jeff Kirsher --- drivers/net/ethernet/intel/i40evf/i40evf_main.c | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/drivers/net/ethernet/intel/i40evf/i40evf_main.c b/drivers/net/ethernet/intel/i40evf/i40evf_main.c index 486cf491b000..7e7cd80abaf4 100644 --- a/drivers/net/ethernet/intel/i40evf/i40evf_main.c +++ b/drivers/net/ethernet/intel/i40evf/i40evf_main.c @@ -2791,14 +2791,7 @@ static int i40evf_configure_clsflower(struct i40evf_adapter *adapter, { int tc = tc_classid_to_hwtc(adapter->netdev, cls_flower->classid); struct i40evf_cloud_filter *filter = NULL; - int err = 0, count = 50; - - while (test_and_set_bit(__I40EVF_IN_CRITICAL_TASK, - &adapter->crit_section)) { - udelay(1); - if (--count == 0) - return -EINVAL; - } + int err = -EINVAL, count = 50; if (tc < 0) { dev_err(&adapter->pdev->dev, "Invalid traffic class\n"); @@ -2806,10 +2799,16 @@ static int i40evf_configure_clsflower(struct i40evf_adapter *adapter, } filter = kzalloc(sizeof(*filter), GFP_KERNEL); - if (!filter) { - err = -ENOMEM; - goto clearout; + if (!filter) + return -ENOMEM; + + while (test_and_set_bit(__I40EVF_IN_CRITICAL_TASK, + &adapter->crit_section)) { + if (--count == 0) + goto err; + udelay(1); } + filter->cookie = cls_flower->cookie; /* set the mask to all zeroes to begin with */ @@ -2834,7 +2833,7 @@ static int i40evf_configure_clsflower(struct i40evf_adapter *adapter, err: if (err) kfree(filter); -clearout: + clear_bit(__I40EVF_IN_CRITICAL_TASK, &adapter->crit_section); return err; } -- 2.14.3