This is an automated email from the ASF dual-hosted git repository.

janc pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-nimble.git


The following commit(s) were added to refs/heads/master by this push:
     new 1b0b46d89 porting: Sync mbuf with latest core
1b0b46d89 is described below

commit 1b0b46d8910acb851fd6315d630cc9ea8d45f6f7
Author: Szymon Janc <[email protected]>
AuthorDate: Thu Oct 31 13:54:51 2024 +0100

    porting: Sync mbuf with latest core
    
    This fix msys allocation with multiple mpools. From upstream
    commit:
    " When msys was configured with several mpools and one
    of the pools run out of buffers, os_mbuf_get() returned
    NULL even though other mpool did have buffers available.
    
    Now search for suitable buffer checks if suitable pool
    is empty and if not search continues."
---
 porting/nimble/src/os_mbuf.c | 45 +++++++++++++++++++++++++++++++++-----------
 1 file changed, 34 insertions(+), 11 deletions(-)

diff --git a/porting/nimble/src/os_mbuf.c b/porting/nimble/src/os_mbuf.c
index f65907032..796a85375 100644
--- a/porting/nimble/src/os_mbuf.c
+++ b/porting/nimble/src/os_mbuf.c
@@ -153,24 +153,30 @@ os_msys_reset(void)
 }
 
 static struct os_mbuf_pool *
-_os_msys_find_pool(uint16_t dsize)
+os_msys_find_pool(uint16_t dsize)
 {
     struct os_mbuf_pool *pool;
+    struct os_mbuf_pool *pool_with_free_blocks = NULL;
+    uint16_t pool_free_blocks;
 
-    pool = NULL;
     STAILQ_FOREACH(pool, &g_msys_pool_list, omp_next) {
-        if (dsize <= pool->omp_databuf_len) {
-            break;
+        pool_free_blocks = pool->omp_pool->mp_num_free;
+        if (pool_free_blocks != 0) {
+            pool_with_free_blocks = pool;
+            if (dsize <= pool->omp_databuf_len) {
+                break;
+            }
         }
     }
 
-    if (!pool) {
-        pool = STAILQ_LAST(&g_msys_pool_list, os_mbuf_pool, omp_next);
-    }
-
-    return (pool);
+    return pool_with_free_blocks;
 }
 
+static struct os_mbuf_pool *
+os_msys_find_biggest_pool(void)
+{
+    return os_msys_find_pool(0xFFFF);
+}
 
 struct os_mbuf *
 os_msys_get(uint16_t dsize, uint16_t leadingspace)
@@ -178,7 +184,15 @@ os_msys_get(uint16_t dsize, uint16_t leadingspace)
     struct os_mbuf *m;
     struct os_mbuf_pool *pool;
 
-    pool = _os_msys_find_pool(dsize);
+    /* If dsize = 0 that means user has no idea how big block size is needed,
+     * therefore lets find for him the biggest one
+     */
+    if (dsize == 0) {
+        pool = os_msys_find_biggest_pool();
+    } else {
+        pool = os_msys_find_pool(dsize);
+    }
+
     if (!pool) {
         goto err;
     }
@@ -197,7 +211,16 @@ os_msys_get_pkthdr(uint16_t dsize, uint16_t user_hdr_len)
     struct os_mbuf_pool *pool;
 
     total_pkthdr_len =  user_hdr_len + sizeof(struct os_mbuf_pkthdr);
-    pool = _os_msys_find_pool(dsize + total_pkthdr_len);
+
+    /* If dsize = 0 that means user has no idea how big block size is needed,
+     * therefore lets find for him the biggest one
+     */
+    if (dsize == 0) {
+        pool = os_msys_find_biggest_pool();
+    } else {
+        pool = os_msys_find_pool(dsize + total_pkthdr_len);
+    }
+
     if (!pool) {
         goto err;
     }

Reply via email to