kernel: Modify the signature of k_mem_slab_free()

Modify the signature of the k_mem_slab_free() function with a new one,
replacing the old void **mem with void *mem as a parameter.

The following function:
void k_mem_slab_free(struct k_mem_slab *slab, void **mem);

has the wrong signature. mem is only used as a regular pointer, so there
is no need to use a double-pointer. The correct signature should be:
void k_mem_slab_free(struct k_mem_slab *slab, void *mem);

The issue with the current signature, although functional, is that it is
extremely confusing. I myself, a veteran Zephyr developer, was confused
by this parameter when looking at it recently.

All in-tree uses of the function have been adapted.

Fixes #61888.

Signed-off-by: Carles Cufi <carles.cufi@nordicsemi.no>
This commit is contained in:
Carles Cufi 2023-08-25 14:31:30 +02:00 committed by Anas Nashif
commit 8c748fd005
68 changed files with 146 additions and 138 deletions

View file

@ -39,7 +39,7 @@ struct dmic_nrfx_pdm_drv_cfg {
static void free_buffer(struct dmic_nrfx_pdm_drv_data *drv_data, void *buffer)
{
k_mem_slab_free(drv_data->mem_slab, &buffer);
k_mem_slab_free(drv_data->mem_slab, buffer);
LOG_DBG("Freed buffer %p", buffer);
}

View file

@ -44,7 +44,7 @@ int mpxxdtyy_i2s_read(const struct device *dev, uint8_t stream, void **buffer,
sw_filter_lib_run(pdm_filter, pdm_block, pcm_block, pdm_size,
data->pcm_mem_size);
k_mem_slab_free(&rx_pdm_i2s_mslab, &pdm_block);
k_mem_slab_free(&rx_pdm_i2s_mslab, pdm_block);
*buffer = pcm_block;
*size = data->pcm_mem_size;

View file

@ -61,7 +61,7 @@ void uart_mcumgr_free_rx_buf(struct uart_mcumgr_rx_buf *rx_buf)
void *block;
block = rx_buf;
k_mem_slab_free(&uart_mcumgr_slab, &block);
k_mem_slab_free(&uart_mcumgr_slab, block);
}
#if !defined(CONFIG_MCUMGR_TRANSPORT_UART_ASYNC)

View file

@ -21,7 +21,7 @@ int z_impl_i2s_buf_read(const struct device *dev, void *buf, size_t *size)
rx_cfg = i2s_config_get((const struct device *)dev, I2S_DIR_RX);
memcpy(buf, mem_block, *size);
k_mem_slab_free(rx_cfg->mem_slab, &mem_block);
k_mem_slab_free(rx_cfg->mem_slab, mem_block);
}
return ret;
@ -51,7 +51,7 @@ int z_impl_i2s_buf_write(const struct device *dev, void *buf, size_t size)
ret = i2s_write((const struct device *)dev, mem_block, size);
if (ret != 0) {
k_mem_slab_free(tx_cfg->mem_slab, &mem_block);
k_mem_slab_free(tx_cfg->mem_slab, mem_block);
}
return ret;

View file

@ -66,7 +66,7 @@ static inline int z_vrfy_i2s_buf_read(const struct device *dev,
copy_success = z_user_to_copy((void *)buf, mem_block,
data_size);
k_mem_slab_free(rx_cfg->mem_slab, &mem_block);
k_mem_slab_free(rx_cfg->mem_slab, mem_block);
Z_OOPS(copy_success);
Z_OOPS(z_user_to_copy((void *)size, &data_size,
sizeof(data_size)));
@ -100,13 +100,13 @@ static inline int z_vrfy_i2s_buf_write(const struct device *dev,
ret = z_user_from_copy(mem_block, (void *)buf, size);
if (ret) {
k_mem_slab_free(tx_cfg->mem_slab, &mem_block);
k_mem_slab_free(tx_cfg->mem_slab, mem_block);
Z_OOPS(ret);
}
ret = i2s_write((const struct device *)dev, mem_block, size);
if (ret != 0) {
k_mem_slab_free(tx_cfg->mem_slab, &mem_block);
k_mem_slab_free(tx_cfg->mem_slab, mem_block);
}
return ret;

View file

@ -588,7 +588,7 @@ static void i2s_litex_isr_tx(void *arg)
stream->cfg.word_size, stream->cfg.channels);
i2s_clear_pending_irq(cfg->base);
k_mem_slab_free(stream->cfg.mem_slab, &stream->mem_block);
k_mem_slab_free(stream->cfg.mem_slab, stream->mem_block);
}
static const struct i2s_driver_api i2s_litex_driver_api = {

View file

@ -600,7 +600,7 @@ static void dma_tx_callback(const struct device *dma_dev, void *arg,
__ASSERT_NO_MSG(stream->mem_block != NULL);
/* All block data sent */
k_mem_slab_free(stream->cfg.mem_slab, &stream->mem_block);
k_mem_slab_free(stream->cfg.mem_slab, stream->mem_block);
stream->mem_block = NULL;
/* Stop transmission if there was an error */
@ -806,7 +806,7 @@ static void rx_stream_disable(struct stream *stream, const struct device *dev)
dma_stop(stream->dev_dma, stream->dma_channel);
if (stream->mem_block != NULL) {
k_mem_slab_free(stream->cfg.mem_slab, &stream->mem_block);
k_mem_slab_free(stream->cfg.mem_slab, stream->mem_block);
stream->mem_block = NULL;
}
@ -824,7 +824,7 @@ static void tx_stream_disable(struct stream *stream, const struct device *dev)
dma_stop(stream->dev_dma, stream->dma_channel);
if (stream->mem_block != NULL) {
k_mem_slab_free(stream->cfg.mem_slab, &stream->mem_block);
k_mem_slab_free(stream->cfg.mem_slab, stream->mem_block);
stream->mem_block = NULL;
}
@ -839,7 +839,7 @@ static void rx_queue_drop(struct stream *stream)
void *mem_block;
while (queue_get(&stream->mem_block_queue, &mem_block, &size) == 0) {
k_mem_slab_free(stream->cfg.mem_slab, &mem_block);
k_mem_slab_free(stream->cfg.mem_slab, mem_block);
}
k_sem_reset(&stream->sem);
@ -852,7 +852,7 @@ static void tx_queue_drop(struct stream *stream)
unsigned int n = 0U;
while (queue_get(&stream->mem_block_queue, &mem_block, &size) == 0) {
k_mem_slab_free(stream->cfg.mem_slab, &mem_block);
k_mem_slab_free(stream->cfg.mem_slab, mem_block);
n++;
}

View file

@ -300,15 +300,15 @@ static inline void i2s_purge_stream_buffers(struct stream *stream,
struct i2s_txq_entry queue_entry;
while (k_msgq_get(&stream->in_queue, &queue_entry, K_NO_WAIT) == 0) {
k_mem_slab_free(mem_slab, &queue_entry.mem_block);
k_mem_slab_free(mem_slab, queue_entry.mem_block);
}
} else {
while (k_msgq_get(&stream->in_queue, &buffer, K_NO_WAIT) == 0) {
k_mem_slab_free(mem_slab, &buffer);
k_mem_slab_free(mem_slab, buffer);
}
}
while (k_msgq_get(&stream->out_queue, &buffer, K_NO_WAIT) == 0) {
k_mem_slab_free(mem_slab, &buffer);
k_mem_slab_free(mem_slab, buffer);
}
}
@ -457,7 +457,7 @@ static void i2s_mcux_dma_tx_callback(const struct device *dma_dev, void *arg,
ret = k_msgq_get(&stream->out_queue, &queue_entry.mem_block, K_NO_WAIT);
if (ret == 0) {
/* transmission complete. free the buffer */
k_mem_slab_free(stream->cfg.mem_slab, &queue_entry.mem_block);
k_mem_slab_free(stream->cfg.mem_slab, queue_entry.mem_block);
} else {
LOG_ERR("no buffer in output queue for channel %u", channel);
}

View file

@ -124,13 +124,13 @@ static inline void i2s_purge_stream_buffers(struct stream *strm,
if (in_drop) {
while (k_msgq_get(&strm->in_queue, &buffer, K_NO_WAIT) == 0) {
k_mem_slab_free(mem_slab, &buffer);
k_mem_slab_free(mem_slab, buffer);
}
}
if (out_drop) {
while (k_msgq_get(&strm->out_queue, &buffer, K_NO_WAIT) == 0) {
k_mem_slab_free(mem_slab, &buffer);
k_mem_slab_free(mem_slab, buffer);
}
}
}
@ -277,7 +277,7 @@ static void i2s_dma_tx_callback(const struct device *dma_dev,
ret = k_msgq_get(&strm->out_queue, &buffer, K_NO_WAIT);
if (ret == 0) {
/* transmission complete. free the buffer */
k_mem_slab_free(strm->cfg.mem_slab, &buffer);
k_mem_slab_free(strm->cfg.mem_slab, buffer);
(strm->free_tx_dma_blocks)++;
} else {
LOG_ERR("no buf in out_queue for channel %u", channel);

View file

@ -213,13 +213,13 @@ static bool get_next_rx_buffer(struct i2s_nrfx_drv_data *drv_data,
static void free_tx_buffer(struct i2s_nrfx_drv_data *drv_data,
const void *buffer)
{
k_mem_slab_free(drv_data->tx.cfg.mem_slab, (void **)&buffer);
k_mem_slab_free(drv_data->tx.cfg.mem_slab, (void *)buffer);
LOG_DBG("Freed TX %p", buffer);
}
static void free_rx_buffer(struct i2s_nrfx_drv_data *drv_data, void *buffer)
{
k_mem_slab_free(drv_data->rx.cfg.mem_slab, &buffer);
k_mem_slab_free(drv_data->rx.cfg.mem_slab, buffer);
LOG_DBG("Freed RX %p", buffer);
}

View file

@ -277,7 +277,7 @@ static void dma_tx_callback(const struct device *dma_dev, void *user_data,
__ASSERT_NO_MSG(stream->mem_block != NULL);
/* All block data sent */
k_mem_slab_free(stream->cfg.mem_slab, &stream->mem_block);
k_mem_slab_free(stream->cfg.mem_slab, stream->mem_block);
stream->mem_block = NULL;
/* Stop transmission if there was an error */
@ -736,7 +736,7 @@ static void rx_stream_disable(struct stream *stream, Ssc *const ssc,
ssc->SSC_IDR = SSC_IDR_OVRUN;
dma_stop(dev_dma, stream->dma_channel);
if (stream->mem_block != NULL) {
k_mem_slab_free(stream->cfg.mem_slab, &stream->mem_block);
k_mem_slab_free(stream->cfg.mem_slab, stream->mem_block);
stream->mem_block = NULL;
}
}
@ -748,7 +748,7 @@ static void tx_stream_disable(struct stream *stream, Ssc *const ssc,
ssc->SSC_IDR = SSC_IDR_TXEMPTY;
dma_stop(dev_dma, stream->dma_channel);
if (stream->mem_block != NULL) {
k_mem_slab_free(stream->cfg.mem_slab, &stream->mem_block);
k_mem_slab_free(stream->cfg.mem_slab, stream->mem_block);
stream->mem_block = NULL;
}
}
@ -759,7 +759,7 @@ static void rx_queue_drop(struct stream *stream)
void *mem_block;
while (queue_get(&stream->mem_block_queue, &mem_block, &size) == 0) {
k_mem_slab_free(stream->cfg.mem_slab, &mem_block);
k_mem_slab_free(stream->cfg.mem_slab, mem_block);
}
k_sem_reset(&stream->sem);
@ -772,7 +772,7 @@ static void tx_queue_drop(struct stream *stream)
unsigned int n = 0U;
while (queue_get(&stream->mem_block_queue, &mem_block, &size) == 0) {
k_mem_slab_free(stream->cfg.mem_slab, &mem_block);
k_mem_slab_free(stream->cfg.mem_slab, mem_block);
n++;
}

View file

@ -139,7 +139,7 @@ static int ws2812_strip_update_rgb(const struct device *dev, struct led_rgb *pix
/* Flush the buffer on the wire. */
ret = i2s_write(cfg->dev, mem_block, cfg->tx_buf_bytes);
if (ret < 0) {
k_mem_slab_free(cfg->mem_slab, &mem_block);
k_mem_slab_free(cfg->mem_slab, mem_block);
LOG_ERR("Failed to write data: %d", ret);
return ret;
}

View file

@ -48,7 +48,7 @@ static void iface_uart_async_callback(const struct device *dev,
break;
case UART_RX_BUF_RELEASED:
/* UART driver is done with memory, free it */
k_mem_slab_free(&uart_modem_async_rx_slab, (void **)&evt->data.rx_buf.buf);
k_mem_slab_free(&uart_modem_async_rx_slab, (void *)evt->data.rx_buf.buf);
break;
case UART_RX_RDY:
/* Place received data on the ring buffer */

View file

@ -392,7 +392,7 @@ static int intel_gna_deregister_model(const struct device *dev,
gna_model = (struct intel_gna_model *)model_handle;
gna_model->registered = false;
k_mem_slab_free(&gna->model_slab, &model_handle);
k_mem_slab_free(&gna->model_slab, model_handle);
return 0;
}

View file

@ -387,7 +387,7 @@ static inline void usbd_work_schedule(void)
*/
static inline void usbd_evt_free(struct usbd_event *ev)
{
k_mem_slab_free(&fifo_elem_slab, (void **)&ev->block.data);
k_mem_slab_free(&fifo_elem_slab, (void *)ev->block.data);
}
/**

View file

@ -506,7 +506,7 @@ static void xfer_work_handler(struct k_work *item)
}
xfer_work_error:
k_mem_slab_free(&usbfsotg_ee_slab, (void **)&ev);
k_mem_slab_free(&usbfsotg_ee_slab, (void *)ev);
}
}

View file

@ -332,7 +332,7 @@ static ALWAYS_INLINE void udc_vrt_thread_handler(void *arg)
udc_submit_event(dev, UDC_EVT_ERROR, err);
}
k_mem_slab_free(&udc_vrt_slab, (void **)&vrt_ev);
k_mem_slab_free(&udc_vrt_slab, (void *)vrt_ev);
}
}

View file

@ -139,7 +139,7 @@ int uhc_xfer_free(const struct device *dev, struct uhc_transfer *const xfer)
uhc_xfer_buf_free(dev, buf);
}
k_mem_slab_free(&uhc_xfer_pool, (void **)&xfer);
k_mem_slab_free(&uhc_xfer_pool, (void *)xfer);
xfer_free_error:
api->unlock(dev);

View file

@ -378,7 +378,7 @@ static void xfer_work_handler(struct k_work *work)
}
}
k_mem_slab_free(&uhc_vrt_slab, (void **)&ev);
k_mem_slab_free(&uhc_vrt_slab, (void *)ev);
}
}

View file

@ -72,7 +72,7 @@ struct uvb_packet *uvb_alloc_pkt(const enum uvb_request request,
void uvb_free_pkt(struct uvb_packet *const pkt)
{
k_mem_slab_free(&uvb_pkt_slab, (void **)&pkt);
k_mem_slab_free(&uvb_pkt_slab, (void *)pkt);
}
static ALWAYS_INLINE int submit_new_work(struct uvb_msg *const msg)
@ -311,7 +311,7 @@ static void uvb_work_handler(struct k_work *work)
break;
}
k_mem_slab_free(&uvb_msg_slab, (void **)&msg);
k_mem_slab_free(&uvb_msg_slab, (void *)msg);
if (!k_fifo_is_empty(&uvb_queue)) {
(void)k_work_submit(work);
}