mm/iob: Miscellaneous changes and fixes from code review.

This commit is contained in:
Xiang Xiao 2019-01-26 09:56:27 -06:00 committed by Gregory Nutt
parent 0354702525
commit 1ecc33b7db
8 changed files with 26 additions and 26 deletions

View File

@ -200,7 +200,7 @@ FAR struct iob_qentry_s *iob_alloc_qentry(void)
{ {
/* Were we called from the interrupt level? */ /* Were we called from the interrupt level? */
if (up_interrupt_context()) if (up_interrupt_context() || sched_idletask())
{ {
/* Yes, then try to allocate an I/O buffer without waiting */ /* Yes, then try to allocate an I/O buffer without waiting */

View File

@ -1,5 +1,5 @@
/**************************************************************************** /****************************************************************************
* mm/iob/iob_copy.c * mm/iob/iob_clone.c
* *
* Copyright (C) 2014, 2017 Gregory Nutt. All rights reserved. * Copyright (C) 2014, 2017 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org> * Author: Gregory Nutt <gnutt@nuttx.org>

View File

@ -59,6 +59,11 @@
void iob_concat(FAR struct iob_s *iob1, FAR struct iob_s *iob2) void iob_concat(FAR struct iob_s *iob1, FAR struct iob_s *iob2)
{ {
/* Combine the total packet size */
iob1->io_pktlen += iob2->io_pktlen;
iob2->io_pktlen = 0;
/* Find the last buffer in the iob1 buffer chain */ /* Find the last buffer in the iob1 buffer chain */
while (iob1->io_flink) while (iob1->io_flink)
@ -69,8 +74,4 @@ void iob_concat(FAR struct iob_s *iob1, FAR struct iob_s *iob2)
/* Then connect iob2 buffer chain to the end of the iob1 chain */ /* Then connect iob2 buffer chain to the end of the iob1 chain */
iob1->io_flink = iob2; iob1->io_flink = iob2;
/* Combine the total packet size */
iob1->io_pktlen += iob2->io_pktlen;
} }

View File

@ -113,7 +113,7 @@ int iob_contig(FAR struct iob_s *iob, unsigned int len)
/* Get the next I/O buffer in the chain */ /* Get the next I/O buffer in the chain */
next = iob->io_flink; next = iob->io_flink;
DEBUGASSERT(next != NULL && next->io_len > 0); DEBUGASSERT(next != NULL);
/* Copy what we need or what we can from the next buffer */ /* Copy what we need or what we can from the next buffer */

View File

@ -115,12 +115,11 @@ FAR struct iob_s *iob_free(FAR struct iob_s *iob)
} }
else else
{ {
/* This can only happen if the next entry is last entry in the /* This can only happen if the free entry isn't first entry in the
* chain... and if it is empty * chain...
*/ */
next->io_pktlen = 0; next->io_pktlen = 0;
DEBUGASSERT(next->io_len == 0 && next->io_flink == NULL);
} }
iobinfo("next=%p io_pktlen=%u io_len=%u\n", iobinfo("next=%p io_pktlen=%u io_len=%u\n",

View File

@ -76,13 +76,13 @@ FAR struct iob_qentry_s *iob_free_qentry(FAR struct iob_qentry_s *iobq)
flags = enter_critical_section(); flags = enter_critical_section();
/* Which list? If there is a task waiting for an IOB, then put /* Which list? If there is a task waiting for an IOB chain, then put
* the IOB on either the free list or on the committed list where * the IOB chain on either the free list or on the committed list where
* it is reserved for that allocation (and not available to * it is reserved for that allocation (and not available to
* iob_tryalloc()). * iob_tryalloc_qentry()).
*/ */
if (g_iob_sem.semcount < 0) if (g_qentry_sem.semcount < 0)
{ {
iobq->qe_flink = g_iob_qcommitted; iobq->qe_flink = g_iob_qcommitted;
g_iob_qcommitted = iobq; g_iob_qcommitted = iobq;

View File

@ -77,12 +77,12 @@ int iob_navail(bool throttled)
if (throttled) if (throttled)
{ {
ret -= CONFIG_IOB_THROTTLE; ret -= CONFIG_IOB_THROTTLE;
if (ret < 0)
{
ret = 0;
}
} }
#endif #endif
if (ret < 0)
{
ret = 0;
}
} }
#else #else
@ -112,6 +112,10 @@ int iob_qentry_navail(void)
if (ret >= 0) if (ret >= 0)
{ {
ret = navail; ret = navail;
if (ret < 0)
{
ret = 0;
}
} }
#else #else

View File

@ -45,14 +45,6 @@
#include "iob.h" #include "iob.h"
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
#ifndef MIN
# define MIN(a,b) ((a) < (b) ? (a) : (b))
#endif
/**************************************************************************** /****************************************************************************
* Public Functions * Public Functions
****************************************************************************/ ****************************************************************************/
@ -79,6 +71,10 @@ FAR struct iob_s *iob_pack(FAR struct iob_s *iob)
while (iob->io_len <= 0) while (iob->io_len <= 0)
{ {
iob = iob_free(iob); iob = iob_free(iob);
if (iob == NULL)
{
return NULL;
}
} }
/* Now remember the head of the chain (for the return value) */ /* Now remember the head of the chain (for the return value) */