Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 12 additions & 27 deletions include/zephyr/net_buf.h
Original file line number Diff line number Diff line change
Expand Up @@ -1325,19 +1325,14 @@ int net_buf_id(const struct net_buf *buf);
/**
* @brief Allocate a new fixed buffer from a pool.
*
* @note Some types of data allocators do not support
* blocking (such as the HEAP type). In this case it's still possible
* for net_buf_alloc() to fail (return NULL) even if it was given
* K_FOREVER.
*
* @note The timeout value will be overridden to K_NO_WAIT if called from the
* system workqueue.
*
* @param pool Which pool to allocate the buffer from.
* @param timeout Affects the action taken should the pool be empty.
* If K_NO_WAIT, then return immediately. If K_FOREVER, then
* wait as long as necessary. Otherwise, wait until the specified
* timeout.
* timeout. Note that some types of data allocators do not support
* blocking (such as the HEAP type). In this case it's still possible
* for net_buf_alloc() to fail (return NULL) even if it was given
* K_FOREVER.
*
* @return New buffer or NULL if out of buffers.
*/
Expand Down Expand Up @@ -1365,20 +1360,15 @@ static inline struct net_buf * __must_check net_buf_alloc(struct net_buf_pool *p
/**
* @brief Allocate a new variable length buffer from a pool.
*
* @note Some types of data allocators do not support
* blocking (such as the HEAP type). In this case it's still possible
* for net_buf_alloc() to fail (return NULL) even if it was given
* K_FOREVER.
*
* @note The timeout value will be overridden to K_NO_WAIT if called from the
* system workqueue.
*
* @param pool Which pool to allocate the buffer from.
* @param size Amount of data the buffer must be able to fit.
* @param timeout Affects the action taken should the pool be empty.
* If K_NO_WAIT, then return immediately. If K_FOREVER, then
* wait as long as necessary. Otherwise, wait until the specified
* timeout.
* timeout. Note that some types of data allocators do not support
* blocking (such as the HEAP type). In this case it's still possible
* for net_buf_alloc() to fail (return NULL) even if it was given
* K_FOREVER.
*
* @return New buffer or NULL if out of buffers.
*/
Expand All @@ -1402,21 +1392,16 @@ struct net_buf * __must_check net_buf_alloc_len(struct net_buf_pool *pool,
* Allocate a new buffer from a pool, where the data pointer comes from the
* user and not from the pool.
*
* @note Some types of data allocators do not support
* blocking (such as the HEAP type). In this case it's still possible
* for net_buf_alloc() to fail (return NULL) even if it was given
* K_FOREVER.
*
* @note The timeout value will be overridden to K_NO_WAIT if called from the
* system workqueue.
*
* @param pool Which pool to allocate the buffer from.
* @param data External data pointer
* @param size Amount of data the pointed data buffer if able to fit.
* @param timeout Affects the action taken should the pool be empty.
* If K_NO_WAIT, then return immediately. If K_FOREVER, then
* wait as long as necessary. Otherwise, wait until the specified
* timeout.
* timeout. Note that some types of data allocators do not support
* blocking (such as the HEAP type). In this case it's still possible
* for net_buf_alloc() to fail (return NULL) even if it was given
* K_FOREVER.
*
* @return New buffer or NULL if out of buffers.
*/
Expand Down
6 changes: 0 additions & 6 deletions lib/net_buf/buf.c
Original file line number Diff line number Diff line change
Expand Up @@ -271,12 +271,6 @@ struct net_buf *net_buf_alloc_len(struct net_buf_pool *pool, size_t size,

k_spin_unlock(&pool->lock, key);

if (!K_TIMEOUT_EQ(timeout, K_NO_WAIT) &&
k_current_get() == k_work_queue_thread_get(&k_sys_work_q)) {
LOG_DBG("Timeout discarded. No blocking in syswq");
timeout = K_NO_WAIT;
}

#if defined(CONFIG_NET_BUF_LOG) && (CONFIG_NET_BUF_LOG_LEVEL >= LOG_LEVEL_WRN)
if (K_TIMEOUT_EQ(timeout, K_FOREVER)) {
uint32_t ref = k_uptime_get_32();
Expand Down
10 changes: 6 additions & 4 deletions subsys/bluetooth/mesh/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -130,10 +130,12 @@ config BT_MESH_WORKQ_SYS
refer to BT_MESH_ADV_STACK_SIZE for the recommended minimum.

When this option is enabled and the mesh tries to send a message,
and the host ran out the HCI command buffers controlled by
CONFIG_BT_BUF_CMD_TX_COUNT, the host returns -ENOBUFS immediately
and the mesh drops the message transmission. To mitigate this
issue, make sure to have sufficient number of HCI command buffers.
and the host ran out of the HCI command buffers controlled by
CONFIG_BT_BUF_CMD_TX_COUNT, the system work queue will be blocked
until an HCI command buffer has been freed. This may cause a deadlock
where the host cannot use the system workqueue to free the buffer
that the mesh is waiting for. To mitigate this issue, make sure to
have a sufficient number of HCI command buffers.
When this option is enabled, the latency of sending mesh messages
will be affected by other users on the system work queue, resulting in
reduced reliability for sending mesh messages.
Expand Down