From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-oo1-f54.google.com (mail-oo1-f54.google.com [209.85.161.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1D3B84854F8 for ; Mon, 12 Oct 2026 12:05:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.161.54 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791806702; cv=none; b=Up0qaDbyby7wHvT86jHLjzLztMqInbdQi0OEh9yvbEAE/RnHfGhMOnJP6jKnCbh4XGM6in3llRUNx26CQ2t03l2LMP3QHxLutVkAKqasdIzFKtBiyRfBpQ8k0GeyyiP4gso+zvhHRkqdmImJ/sdGUSOtppNjKr76I20TpDC32Co= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791806702; c=relaxed/simple; bh=QSL5j8mwHkOb/fsPq/nsPWAIlZUAQnKGZepjVSSkOvU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ayScjcjLcuaK+zlxxBV7q/AqzxlWa/2NtN2ph5JwQvfdeuvqDceFTk8HYTAjzVhvdTd+nwnkJi1/ztZ/DLUsy/YuRALB9Hm6avSO0Xci5Lw8zoHGjegcnFHrYraAdKRRRf8kLyq2fB7+Toe2bfXH3UHHoOdJExUNJhJD9cdZVE4= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=mIcciU/L; arc=none smtp.client-ip=209.85.161.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="mIcciU/L" Received: by mail-oo1-f54.google.com with SMTP id 006d021491bc7-6dcf573c429so1170577eaf.2 for ; Mon, 12 Oct 2026 05:05:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1791806700; x=1792411500; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=qOCVm+71XoqyxTpz9zzVrcgymq0GHJGa2kvf/gkuOvs=; b=mIcciU/LyWsKZFbc1xigqD60bO04kJIqsZ9HijSjbT8UyLglNa6FZ09WPR5EuE3Nw5 J/MVzxmXQg/VwjXQSUimlOi2OjNWS6ER24p/RFw3QLDedmWv/Rv0jQy133YehffmlWJx ekP8HH7zaaieWxjb0yFmVwlQn6c9lGE3qK7N8g5fZ8KHU8zo2Yjz5dOj4ww8VKoatLt+ +NN+FjharBAjO1I61h3g6PROws5OAsWg3vo/CLbBaANUtIyypqik5aLEEQkxrfkq3YBm 8NFQkr6ggM+w/rXIsw9YmmlXZsJbwm+YHGVnhh2CGzptTIxJ/zIgcPDzCqQagv/3XSHA fP7Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1791806700; x=1792411500; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=qOCVm+71XoqyxTpz9zzVrcgymq0GHJGa2kvf/gkuOvs=; b=LyqOKZKcMWjTrnaR458vZfj2SU5YAnoY2lgXEyyg1zq431XsoRAHivI0k7fY38t16A zCuaZdLU+kK3NNMJAXD1fLVB418GID7m5fn950DAdML0OTyKErZItFmABO2s3WnURRD8 A9D+NlnEzniQaA8gVQAP6vTmGR9mo/Si+cEC5YYDqrHjl5K9Qi+6saOZll97sBXFLdF3 7oeAxTNiCLjyKnEgUbToUuMPDf5zEq51t4nGP78F3kY8iCy8c9SKG2o8VaAbiG15OpET RpAoDaluy7zwfyv8EpttDx+9jWdjrVDerFPT/Zy3TTkcZUcczL5FrVr91wHqnwfMb2i7 lz3A== X-Forwarded-Encrypted: i=1; AKwUvByKBg3zEvqcbAmcvcnJ6KcBMRENW5E29X7lQMozM1wEJ+ok7AK9xVQ8AmCu/mZaeWU9UWWln7zKni/q8Nk=@vger.kernel.org X-Gm-Message-State: AFq9FYJivrfMJdI28jmWRZOCl8FjwCNC3tjD0cIuDF56dK9F4otfpq5V nu4jMaAEJB+Cgc6WGnHDn4qxqZ4Vxf7qjCt3S7gax3T/wuqDjHH2dKYd X-Gm-Gg: AYBFou2qTsC6EpL6EoVt+YhJq8Mu793W1YVl3pUlONIZtmqPOOaGLAozL1rgCog2GUb vfxGwjeX2KrL/8suG+7H72Ax6kMP8CQzSJvV61bgQWf1qLZAc1cmizXnM/ElG6yBTVbjLdQ1Pgz D9SPsbc3CovkjLNrzqvmYc+VWsU8LrCl7rHmq1wsgHSmqJSIunarGvTEB2vjqXx7wAW0Jl1YObq mWrpjHHRueskX0wgbIuW2feZ2rplf1F1vdJzXWQZQyse/w9KI1FoBdpEMKDGNXmv7Ax9n5gNAJ/ u/XSvzeIYEbAvHVHroOKetUnx19bGFLAOeDbhRet2iMSYveHckhPvkT83NUHP2TgnqbMskd1mtL yZ4Liqgnpaztcc74HzjA44IAWXbowmnx4I0mqqFohxi1SJ6WIwtPlO2lJT5eQga384JM0zmMUzD ByWTEz+PoAj/A+9s3CzbQyNKEdzeqBl1rr8sJWvE8l6dkJJMG/7EdIwv16h0O0DYBjUULUyw== X-Received: by 2002:a05:6820:c0cb:20b0:6f8:728d:cc2 with SMTP id 006d021491bc7-6f8728d1172mr185384eaf.27.1791806699864; Mon, 12 Oct 2026 05:04:59 -0700 (PDT) Received: from localhost ([2a03:2880:30ff:71::]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6f8a470726asm200442eaf.3.2026.10.12.05.04.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 12 Oct 2026 05:04:59 -0700 (PDT) From: Daniel Zahka Date: Mon, 12 Oct 2026 05:04:37 -0700 Subject: [PATCH net-next v2 4/4] eth: mpnic: count Rx allocation failures Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20261012-mpnic-counters3-v2-4-8afba81c2d5a@gmail.com> References: <20261012-mpnic-counters3-v2-0-8afba81c2d5a@gmail.com> In-Reply-To: <20261012-mpnic-counters3-v2-0-8afba81c2d5a@gmail.com> To: Alexander Duyck , Jakub Kicinski , kernel-team@meta.com, Andrew Lunn , "David S. Miller" , Paolo Abeni , Alexei Starovoitov , Daniel Borkmann , Jesper Dangaard Brouer , John Fastabend , Stanislav Fomichev , Eric Dumazet , Eric Dumazet Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, bpf@vger.kernel.org X-Mailer: b4 0.13.0 Count both skb allocation failures and page pool allocation failures per queue, and report them through the queue stats API. The bdq allocation failures are added to the skb allocation failures when reporting to core and folded into base stats during aggregation, because the qstats API doesn't support reporting them separately. Page pool allocation failures are also counted when the BDQs are first filled in ndo_open, which runs in process context. mpnic_fill() disables BH around the fill, so the u64_stats update happens with preemption disabled. Signed-off-by: Daniel Zahka --- drivers/net/ethernet/meta/mpnic/mpnic_netdev.c | 24 ++++++++++++++++++++++- drivers/net/ethernet/meta/mpnic/mpnic_netdev.h | 1 + drivers/net/ethernet/meta/mpnic/mpnic_txrx.c | 27 +++++++++++++++++++++++--- drivers/net/ethernet/meta/mpnic/mpnic_txrx.h | 4 ++++ 4 files changed, 52 insertions(+), 4 deletions(-) diff --git a/drivers/net/ethernet/meta/mpnic/mpnic_netdev.c b/drivers/net/ethernet/meta/mpnic/mpnic_netdev.c index 9e262f939c79..7fdf57f70151 100644 --- a/drivers/net/ethernet/meta/mpnic/mpnic_netdev.c +++ b/drivers/net/ethernet/meta/mpnic/mpnic_netdev.c @@ -147,14 +147,29 @@ static const struct net_device_ops mpnic_netdev_ops = { .ndo_get_stats64 = mpnic_get_stats64, }; +static u64 mpnic_bdq_alloc_failed(struct mpnic_ring *bdq) +{ + struct mpnic_queue_stats *stats = &bdq->stats; + unsigned int start; + u64 alloc_failed; + + do { + start = u64_stats_fetch_begin(&stats->syncp); + alloc_failed = u64_stats_read(&stats->bdq.alloc_failed); + } while (u64_stats_fetch_retry(&stats->syncp, start)); + + return alloc_failed; +} + static void mpnic_get_queue_stats_rx(struct net_device *dev, int idx, struct netdev_queue_stats_rx *rx) { struct mpnic_net *mpn = netdev_priv(dev); struct mpnic_ring *rxr = mpn->rx[idx]; + u64 bytes, packets, alloc_failed; struct mpnic_queue_stats *stats; + struct mpnic_q_triad *qt; unsigned int start; - u64 bytes, packets; if (!rxr) return; @@ -164,10 +179,16 @@ static void mpnic_get_queue_stats_rx(struct net_device *dev, int idx, start = u64_stats_fetch_begin(&stats->syncp); bytes = u64_stats_read(&stats->rcq.bytes); packets = u64_stats_read(&stats->rcq.packets); + alloc_failed = u64_stats_read(&stats->rcq.alloc_failed); } while (u64_stats_fetch_retry(&stats->syncp, start)); + qt = container_of(rxr, struct mpnic_q_triad, cmpl); + alloc_failed += mpnic_bdq_alloc_failed(&qt->sub0); + alloc_failed += mpnic_bdq_alloc_failed(&qt->sub1); + rx->bytes = bytes; rx->packets = packets; + rx->alloc_fail = alloc_failed; } static void mpnic_get_queue_stats_tx(struct net_device *dev, int idx, @@ -221,6 +242,7 @@ static void mpnic_get_base_stats(struct net_device *dev, rx->bytes = base->rx.bytes; rx->packets = base->rx.packets; + rx->alloc_fail = base->rx.alloc_failed; } static const struct netdev_stat_ops mpnic_stat_ops = { diff --git a/drivers/net/ethernet/meta/mpnic/mpnic_netdev.h b/drivers/net/ethernet/meta/mpnic/mpnic_netdev.h index 0d1ee66dd86c..6711766ebc3c 100644 --- a/drivers/net/ethernet/meta/mpnic/mpnic_netdev.h +++ b/drivers/net/ethernet/meta/mpnic/mpnic_netdev.h @@ -23,6 +23,7 @@ struct mpnic_base_stats { u64 packets; u64 bytes; u64 dropped; + u64 alloc_failed; u64 errors; } rx; diff --git a/drivers/net/ethernet/meta/mpnic/mpnic_txrx.c b/drivers/net/ethernet/meta/mpnic/mpnic_txrx.c index 931e1031a180..93abdec44642 100644 --- a/drivers/net/ethernet/meta/mpnic/mpnic_txrx.c +++ b/drivers/net/ethernet/meta/mpnic/mpnic_txrx.c @@ -409,8 +409,12 @@ static unsigned int __mpnic_fill_bdq(struct mpnic_ring *bdq) struct page *page; page = page_pool_dev_alloc_pages(bdq->page_pool); - if (!page) + if (!page) { + u64_stats_update_begin(&bdq->stats.syncp); + u64_stats_inc(&bdq->stats.bdq.alloc_failed); + u64_stats_update_end(&bdq->stats.syncp); break; + } bdq->rx_buf[i] = page; mpnic_bd_prep(bdq, i, page); @@ -598,6 +602,7 @@ static int mpnic_clean_rcq(struct mpnic_napi_vector *nv, unsigned int packets = 0, bytes = 0, dropped = 0, errors = 0; struct mpnic_ring *rcq = &qt->cmpl; struct mpnic_rcq_state *state; + unsigned int alloc_failed = 0; __le64 *raw_rcd, done; u32 head = rcq->head; @@ -632,6 +637,7 @@ static int mpnic_clean_rcq(struct mpnic_napi_vector *nv, !state->pkt.add_frag_failed)) { bytes += xdp_get_buff_len(&state->pkt.buff); skb = xdp_build_skb_from_buff(&state->pkt.buff); + alloc_failed += !skb; } if (likely(skb)) { @@ -665,6 +671,7 @@ static int mpnic_clean_rcq(struct mpnic_napi_vector *nv, u64_stats_add(&rcq->stats.rcq.packets, packets - errors); u64_stats_add(&rcq->stats.rcq.bytes, bytes); u64_stats_add(&rcq->stats.rcq.dropped, dropped); + u64_stats_add(&rcq->stats.rcq.alloc_failed, alloc_failed); u64_stats_add(&rcq->stats.rcq.errors, errors); u64_stats_update_end(&rcq->stats.syncp); @@ -725,12 +732,19 @@ static void mpnic_aggregate_ring_tcq_counters(struct mpnic_base_stats *base, base->tx.wake += u64_stats_read(&tcq->stats.tcq.wake); } +static void mpnic_aggregate_ring_bdq_counters(struct mpnic_base_stats *base, + struct mpnic_ring *bdq) +{ + base->rx.alloc_failed += u64_stats_read(&bdq->stats.bdq.alloc_failed); +} + static void mpnic_aggregate_ring_rcq_counters(struct mpnic_base_stats *base, struct mpnic_ring *rcq) { base->rx.packets += u64_stats_read(&rcq->stats.rcq.packets); base->rx.bytes += u64_stats_read(&rcq->stats.rcq.bytes); base->rx.dropped += u64_stats_read(&rcq->stats.rcq.dropped); + base->rx.alloc_failed += u64_stats_read(&rcq->stats.rcq.alloc_failed); base->rx.errors += u64_stats_read(&rcq->stats.rcq.errors); } @@ -767,8 +781,13 @@ void mpnic_stats_fold_rings(struct mpnic_net *mpn) mpnic_aggregate_ring_tcq_counters(new, &qt->cmpl); } - for (j = 0; j < nv->rxt_count; j++, t++) - mpnic_aggregate_ring_rcq_counters(new, &nv->qt[t].cmpl); + for (j = 0; j < nv->rxt_count; j++, t++) { + struct mpnic_q_triad *qt = &nv->qt[t]; + + mpnic_aggregate_ring_bdq_counters(new, &qt->sub0); + mpnic_aggregate_ring_bdq_counters(new, &qt->sub1); + mpnic_aggregate_ring_rcq_counters(new, &qt->cmpl); + } } rcu_assign_pointer(mpn->stats.base, new); @@ -1494,7 +1513,9 @@ void mpnic_fill(struct mpnic_net *mpn) state->hdr.idx = UINT_MAX; state->payld.idx = UINT_MAX; + local_bh_disable(); mpnic_fill_qt_bdqs(qt); + local_bh_enable(); } } } diff --git a/drivers/net/ethernet/meta/mpnic/mpnic_txrx.h b/drivers/net/ethernet/meta/mpnic/mpnic_txrx.h index 764e78918b8f..52492e3f484f 100644 --- a/drivers/net/ethernet/meta/mpnic/mpnic_txrx.h +++ b/drivers/net/ethernet/meta/mpnic/mpnic_txrx.h @@ -100,8 +100,12 @@ struct mpnic_queue_stats { u64_stats_t packets; u64_stats_t bytes; u64_stats_t dropped; + u64_stats_t alloc_failed; u64_stats_t errors; } rcq; + struct { + u64_stats_t alloc_failed; + } bdq; }; struct u64_stats_sync syncp; }; -- 2.52.0