Projects
openEuler:C
gazelle
_service:tar_scm:0133-try-to-ensure-arp-packet-...
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File _service:tar_scm:0133-try-to-ensure-arp-packet-can-be-sent.patch of Package gazelle
From 1a7bb2f60a459c2cca6646ccbe04a52fcd8272f6 Mon Sep 17 00:00:00 2001 From: jiangheng <jiangheng14@huawei.com> Date: Wed, 31 Jan 2024 14:49:40 +0800 Subject: [PATCH] try to ensure arp packet can be sent --- src/lstack/core/lstack_dpdk.c | 18 ++++++++++-------- src/lstack/core/lstack_lwip.c | 13 ++++++++++--- src/lstack/core/lstack_protocol_stack.c | 4 ++-- src/lstack/include/lstack_dpdk.h | 2 +- src/lstack/include/lstack_protocol_stack.h | 2 +- src/lstack/netif/lstack_ethdev.c | 8 ++++---- src/lstack/netif/lstack_vdev.c | 2 +- 7 files changed, 29 insertions(+), 20 deletions(-) diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c index e352850..74e033b 100644 --- a/src/lstack/core/lstack_dpdk.c +++ b/src/lstack/core/lstack_dpdk.c @@ -280,14 +280,16 @@ int32_t create_shared_ring(struct protocol_stack *stack) return 0; } -int32_t dpdk_alloc_pktmbuf(struct rte_mempool *pool, struct rte_mbuf **mbufs, uint32_t num) +int32_t dpdk_alloc_pktmbuf(struct rte_mempool *pool, struct rte_mbuf **mbufs, uint32_t num, bool reserve) { - /* - * don't use rte_mempool_avail_count, it traverse cpu local cache, - * when RTE_MAX_LCORE is too large, it's time-consuming - */ - if (rte_ring_count(pool->pool_data) < MBUFPOOL_RESERVE_NUM + num) { - return -ENOMEM; + if (reserve) { + /* + * don't use rte_mempool_avail_count, it traverse cpu local cache, + * when RTE_MAX_LCORE is too large, it's time-consuming + */ + if (rte_ring_count(pool->pool_data) < MBUFPOOL_RESERVE_NUM + num) { + return -ENOMEM; + } } int32_t ret = rte_pktmbuf_alloc_bulk(pool, mbufs, num); @@ -310,7 +312,7 @@ int32_t fill_mbuf_to_ring(struct rte_mempool *mempool, struct rte_ring *ring, ui while (remain > 0) { batch = LWIP_MIN(remain, RING_SIZE(FREE_RX_QUEUE_SZ)); - ret = dpdk_alloc_pktmbuf(mempool, free_buf, batch); + ret = dpdk_alloc_pktmbuf(mempool, free_buf, batch, true); if (ret != 0) { LSTACK_LOG(ERR, LSTACK, "cannot alloc mbuf for ring, count: %u ret=%d\n", batch, ret); return -1; diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c index 3f76424..da50fec 100644 --- a/src/lstack/core/lstack_lwip.c +++ b/src/lstack/core/lstack_lwip.c @@ -22,6 +22,7 @@ #include <lwip/posix_api.h> #include <lwip/api.h> #include <lwip/tcp.h> +#include <lwip/prot/etharp.h> #include <securec.h> #include <rte_errno.h> #include <rte_malloc.h> @@ -101,7 +102,6 @@ static struct pbuf *init_mbuf_to_pbuf(struct rte_mbuf *mbuf, pbuf_layer layer, u struct pbuf *pbuf = pbuf_alloced_custom(layer, length, type, pbuf_custom, data, MAX_PACKET_SZ); if (pbuf) { pbuf->allow_in = 1; - pbuf->last = pbuf; pbuf->addr = *IP_ANY_TYPE; pbuf->port = 0; pthread_spin_init(&pbuf->pbuf_lock, PTHREAD_PROCESS_SHARED); @@ -122,7 +122,7 @@ static bool replenish_send_idlembuf(struct protocol_stack *stack, struct lwip_so return false; } - if (dpdk_alloc_pktmbuf(stack->rxtx_mbuf_pool, (struct rte_mbuf **)pbuf, replenish_cnt) != 0) { + if (dpdk_alloc_pktmbuf(stack->rxtx_mbuf_pool, (struct rte_mbuf **)pbuf, replenish_cnt, true) != 0) { stack->stats.tx_allocmbuf_fail++; return true; } @@ -209,10 +209,17 @@ void do_lwip_free_pbuf(struct pbuf *pbuf) struct pbuf *do_lwip_alloc_pbuf(pbuf_layer layer, uint16_t length, pbuf_type type) { + int ret; struct rte_mbuf *mbuf; struct protocol_stack *stack = get_protocol_stack(); - if (dpdk_alloc_pktmbuf(stack->rxtx_mbuf_pool, &mbuf, 1) != 0) { + /* ensure arp packet can be sent */ + if (layer == PBUF_LINK && length == SIZEOF_ETHARP_HDR) { + ret = dpdk_alloc_pktmbuf(stack->rxtx_mbuf_pool, &mbuf, 1, false); + } else { + ret = dpdk_alloc_pktmbuf(stack->rxtx_mbuf_pool, &mbuf, 1, true); + } + if (ret != 0) { stack->stats.tx_allocmbuf_fail++; return NULL; } diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c index 8b99e82..cb39928 100644 --- a/src/lstack/core/lstack_protocol_stack.c +++ b/src/lstack/core/lstack_protocol_stack.c @@ -940,7 +940,7 @@ void stack_broadcast_arp(struct rte_mbuf *mbuf, struct protocol_stack *cur_stack continue; } - ret = dpdk_alloc_pktmbuf(stack->rxtx_mbuf_pool, &mbuf_copy, 1); + ret = dpdk_alloc_pktmbuf(stack->rxtx_mbuf_pool, &mbuf_copy, 1, true); if (ret != 0) { stack->stats.rx_allocmbuf_fail++; return; @@ -952,7 +952,7 @@ void stack_broadcast_arp(struct rte_mbuf *mbuf, struct protocol_stack *cur_stack return; } } - ret = dpdk_alloc_pktmbuf(cur_stack->rxtx_mbuf_pool, &mbuf_copy, 1); + ret = dpdk_alloc_pktmbuf(cur_stack->rxtx_mbuf_pool, &mbuf_copy, 1, true); if (ret != 0) { cur_stack->stats.rx_allocmbuf_fail++; return; diff --git a/src/lstack/include/lstack_dpdk.h b/src/lstack/include/lstack_dpdk.h index b39d199..c40f3c0 100644 --- a/src/lstack/include/lstack_dpdk.h +++ b/src/lstack/include/lstack_dpdk.h @@ -56,6 +56,6 @@ struct rte_mempool *create_pktmbuf_mempool(const char *name, uint32_t nb_mbuf, uint32_t mbuf_cache_size, uint16_t queue_id, unsigned numa_id); void dpdk_nic_xstats_get(struct gazelle_stack_dfx_data *dfx, uint16_t port_id); -int32_t dpdk_alloc_pktmbuf(struct rte_mempool *pool, struct rte_mbuf **mbufs, uint32_t num); +int32_t dpdk_alloc_pktmbuf(struct rte_mempool *pool, struct rte_mbuf **mbufs, uint32_t num, bool reserve); void dpdk_nic_features_get(struct gazelle_stack_dfx_data *dfx, uint16_t port_id); #endif /* GAZELLE_DPDK_H */ diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h index c681547..0a523b7 100644 --- a/src/lstack/include/lstack_protocol_stack.h +++ b/src/lstack/include/lstack_protocol_stack.h @@ -31,7 +31,7 @@ #define SOCK_SEND_REPLENISH_THRES (16) #define WAKEUP_MAX_NUM (32) -#define MBUFPOOL_RESERVE_NUM 5000 +#define MBUFPOOL_RESERVE_NUM (get_global_cfg_params()->nic.rxqueue_size + 1024) struct rte_mempool; struct rte_ring; diff --git a/src/lstack/netif/lstack_ethdev.c b/src/lstack/netif/lstack_ethdev.c index 4d6f620..acf3c10 100644 --- a/src/lstack/netif/lstack_ethdev.c +++ b/src/lstack/netif/lstack_ethdev.c @@ -543,9 +543,9 @@ void parse_arp_and_transefer(char* buf) int32_t ret; for (int32_t i = 0; i < stack_group->stack_num; i++) { stack = stack_group->stacks[i]; - ret = dpdk_alloc_pktmbuf(stack->rxtx_mbuf_pool, &mbuf_copy, 1); + ret = dpdk_alloc_pktmbuf(stack->rxtx_mbuf_pool, &mbuf_copy, 1, true); while (ret != 0) { - ret = dpdk_alloc_pktmbuf(stack->rxtx_mbuf_pool, &mbuf_copy, 1); + ret = dpdk_alloc_pktmbuf(stack->rxtx_mbuf_pool, &mbuf_copy, 1, true); stack->stats.rx_allocmbuf_fail++; } copy_mbuf(mbuf_copy, mbuf); @@ -572,9 +572,9 @@ void parse_tcp_and_transefer(char* buf) struct rte_mbuf *mbuf_copy = NULL; struct protocol_stack *stack = stack_group->stacks[stk_index]; - int32_t ret = dpdk_alloc_pktmbuf(stack->rxtx_mbuf_pool, &mbuf_copy, 1); + int32_t ret = dpdk_alloc_pktmbuf(stack->rxtx_mbuf_pool, &mbuf_copy, 1, true); while (ret != 0) { - ret = dpdk_alloc_pktmbuf(stack->rxtx_mbuf_pool, &mbuf_copy, 1); + ret = dpdk_alloc_pktmbuf(stack->rxtx_mbuf_pool, &mbuf_copy, 1, true); stack->stats.rx_allocmbuf_fail++; } diff --git a/src/lstack/netif/lstack_vdev.c b/src/lstack/netif/lstack_vdev.c index fe17f59..f78e48a 100644 --- a/src/lstack/netif/lstack_vdev.c +++ b/src/lstack/netif/lstack_vdev.c @@ -59,7 +59,7 @@ static uint32_t ltran_rx_poll(struct protocol_stack *stack, struct rte_mbuf **pk stack->rx_ring_used += rcvd_pkts; if (unlikely(stack->rx_ring_used >= USED_RX_PKTS_WATERMARK)) { uint32_t free_cnt = LWIP_MIN(stack->rx_ring_used, RING_SIZE(DPDK_PKT_BURST_SIZE)); - int32_t ret = dpdk_alloc_pktmbuf(stack->rxtx_mbuf_pool, (struct rte_mbuf **)free_buf, free_cnt); + int32_t ret = dpdk_alloc_pktmbuf(stack->rxtx_mbuf_pool, (struct rte_mbuf **)free_buf, free_cnt, true); if (likely(ret == 0)) { nr_pkts = gazelle_ring_sp_enqueue(stack->rx_ring, (void **)free_buf, free_cnt); stack->rx_ring_used -= nr_pkts; -- 2.27.0
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.