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:
parent
62fb761ff2
commit
28085b2e10
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=208853
@ -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");
|
||||
}
|
||||
}
|
||||
|
@ -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__ */
|
||||
|
Loading…
Reference in New Issue
Block a user