This does two changes:

1) Makes it so that the INVARIANT function validate nolocks is
   available anywhere.
2) Fixes a BUG where a close has been done on a collision socket
   and the cookie processing would return leaving a lock held.
MFC after:	1 week
This commit is contained in:
Randall Stewart 2010-06-05 21:20:28 +00:00
parent 62fb761ff2
commit 28085b2e10
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=208853
2 changed files with 18 additions and 6 deletions

View File

@ -3067,7 +3067,7 @@ process_chunk_drop(struct sctp_tcb *stcb, struct sctp_chunk_desc *desc,
struct sctp_nets *net, uint8_t flg)
{
switch (desc->chunk_type) {
case SCTP_DATA:
case SCTP_DATA:
/* find the tsn to resend (possibly */
{
uint32_t tsn;
@ -4861,6 +4861,9 @@ __attribute__((noinline))
} else {
if (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) {
/* We are not interested anymore */
if (stcb) {
SCTP_TCB_UNLOCK(stcb);
}
*offset = length;
return (NULL);
}
@ -5408,13 +5411,16 @@ sctp_process_ecn_marked_b(struct sctp_tcb *stcb, struct sctp_nets *net,
}
#ifdef INVARIANTS
static void
sctp_validate_no_locks(struct sctp_inpcb *inp)
#ifdef __GNUC__
__attribute__((noinline))
#endif
void
sctp_validate_no_locks(struct sctp_inpcb *inp)
{
struct sctp_tcb *stcb;
struct sctp_tcb *lstcb;
LIST_FOREACH(stcb, &inp->sctp_asoc_list, sctp_tcblist) {
if (mtx_owned(&stcb->tcb_mtx)) {
LIST_FOREACH(lstcb, &inp->sctp_asoc_list, sctp_tcblist) {
if (mtx_owned(&lstcb->tcb_mtx)) {
panic("Own lock on stcb at return from input");
}
}

View File

@ -621,5 +621,11 @@ sctp_initiate_iterator(inp_func inpf,
struct sctp_inpcb *,
uint8_t co_off);
#ifdef INVARIANTS
void
sctp_validate_no_locks(struct sctp_inpcb *inp);
#endif
#endif /* _KERNEL */
#endif /* !__sctp_pcb_h__ */