This is the mail archive of the ecos-patches@sources.redhat.com mailing list for the eCos project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
hi, here is a proposed patch to fix a possible deadlock situation in the ecos port of the FreeBSD IP stack. In sosend() (uipc_socket.c:553) there is blocking wait for a mbuf ( MGET(WAIT) ). Let us assume the stack is running out of MBufs (e.g. under heavy IP traffic). Since the mbuf "free-list" is empty and the mbuf pool is also empty a MGET(WAIT) performs at last a cyg_mempool_fix_alloc() call, wich is blocking forever. Also the mutex splimp() is locked forever. Note: MBufs are freed back to the "free-list" but are never freed back to pool. Further the mbuf statistic counter increments twice. mbstat.m_mbufs++ is done in cyg_net_mbuf_alloc() and also in m_mballoc() (both in file uipc_mbuf.c). The patch prevents a blocking alloc of MBufs. It is done similar to the cluster alloc mechanism. Double mbuf counting was fixed also. regards, Christoph ChangeLog entry: 2004-03-30 Horst Kronstorfer <horst.kronstorfer@frequentis.com> * src/sys/kern/uipc_mbuf.c * src/ecos/support.c * include/sys/mbuf.h: Avoid blocking alloc from (empty) mbuf pool, because freed mbufs are never returned to the pool, but to the mbuf "free list" (deadlock situation). Duplicated counting of mbuf statistics removed. --
Attachment:
patch1
Description: Text document
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |