From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 46C98340282 for ; Sat, 8 Aug 2026 18:42:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786214563; cv=none; b=rIaNg9fHHBqCcIOP2w6JkykAPyIgm26JG/mdIf4Q+zqfgLYZaEs2jScRLzJFSBQ06oSLnjqJqM62CBZ2DalGMzRSyVhFPTKo98UtejS+pg3xIu5b6yLbdjgorShqv3TSJj0pnK+aYGEHfyd0Vh1U4Q4G7mc9L5wPEK/ysuew07Q= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786214563; c=relaxed/simple; bh=CXTNVWk0nM1c6uXQvrDt7Os7kFZuJq+eq97SupFvbmk=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=AcdZdxWGj0fGBeiLNYb2t0KyC/UCYO0eOSDnJ3JyQToq8CuMDY0qmPbWorNXYNvxcxNA4q4rfG5z2JRimPAU7IlEutHVDi3b1nwXHYU2LLnllBpbXaP2PTNX5u6g4iEmV1+NjiUrUNF/vrplMzHvNmE6eyFo8xGRBODD7Trg+Dk= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=KRHwmGjb; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=QiMp0+gu; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="KRHwmGjb"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="QiMp0+gu" Received: from pps.filterd (m0279862.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 678Gm4W7044779 for ; Sat, 8 Aug 2026 18:42:41 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= /DDHErlHnBZz4VB/m+ePIzuov6kkItLoeXRusC4Jtj0=; b=KRHwmGjby/MZWAt6 Y+w/dytUnBVUtxQyajM/anT1Dlooq2bHgMtgRZRyCfx7lnr4AdcHzxY1BZo/mXKB AkVuHREXgXsdEE5JX3KQsYXDMKag9qgm4r48MMpvjRqUU15uPmbVxjCJ0u5fGzM1 imCqfpjO7GiO97lYhGmCd7LD5AS5x1Mfl+vANiAb3eOf/ktg88zRhnmYX72RQEu6 ev7sgFotwJHJILp3L2721fTbmTu/NoZgIq9YIEKNrJl3aimb3xGJpzn4lpJmKvTc BxR50rG0Y+BgjzBFANhVZli5leWiA++U9GJI/IzVWNNZOcyUwA90op+wjaD3sLuo Opia2g== Received: from mail-pj1-f70.google.com (mail-pj1-f70.google.com [209.85.216.70]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4fww7csdwp-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Sat, 08 Aug 2026 18:42:41 +0000 (GMT) Received: by mail-pj1-f70.google.com with SMTP id 98e67ed59e1d1-38dbf293831so1824307a91.3 for ; Sat, 08 Aug 2026 11:42:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1786214561; x=1786819361; darn=vger.kernel.org; h=content-transfer-encoding:content-type:in-reply-to:from :content-language:references:cc:to:subject:user-agent:mime-version :date:message-id:from:to:cc:subject:date:message-id:reply-to :content-type; bh=/DDHErlHnBZz4VB/m+ePIzuov6kkItLoeXRusC4Jtj0=; b=QiMp0+guH8pvNbDgt1g5bx/JYF6ROf3ne29kpYciDtpwOKgqOYQOPGpnh3a4tdTUBZ w4RIXlwJCE8QhytJmUCfO3DO3U0XTCumuMh0ctd0RhYqt5Tn+Tif+l9upmAowolvAf+v LUd5meSgdu3NeuB2wkaMKB5/x+NXynlcbQsYigV3AsE7oftvBcn3JfAWYVSp6JIMuAY7 M3ir+xr/tmal/nemKf6LGoxnP8Deo5wgzjbK6q+Zro5N8FcRkljN19piSYeHgYa8lVnG nFMhfOxjx8udDYXyJs2/EK3i7jv+S4T4A+ey8PslzxyEi81Ncq6Vz37ZnTBfkfjiK9nt lp/g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786214561; x=1786819361; h=content-transfer-encoding:content-type:in-reply-to:from :content-language:references:cc:to:subject:user-agent:mime-version :date:message-id:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=/DDHErlHnBZz4VB/m+ePIzuov6kkItLoeXRusC4Jtj0=; b=Pq2ek7lnQEhL34aUcJmAb7llxfWYOyVf/Gzva2lfLNA4WUHgUg+RoezlNigr+YRCzZ Zq8HzQs/8uYUxq3baBil/P4QrIxTLaLGvapJVOADqDPl7jt49se4niwD9uSjb6ugKKn3 X9pnHjBpTZecZ6RUCvf55UN3KKX2fWLHPCOiaCpeDqsYh+T6tmswSgJEDeM0Pb78TYtG CwtKnsvqqOGEChZ6KaVPZz1wi49po4lfOJb2bsartLIxkxr589sw/iE+2/Aryq0nNmfC jx7i/nWwWjDykxuk16XFdr95wcV1JfCXtgt1QsxGPda2Djy3kCxzFvWZQcFPCzNT5fwr n9yw== X-Forwarded-Encrypted: i=1; AHgh+RoetzDx30TWnX8RCNciCdQC7WhDsSQO71gStxm44J/FU8CG66bmp3zr1a3EXu2SHDJ7iitxjNnm6Fs7Y88=@vger.kernel.org X-Gm-Message-State: AOJu0Yx65pKdrPJALK8//BNixYb/NFm6Bz+xEUC51PhfnpSKrh8UTdQu uQZp60GZz2U/Jugy5wFdndpazlOsSLNqpUcDY99irIO2MXAqv6n2OhmAF6FlTIIl0JQv+ofX8in 8heE8C+tDuuHP65Bi3kDYIE6Cd62YW6svi1XFe88pKKOOxwgMz3IBxajpxjaV4DWEeCA= X-Gm-Gg: AR+sD117v+N97mvFQ+XQ7nSXfH+p7kVC7IdVMrzs8Y1AggWCBT/M3smocF+Xb6OrxjK UK0qdp5BbxcsCp7BEPJKIaNehtMkqhydq7DibiD+2+Wto2Jqc0Doq0WP6e4vLDLdPQkO2nGytol 1n0LXiINAKTGZFOu3F8I8U89nZJMJETwl1zGMte74AmnlICCSUBGWDiZDNB1SfBLTZ+lG91vHti V9bDpOch5s5o/V8snSdRaXrl1PPSumExQotvhS5rdLUIWecVu6rezozR0FWrs40m6FQ2vYg+RTe z2kaMaNO9VuNTKRek6O4ndXqodv+Zcp3Fn+NZ10p9ZdQxIBRL4IGZCIjDvgR6fzhEWa3yqjGWov qMwcznM8ohMWvdVCX+rDDikJ+xfz4lsAFWqcyGM5wPr6+YG2AFnnq3JocaU1B X-Received: by 2002:a05:6a20:7290:b0:3c3:becb:b705 with SMTP id adf61e73a8af0-3cbc0431ddcmr13212934637.27.1786214560814; Sat, 08 Aug 2026 11:42:40 -0700 (PDT) X-Received: by 2002:a05:6a20:7290:b0:3c3:becb:b705 with SMTP id adf61e73a8af0-3cbc0431ddcmr13212896637.27.1786214560339; Sat, 08 Aug 2026 11:42:40 -0700 (PDT) Received: from [192.168.1.20] (103.sub-97-215-187.myvzw.com. [97.215.187.103]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-315beb88413sm36459413eec.18.2026.08.08.11.42.39 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sat, 08 Aug 2026 11:42:39 -0700 (PDT) Message-ID: <2774127a-01ce-4d26-b8fc-e68f49da2bbc@oss.qualcomm.com> Date: Sat, 8 Aug 2026 11:42:38 -0700 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v5 3/4] wifi: ath11k: implement custom wake_tx_queue with flow control To: Jose Ignacio Tornos Martinez , jjohnson@kernel.org Cc: ath11k@lists.infradead.org, ath12k@lists.infradead.org, linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org References: <20260807105843.20203-1-jtornosm@redhat.com> <20260807105843.20203-4-jtornosm@redhat.com> Content-Language: en-US From: Jeff Johnson In-Reply-To: <20260807105843.20203-4-jtornosm@redhat.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Proofpoint-GUID: Z7_DRkAb3j4g8CMbl_tdylgWqcYkfOef X-Proofpoint-ORIG-GUID: Z7_DRkAb3j4g8CMbl_tdylgWqcYkfOef X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODA4MDE2MSBTYWx0ZWRfX/WJYiAv//DOL i50ZYdNyYdpCO8ANv5iUc3BhiLCbmhVpTQE9fvG9jZQQtCqhJKvTiec96nRoxILKQkzM94v1g3H 8qpiwKy7Ram+FYKuuPtbhWwoMp73rwz200NL15vHF+KBowuEwO7hNnPg9onPdM27Ft714gjPJKK sAc3//nt24DYEIISScdBaEzhW0FBcXipmB99y0teSODDB4u+XFNQZRtywZJXREqpz1dtCLid60C +bnoyVO9gwBsvbGE6ypU3QwiRmaDQs8ipuXOxnek/sisTjbkXVjLeiWyA9V9Pd0qx+r1qUuKg1o 7TCk+mwPcSrWXgpmji4Ft9VaUAC94chIqVjfcKdemcojW245mclJQIDH1RBPPbInFTE+4mCcH6+ 6qPCjmtHCyDYgOOvziCLML1d41AzEOxLcOdCSUuWpX8uQMYbX3tAUJ4pCTzbkZEOtuICYH6+l1Q y2IScuKQsqphPNuUR3A== X-Proofpoint-Spam-Info: AW1haW4tMjYwODA4MDE2MSBTYWx0ZWRfX8dgic7MCIp7T ZgTI9ENVJRgbKgK5EeCVCgVbLjKmx68eqksKC0KzQnJBWwE5tbCgt144DW8LHhCdwgAEU4W1BB+ o4EpJGNIB8smp2zxND9/XweiZpBzaTY= X-Authority-Analysis: v=2.4 cv=IPsyzAvG c=1 sm=1 tr=0 ts=6a7778a1 cx=c_pps a=0uOsjrqzRL749jD1oC5vDA==:117 a=UaEkX0D7FlC0tWE/LoNF7Q==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_K5XuSEh1TEqbUxoQ0s3:22 a=VwQbUJbxAAAA:8 a=20KFwNOVAAAA:8 a=UlviFDkLi7K7RJw89-AA:9 a=QEXdDO2ut3YA:10 a=mQ_c8vxmzFEMiUWkPHU9:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-08-08_06,2026-08-07_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 phishscore=0 clxscore=1015 priorityscore=1501 suspectscore=0 bulkscore=0 impostorscore=0 adultscore=0 lowpriorityscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608080161 On 8/7/2026 3:58 AM, Jose Ignacio Tornos Martinez wrote: > Under heavy traffic, ath11k experiences frequent -ENOMEM errors > ("failed to transmit frame -12") when the hardware TCL ring fills up. > This issue is more commonly observed in VMs with PCIe passthrough but > also occurs on bare metal systems. It is particularly problematic on > devices with a single shared TCL ring where all traffic classes > compete for the same 512 descriptor slots. > > Implement a custom wake_tx_queue operation that: > > 1. Checks hardware ring space before dequeuing packets from mac80211 > 2. Uses per-ring locking (wake_tx_lock with spin_lock_bh) to serialize > concurrent wake_tx_queue calls targeting the same ring and to ensure > bottom halves are disabled as required by ieee80211_tx_dequeue() > 3. Syncs with hardware state to get accurate free slot count > 4. Resolves the target TCL ring using get_ring_selector(txq->ac), > which selects the ring based on the access category > 5. Returns early during firmware crash in the same way as other > tx paths > > This approach follows the pattern used in the iwlwifi driver, adapted > for ath11k's hardware ring architecture. > > This eliminates -ENOMEM errors and improves throughput by optimizing > resource usage and preventing unnecessary packet drops. Missing Tested-on tag > > Signed-off-by: Jose Ignacio Tornos Martinez > --- > v5: no modification > v4: https://lore.kernel.org/all/20260724053121.15759-4-jtornosm@redhat.com/ > > drivers/net/wireless/ath/ath11k/dp.c | 1 + > drivers/net/wireless/ath/ath11k/dp.h | 2 ++ > drivers/net/wireless/ath/ath11k/mac.c | 52 ++++++++++++++++++++++++++- > 3 files changed, 54 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/wireless/ath/ath11k/dp.c b/drivers/net/wireless/ath/ath11k/dp.c > index f389b97acbdd..2e5978ec2b05 100644 > --- a/drivers/net/wireless/ath/ath11k/dp.c > +++ b/drivers/net/wireless/ath/ath11k/dp.c > @@ -1087,6 +1087,7 @@ int ath11k_dp_alloc(struct ath11k_base *ab) > for (i = 0; i < ab->hw_params.hal_params->num_tx_rings; i++) { > idr_init(&dp->tx_ring[i].txbuf_idr); > spin_lock_init(&dp->tx_ring[i].tx_idr_lock); > + spin_lock_init(&dp->tx_ring[i].wake_tx_lock); > dp->tx_ring[i].tcl_data_ring_id = i; > > dp->tx_ring[i].tx_status_head = 0; > diff --git a/drivers/net/wireless/ath/ath11k/dp.h b/drivers/net/wireless/ath/ath11k/dp.h > index 84f66839f0c6..6d99501aa269 100644 > --- a/drivers/net/wireless/ath/ath11k/dp.h > +++ b/drivers/net/wireless/ath/ath11k/dp.h > @@ -87,6 +87,8 @@ struct dp_tx_ring { > struct idr txbuf_idr; > /* Protects txbuf_idr and num_pending */ > spinlock_t tx_idr_lock; > + /* Serializes wake_tx_queue operations for this ring */ > + spinlock_t wake_tx_lock; > struct hal_wbm_release_ring *tx_status; > int tx_status_head; > int tx_status_tail; > diff --git a/drivers/net/wireless/ath/ath11k/mac.c b/drivers/net/wireless/ath/ath11k/mac.c > index 2d55cdc4d165..9813f7923c34 100644 > --- a/drivers/net/wireless/ath/ath11k/mac.c > +++ b/drivers/net/wireless/ath/ath11k/mac.c > @@ -10065,9 +10065,59 @@ static int ath11k_mac_op_sta_state(struct ieee80211_hw *hw, > return ret; > } > > +static void ath11k_mac_op_wake_tx_queue(struct ieee80211_hw *hw, > + struct ieee80211_txq *txq) > +{ > + struct ieee80211_tx_control control = { > + .sta = txq->sta, > + }; > + struct ath11k *ar = hw->priv; > + struct dp_tx_ring *tx_ring; > + struct hal_srng *tcl_ring; > + struct sk_buff *skb; > + u32 ring_selector; > + int num_free; > + u8 ring_id; > + > + if (!ar) > + return; ar = hw->priv and the hw->priv space is allocated when hw is allocated. so if hw is valid, hw->priv is valid, and this check is innecessary > + > + ring_selector = ar->ab->hw_params.hw_ops->get_ring_selector(txq->ac); > + ring_id = ring_selector % ar->ab->hw_params.hal_params->num_tx_rings; > + tx_ring = &ar->ab->dp.tx_ring[ring_id]; > + tcl_ring = &ar->ab->hal.srng_list[tx_ring->tcl_data_ring.ring_id]; > + > + while (1) { > + if (unlikely(test_bit(ATH11K_FLAG_CRASH_FLUSH, > + &ar->ab->dev_flags))) > + break; > + > + spin_lock_bh(&tx_ring->wake_tx_lock); > + > + spin_lock(&tcl_ring->lock); > + num_free = ath11k_hal_srng_src_num_free(ar->ab, tcl_ring, true); > + spin_unlock(&tcl_ring->lock); > + > + if (num_free == 0) { > + spin_unlock_bh(&tx_ring->wake_tx_lock); > + break; > + } > + > + skb = ieee80211_tx_dequeue(hw, txq); > + if (!skb) { > + spin_unlock_bh(&tx_ring->wake_tx_lock); > + break; > + } > + > + ath11k_mac_op_tx(hw, &control, skb); > + > + spin_unlock_bh(&tx_ring->wake_tx_lock); > + } > +} > + > static const struct ieee80211_ops ath11k_ops = { > .tx = ath11k_mac_op_tx, > - .wake_tx_queue = ieee80211_handle_wake_tx_queue, > + .wake_tx_queue = ath11k_mac_op_wake_tx_queue, > .start = ath11k_mac_op_start, > .stop = ath11k_mac_op_stop, > .reconfig_complete = ath11k_mac_op_reconfig_complete,