Skip to content

Commit

Permalink
sctp: Remove outqueue empty state
Browse files Browse the repository at this point in the history
The SCTP outqueue structure maintains a data chunks
that are pending transmission, the list of chunks that
are pending a retransmission and a length of data in
flight.  It also tries to keep the emtpy state so that
it can performe shutdown sequence or notify user.

The problem is that the empy state is inconsistently
tracked.  It is possible to completely drain the queue
without sending anything when using PR-SCTP.  In this
case, the empty state will not be correctly state as
report by Jamal Hadi Salim <[email protected]>.  This
can cause an association to be perminantly stuck in the
SHUTDOWN_PENDING state.

Additionally, SCTP is incredibly inefficient when setting
the empty state.  Even though all the data is availaible
in the outqueue structure, we ignore it and walk a list
of trasnports.

In the end, we can completely remove the extra empty
state and figure out if the queue is empty by looking
at 3 things:  length of pending data, length of in-flight
data, and exisiting of retransmit data.  All of these
are already in the strucutre.

Reported-by: Jamal Hadi Salim <[email protected]>
Signed-off-by: Vlad Yasevich <[email protected]>
Acked-by: Neil Horman <[email protected]>
Tested-by: Jamal Hadi Salim <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
vyasevich authored and davem330 committed Jan 2, 2014
1 parent f3e3ccf commit 619a60e
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 28 deletions.
3 changes: 0 additions & 3 deletions include/net/sctp/structs.h
Original file line number Diff line number Diff line change
Expand Up @@ -1046,9 +1046,6 @@ struct sctp_outq {

/* Corked? */
char cork;

/* Is this structure empty? */
char empty;
};

void sctp_outq_init(struct sctp_association *, struct sctp_outq *);
Expand Down
32 changes: 7 additions & 25 deletions net/sctp/outqueue.c
Original file line number Diff line number Diff line change
Expand Up @@ -208,8 +208,6 @@ void sctp_outq_init(struct sctp_association *asoc, struct sctp_outq *q)
INIT_LIST_HEAD(&q->retransmit);
INIT_LIST_HEAD(&q->sacked);
INIT_LIST_HEAD(&q->abandoned);

q->empty = 1;
}

/* Free the outqueue structure and any related pending chunks.
Expand Down Expand Up @@ -332,7 +330,6 @@ int sctp_outq_tail(struct sctp_outq *q, struct sctp_chunk *chunk)
SCTP_INC_STATS(net, SCTP_MIB_OUTUNORDERCHUNKS);
else
SCTP_INC_STATS(net, SCTP_MIB_OUTORDERCHUNKS);
q->empty = 0;
break;
}
} else {
Expand Down Expand Up @@ -654,7 +651,6 @@ static int sctp_outq_flush_rtx(struct sctp_outq *q, struct sctp_packet *pkt,
if (chunk->fast_retransmit == SCTP_NEED_FRTX)
chunk->fast_retransmit = SCTP_DONT_FRTX;

q->empty = 0;
q->asoc->stats.rtxchunks++;
break;
}
Expand Down Expand Up @@ -1065,8 +1061,6 @@ static int sctp_outq_flush(struct sctp_outq *q, int rtx_timeout)

sctp_transport_reset_timers(transport);

q->empty = 0;

/* Only let one DATA chunk get bundled with a
* COOKIE-ECHO chunk.
*/
Expand Down Expand Up @@ -1275,29 +1269,17 @@ int sctp_outq_sack(struct sctp_outq *q, struct sctp_chunk *chunk)
"advertised peer ack point:0x%x\n", __func__, asoc, ctsn,
asoc->adv_peer_ack_point);

/* See if all chunks are acked.
* Make sure the empty queue handler will get run later.
*/
q->empty = (list_empty(&q->out_chunk_list) &&
list_empty(&q->retransmit));
if (!q->empty)
goto finish;

list_for_each_entry(transport, transport_list, transports) {
q->empty = q->empty && list_empty(&transport->transmitted);
if (!q->empty)
goto finish;
}

pr_debug("%s: sack queue is empty\n", __func__);
finish:
return q->empty;
return sctp_outq_is_empty(q);
}

/* Is the outqueue empty? */
/* Is the outqueue empty?
* The queue is empty when we have not pending data, no in-flight data
* and nothing pending retransmissions.
*/
int sctp_outq_is_empty(const struct sctp_outq *q)
{
return q->empty;
return q->out_qlen == 0 && q->outstanding_bytes == 0 &&
list_empty(&q->retransmit);
}

/********************************************************************
Expand Down

0 comments on commit 619a60e

Please sign in to comment.