Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp3083885ybt; Mon, 29 Jun 2020 14:56:35 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz8rJVXj8YcBIucH6JGXJJ4ClcP4hVTSH9JSOPJoMeVl3R05h3gWoNoTmznG8HB+B8LO4Az X-Received: by 2002:a17:906:4447:: with SMTP id i7mr7358105ejp.191.1593467794986; Mon, 29 Jun 2020 14:56:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1593467794; cv=none; d=google.com; s=arc-20160816; b=fWxoBMZCbL0wrYYr1O7tmcW8khlIxkgL/8+7Sw9KT8Z0voRar+cWW/58uNk8c1DxEh 2+if4wPWHR7iZ0lSfBSSgFgo3ELJdpFgZMMy6MhhnS9t8zFzB+vEpL6kySSqNIS5e1a+ ScJS0S2WY14VQXw3O5xmFFgLPLC64wa+nft2bVHImJcxCRNf2Q0DiZybT+vLbC3an/7h GQWCPIXmG9HZ0iRsArNQU14Thmk7Up80tbQTjDYAHASj2iIv4ygNQZUyHULHBvII/S+4 vmV0wFg4a3j4uVVh6AKmYk1hxdpfxTBkSLxRNjykt7fKIULjUc2kjwvRCXKiE12LC41t sZKw== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=P2jWZHzMn9Kj7Vj+d4zRE8UDqxJW57I86fo6vrWFDGw=; b=U9G8MLztFMhJVGUKVw3udPrQn4BdSABbYDDmRX9GuNE5JcjS5k5ge43lXvSi3ckcSm 57qSQuKavApMp417RVwFInD9k4+vuuLWQBo9F1lrFN8lOHN039wKdTpH93ePe0e8XVH2 mtz81tkSeU5g1CFGovnbqBLIPRnqnj1pozTih5FHUA9rOzrtdHmMVMP3nXEqQt+RIWpo y7o+ztpABcdgMINRVR26HF8oh70jdtJvLKpZ3q49eRExvWEGD02Ln70movJPxKWPBxBn Q7mF2cTGxUyr5TrAby5JitR0zhhh9+RVzNEul3HhX/7oO+hF4f9tch1dejkxxjfL3ZPY ZAEg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=BmIOEF9N; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id a41si505780edf.30.2020.06.29.14.56.12; Mon, 29 Jun 2020 14:56:34 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=BmIOEF9N; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2404432AbgF2VxA (ORCPT + 99 others); Mon, 29 Jun 2020 17:53:00 -0400 Received: from mail.kernel.org ([198.145.29.99]:56788 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726641AbgF2Sfj (ORCPT ); Mon, 29 Jun 2020 14:35:39 -0400 Received: from sasha-vm.mshome.net (c-73-47-72-35.hsd1.nh.comcast.net [73.47.72.35]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 3B17B246F8; Mon, 29 Jun 2020 15:20:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1593444040; bh=LoVIHkXo/f1i0Yzxzmm7UVOq2WlhqMhxCMJ6m/utMNQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=BmIOEF9Nbj+iWj0nCmZBq70LFii2azKhG8j1j1h7Io/t+eJfC8nf7CHe8qEwKVk8a vbTXctfRj7TfLAHyymA5zhyNoMwzaXh7yItBs2JLK79lW/6ILz5x9AN9RNQNDLlcr8 Ic0pn4oi1gAJSjkO7itEPJsgI506meVfPeM0d+FU= From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Alexander Lobakin , Igor Russkikh , Michal Kalderon , "David S . Miller" , Sasha Levin Subject: [PATCH 5.7 147/265] net: qed: fix left elements count calculation Date: Mon, 29 Jun 2020 11:16:20 -0400 Message-Id: <20200629151818.2493727-148-sashal@kernel.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200629151818.2493727-1-sashal@kernel.org> References: <20200629151818.2493727-1-sashal@kernel.org> MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.7.7-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.7.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.7.7-rc1 X-KernelTest-Deadline: 2020-07-01T15:14+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Alexander Lobakin [ Upstream commit 97dd1abd026ae4e6a82fa68645928404ad483409 ] qed_chain_get_element_left{,_u32} returned 0 when the difference between producer and consumer page count was equal to the total page count. Fix this by conditional expanding of producer value (vs unconditional). This allowed to eliminate normalizaton against total page count, which was the cause of this bug. Misc: replace open-coded constants with common defines. Fixes: a91eb52abb50 ("qed: Revisit chain implementation") Signed-off-by: Alexander Lobakin Signed-off-by: Igor Russkikh Signed-off-by: Michal Kalderon Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- include/linux/qed/qed_chain.h | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/include/linux/qed/qed_chain.h b/include/linux/qed/qed_chain.h index 733fad7dfbed9..6d15040c642cb 100644 --- a/include/linux/qed/qed_chain.h +++ b/include/linux/qed/qed_chain.h @@ -207,28 +207,34 @@ static inline u32 qed_chain_get_cons_idx_u32(struct qed_chain *p_chain) static inline u16 qed_chain_get_elem_left(struct qed_chain *p_chain) { + u16 elem_per_page = p_chain->elem_per_page; + u32 prod = p_chain->u.chain16.prod_idx; + u32 cons = p_chain->u.chain16.cons_idx; u16 used; - used = (u16) (((u32)0x10000 + - (u32)p_chain->u.chain16.prod_idx) - - (u32)p_chain->u.chain16.cons_idx); + if (prod < cons) + prod += (u32)U16_MAX + 1; + + used = (u16)(prod - cons); if (p_chain->mode == QED_CHAIN_MODE_NEXT_PTR) - used -= p_chain->u.chain16.prod_idx / p_chain->elem_per_page - - p_chain->u.chain16.cons_idx / p_chain->elem_per_page; + used -= prod / elem_per_page - cons / elem_per_page; return (u16)(p_chain->capacity - used); } static inline u32 qed_chain_get_elem_left_u32(struct qed_chain *p_chain) { + u16 elem_per_page = p_chain->elem_per_page; + u64 prod = p_chain->u.chain32.prod_idx; + u64 cons = p_chain->u.chain32.cons_idx; u32 used; - used = (u32) (((u64)0x100000000ULL + - (u64)p_chain->u.chain32.prod_idx) - - (u64)p_chain->u.chain32.cons_idx); + if (prod < cons) + prod += (u64)U32_MAX + 1; + + used = (u32)(prod - cons); if (p_chain->mode == QED_CHAIN_MODE_NEXT_PTR) - used -= p_chain->u.chain32.prod_idx / p_chain->elem_per_page - - p_chain->u.chain32.cons_idx / p_chain->elem_per_page; + used -= (u32)(prod / elem_per_page - cons / elem_per_page); return p_chain->capacity - used; } -- 2.25.1