Received: by 2002:ac0:a582:0:0:0:0:0 with SMTP id m2-v6csp1356069imm; Tue, 2 Oct 2018 07:02:07 -0700 (PDT) X-Google-Smtp-Source: ACcGV61n4o0csuWDzojFwekPFlcTOf/c0+qx6aJi77yRsBIgeA0hDCSU+j95dz5Sz0jBhjMQsBjo X-Received: by 2002:a62:221c:: with SMTP id i28-v6mr11582516pfi.196.1538488927430; Tue, 02 Oct 2018 07:02:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1538488927; cv=none; d=google.com; s=arc-20160816; b=AWHpWTWeystgbpVyH7dNzLMDtd9lGcU9EkoviU1teA5+TZBYllEGztwstv4jnbVNW7 Eec7wjC9jcnWWvfEJgpUipJSeYYOsJY69an3uFShCaGosj/xdBvS1NJ/ttn0u+p05nXF xaIml2hLxI6M0V5XDiyKT1f2NVp+RX5Ypw+nOcxQZ44FNIInj2c+R87BpwLgoN6h4uHm WpRbG+J7qgkW+jJrsTL/2JV9XodtHKeQRZ8Fl7Bo5DxK3HbJ5YTJA/qaHMO+PJmAH69M IX5j/DZbvHQ5zJPAFXshLbV8sqLV2BnYeG5jkCOrEPQOtHkDv7IJrb241SdrvZahbvK/ nlcA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from; bh=X8myHQ5nkrUqHhaGWvI1WFR5Ai/0/MD0mFBFrEvjaUk=; b=j8yxWgkc7PQKVX3MwPTjw2/D41DLC7+rTSdKWNFS/O4q8TLyRoLIwGVmdVG93b5DP6 F/NP3dWuLPWFGfY3VSeWO+v4P97BnN+r80hB+msejel2HyB5DyOvejxWeEjGR3AV7Uob lG/iWXicWdN2/8vrDlyOjo8p6bq0YRLkFzB71PZZ/B8wpb8pwyCI8I0J5ettFoG4uJ/Z kToVjl+gCQ8gTLcHdYnpMVYEjLSlFtT2nBd9THwgl1t+vLIERfpGCRSzBSS5pgcNAupG f3NXXrLOeyhCKvk9eK0lfn+MzVh8rUoSha6zMKvtByvGfvkvUB2rt05vHpdu08CU3Gl5 n9Kw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id u30-v6si15999760pgk.293.2018.10.02.07.01.52; Tue, 02 Oct 2018 07:02:07 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730607AbeJBUOI (ORCPT + 99 others); Tue, 2 Oct 2018 16:14:08 -0400 Received: from mail.linuxfoundation.org ([140.211.169.12]:33716 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730552AbeJBUOH (ORCPT ); Tue, 2 Oct 2018 16:14:07 -0400 Received: from localhost (24-104-73-23-ip-static.hfc.comcastbusiness.net [24.104.73.23]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id 51A9DC4D; Tue, 2 Oct 2018 13:30:44 +0000 (UTC) From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Anirudh Venkataramanan , Tony Brelinski , Jeff Kirsher , Sasha Levin Subject: [PATCH 4.18 198/228] ice: Fix bugs in control queue processing Date: Tue, 2 Oct 2018 06:24:55 -0700 Message-Id: <20181002132511.332485495@linuxfoundation.org> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20181002132459.032960735@linuxfoundation.org> References: <20181002132459.032960735@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.18-stable review patch. If anyone has any objections, please let me know. ------------------ From: Anirudh Venkataramanan [ Upstream commit 3d6b640efcc1b07709b42dd2e9609401c6f88633 ] This patch is a consolidation of multiple bug fixes for control queue processing. 1) In ice_clean_adminq_subtask() remove unnecessary reads/writes to registers. The bits PFINT_FW_CTL, PFINT_MBX_CTL and PFINT_SB_CTL are not set when an interrupt arrives, which means that clearing them again can be omitted. 2) Get an accurate value in "pending" by re-reading the control queue head register from the hardware. 3) Fix a corner case involving lost control queue messages by checking for new control messages (using ice_ctrlq_pending) before exiting the cleanup routine. Signed-off-by: Anirudh Venkataramanan Tested-by: Tony Brelinski Signed-off-by: Jeff Kirsher Signed-off-by: Sasha Levin Signed-off-by: Greg Kroah-Hartman --- drivers/net/ethernet/intel/ice/ice_controlq.c | 5 ++++- drivers/net/ethernet/intel/ice/ice_main.c | 26 ++++++++++++++++++++++---- 2 files changed, 26 insertions(+), 5 deletions(-) --- a/drivers/net/ethernet/intel/ice/ice_controlq.c +++ b/drivers/net/ethernet/intel/ice/ice_controlq.c @@ -1065,8 +1065,11 @@ ice_clean_rq_elem(struct ice_hw *hw, str clean_rq_elem_out: /* Set pending if needed, unlock and return */ - if (pending) + if (pending) { + /* re-read HW head to calculate actual pending messages */ + ntu = (u16)(rd32(hw, cq->rq.head) & cq->rq.head_mask); *pending = (u16)((ntc > ntu ? cq->rq.count : 0) + (ntu - ntc)); + } clean_rq_elem_err: mutex_unlock(&cq->rq_lock); --- a/drivers/net/ethernet/intel/ice/ice_main.c +++ b/drivers/net/ethernet/intel/ice/ice_main.c @@ -917,13 +917,27 @@ static int __ice_clean_ctrlq(struct ice_ } /** + * ice_ctrlq_pending - check if there is a difference between ntc and ntu + * @hw: pointer to hardware info + * @cq: control queue information + * + * returns true if there are pending messages in a queue, false if there aren't + */ +static bool ice_ctrlq_pending(struct ice_hw *hw, struct ice_ctl_q_info *cq) +{ + u16 ntu; + + ntu = (u16)(rd32(hw, cq->rq.head) & cq->rq.head_mask); + return cq->rq.next_to_clean != ntu; +} + +/** * ice_clean_adminq_subtask - clean the AdminQ rings * @pf: board private structure */ static void ice_clean_adminq_subtask(struct ice_pf *pf) { struct ice_hw *hw = &pf->hw; - u32 val; if (!test_bit(__ICE_ADMINQ_EVENT_PENDING, pf->state)) return; @@ -933,9 +947,13 @@ static void ice_clean_adminq_subtask(str clear_bit(__ICE_ADMINQ_EVENT_PENDING, pf->state); - /* re-enable Admin queue interrupt causes */ - val = rd32(hw, PFINT_FW_CTL); - wr32(hw, PFINT_FW_CTL, (val | PFINT_FW_CTL_CAUSE_ENA_M)); + /* There might be a situation where new messages arrive to a control + * queue between processing the last message and clearing the + * EVENT_PENDING bit. So before exiting, check queue head again (using + * ice_ctrlq_pending) and process new messages if any. + */ + if (ice_ctrlq_pending(hw, &hw->adminq)) + __ice_clean_ctrlq(pf, ICE_CTL_Q_ADMIN); ice_flush(hw); }