Received: by 2002:a25:31c3:0:0:0:0:0 with SMTP id x186csp4496012ybx; Mon, 4 Nov 2019 14:22:17 -0800 (PST) X-Google-Smtp-Source: APXvYqzYsYt26JKwGnFfT1ajQApDtSYmML9nSQHd2/4ue4CzIhMmQnQ6HbtEamV427cVlmf6H9Pq X-Received: by 2002:a17:906:1e07:: with SMTP id g7mr27012321ejj.256.1572906137008; Mon, 04 Nov 2019 14:22:17 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1572906137; cv=none; d=google.com; s=arc-20160816; b=DlT8K3OCs7UjZWh0V+CzE9Z0XpDosEtYqawQmnBGAVpX8sPEJfdU8750WSDchdqKOe ymEcy9zrAYHtf1j/DHvKSMAD8GFDwhN/f7lcpArw9y2zVur2N5IRfKUrHH2Nd+5Wipos RyVobPqv2Tj4oVbfxs8hsdLpSnqnBWgvjnzRbkVrw/ihB3lld7N2/EKMmuuqazsFL70U uXWgxMsCxw13Lu40rUbuKxr/9w40NDhul884cOXGBMD86SMqeX6J7SHwH6oCmXJ0TM9h 4vX4iGrXCHHva22SkTJKRVfIvays0ECP41OG/Q3+/bsSm/bReg9TnEORDTmFmyJNm2io E8jg== 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:dkim-signature; bh=N5pATneq+Gv96BO7zdCXs5S8tpsS5aI92V4wclVOJyU=; b=AUbbTBryW4u1ScSWHW1GH1TsZGjTydN5eJMpuOpPHJp3Auda02r/bfTB2rjFyLnzoY NMxcRDgfA87glSRJUPhBMO84mD5n7QbmUG4SbA3XP/VyGxKbn9TBt0H99Cf3j3jWxgIC b54+bmujh1jgjQ0oUmENibV0cP+AKHndN7QW1JB+soUAu4zuzm22Vix3aix1IWgk5fLe ULFszaYBVPRXTl0+G2mOuY6JeVVuDDIN5EKB3eONAWzp8wPpot7q7VytLvz+eHaYdND4 bcb2RcSdD8D9bZsTZ2e62LMH2X7Rx3FDY3Q8JgfVN/OsWrADSopljdDRk3s7R2bheZz6 rlTA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=Ix2cOJhq; 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 z13si12156127ejw.409.2019.11.04.14.21.44; Mon, 04 Nov 2019 14:22:16 -0800 (PST) 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; dkim=pass header.i=@kernel.org header.s=default header.b=Ix2cOJhq; 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 S2388059AbfKDV6f (ORCPT + 99 others); Mon, 4 Nov 2019 16:58:35 -0500 Received: from mail.kernel.org ([198.145.29.99]:55430 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730613AbfKDV63 (ORCPT ); Mon, 4 Nov 2019 16:58:29 -0500 Received: from localhost (6.204-14-84.ripe.coltfrance.com [84.14.204.6]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id BD68F214D8; Mon, 4 Nov 2019 21:58:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1572904708; bh=atw4UZaQccT3eKFCQyThccWL3IxyuknKXsMHVAawv3s=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Ix2cOJhqqFH9NgYxOqyfek6LSv8Q/pB0N4D+ph2yyZ4zPyl4NaDRpMKN4+flje6iR zEM25nOXwIDfj6nWc8u7izGng5TlFgaXIw+loGq9dbtdRXjJ4ME1A8p4tvdlmmmOty /zCZzD/JuKMnDn5fU8R9A63hsBBtg1YX9v/ArrOE= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Ahmad Masri , Maya Erez , Kalle Valo , Sasha Levin Subject: [PATCH 4.19 008/149] wil6210: fix freeing of rx buffers in EDMA mode Date: Mon, 4 Nov 2019 22:43:21 +0100 Message-Id: <20191104212130.291278374@linuxfoundation.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191104212126.090054740@linuxfoundation.org> References: <20191104212126.090054740@linuxfoundation.org> User-Agent: quilt/0.66 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 From: Ahmad Masri [ Upstream commit 6470f31927b46846d957628b719dcfda05446664 ] After being associated with some EDMA rx traffic, upon "down" driver doesn't free all skbs in the rx ring. Modify wil_move_all_rx_buff_to_free_list to loop on active list of rx buffers, unmap the physical memory and free the skb. Signed-off-by: Ahmad Masri Signed-off-by: Maya Erez Signed-off-by: Kalle Valo Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/wil6210/txrx_edma.c | 44 +++++++------------- 1 file changed, 14 insertions(+), 30 deletions(-) diff --git a/drivers/net/wireless/ath/wil6210/txrx_edma.c b/drivers/net/wireless/ath/wil6210/txrx_edma.c index 3e7fc2983cbb3..409a6fa8b6c8f 100644 --- a/drivers/net/wireless/ath/wil6210/txrx_edma.c +++ b/drivers/net/wireless/ath/wil6210/txrx_edma.c @@ -234,9 +234,10 @@ static int wil_rx_refill_edma(struct wil6210_priv *wil) struct wil_ring *ring = &wil->ring_rx; u32 next_head; int rc = 0; - u32 swtail = *ring->edma_rx_swtail.va; + ring->swtail = *ring->edma_rx_swtail.va; - for (; next_head = wil_ring_next_head(ring), (next_head != swtail); + for (; next_head = wil_ring_next_head(ring), + (next_head != ring->swtail); ring->swhead = next_head) { rc = wil_ring_alloc_skb_edma(wil, ring, ring->swhead); if (unlikely(rc)) { @@ -264,43 +265,26 @@ static void wil_move_all_rx_buff_to_free_list(struct wil6210_priv *wil, struct wil_ring *ring) { struct device *dev = wil_to_dev(wil); - u32 next_tail; - u32 swhead = (ring->swhead + 1) % ring->size; + struct list_head *active = &wil->rx_buff_mgmt.active; dma_addr_t pa; - u16 dmalen; - for (; next_tail = wil_ring_next_tail(ring), (next_tail != swhead); - ring->swtail = next_tail) { - struct wil_rx_enhanced_desc dd, *d = ⅆ - struct wil_rx_enhanced_desc *_d = - (struct wil_rx_enhanced_desc *) - &ring->va[ring->swtail].rx.enhanced; - struct sk_buff *skb; - u16 buff_id; + while (!list_empty(active)) { + struct wil_rx_buff *rx_buff = + list_first_entry(active, struct wil_rx_buff, list); + struct sk_buff *skb = rx_buff->skb; - *d = *_d; - - /* Extract the SKB from the rx_buff management array */ - buff_id = __le16_to_cpu(d->mac.buff_id); - if (buff_id >= wil->rx_buff_mgmt.size) { - wil_err(wil, "invalid buff_id %d\n", buff_id); - continue; - } - skb = wil->rx_buff_mgmt.buff_arr[buff_id].skb; - wil->rx_buff_mgmt.buff_arr[buff_id].skb = NULL; if (unlikely(!skb)) { - wil_err(wil, "No Rx skb at buff_id %d\n", buff_id); + wil_err(wil, "No Rx skb at buff_id %d\n", rx_buff->id); } else { - pa = wil_rx_desc_get_addr_edma(&d->dma); - dmalen = le16_to_cpu(d->dma.length); - dma_unmap_single(dev, pa, dmalen, DMA_FROM_DEVICE); - + rx_buff->skb = NULL; + memcpy(&pa, skb->cb, sizeof(pa)); + dma_unmap_single(dev, pa, wil->rx_buf_len, + DMA_FROM_DEVICE); kfree_skb(skb); } /* Move the buffer from the active to the free list */ - list_move(&wil->rx_buff_mgmt.buff_arr[buff_id].list, - &wil->rx_buff_mgmt.free); + list_move(&rx_buff->list, &wil->rx_buff_mgmt.free); } } -- 2.20.1