Commit 0e3aef8d authored by Vlad Yasevich's avatar Vlad Yasevich

sctp: Tag messages that can be Nagle delayed at creation.

When we create the sctp_datamsg and fragment the user data,
we know exactly if we are sending full segments or not and
how they might be bundled.  During this time, we can mark
messages a Nagle capable or not.  This makes the check at
transmit time much simpler.
Signed-off-by: default avatarVlad Yasevich <vladislav.yasevich@hp.com>
parent bfa0d984
...@@ -643,17 +643,15 @@ struct sctp_pf { ...@@ -643,17 +643,15 @@ struct sctp_pf {
struct sctp_datamsg { struct sctp_datamsg {
/* Chunks waiting to be submitted to lower layer. */ /* Chunks waiting to be submitted to lower layer. */
struct list_head chunks; struct list_head chunks;
/* Chunks that have been transmitted. */
size_t msg_size;
/* Reference counting. */ /* Reference counting. */
atomic_t refcnt; atomic_t refcnt;
/* When is this message no longer interesting to the peer? */ /* When is this message no longer interesting to the peer? */
unsigned long expires_at; unsigned long expires_at;
/* Did the messenge fail to send? */ /* Did the messenge fail to send? */
int send_error; int send_error;
char send_failed; u8 send_failed:1,
/* Control whether chunks from this message can be abandoned. */ can_abandon:1, /* can chunks from this message can be abandoned. */
char can_abandon; can_delay; /* should this message be Nagle delayed */
}; };
struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *, struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *,
......
...@@ -58,9 +58,9 @@ static void sctp_datamsg_init(struct sctp_datamsg *msg) ...@@ -58,9 +58,9 @@ static void sctp_datamsg_init(struct sctp_datamsg *msg)
msg->send_failed = 0; msg->send_failed = 0;
msg->send_error = 0; msg->send_error = 0;
msg->can_abandon = 0; msg->can_abandon = 0;
msg->can_delay = 1;
msg->expires_at = 0; msg->expires_at = 0;
INIT_LIST_HEAD(&msg->chunks); INIT_LIST_HEAD(&msg->chunks);
msg->msg_size = 0;
} }
/* Allocate and initialize datamsg. */ /* Allocate and initialize datamsg. */
...@@ -157,7 +157,6 @@ static void sctp_datamsg_assign(struct sctp_datamsg *msg, struct sctp_chunk *chu ...@@ -157,7 +157,6 @@ static void sctp_datamsg_assign(struct sctp_datamsg *msg, struct sctp_chunk *chu
{ {
sctp_datamsg_hold(msg); sctp_datamsg_hold(msg);
chunk->msg = msg; chunk->msg = msg;
msg->msg_size += chunk->skb->len;
} }
...@@ -247,6 +246,7 @@ struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *asoc, ...@@ -247,6 +246,7 @@ struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *asoc,
if (msg_len >= first_len) { if (msg_len >= first_len) {
msg_len -= first_len; msg_len -= first_len;
whole = 1; whole = 1;
msg->can_delay = 0;
} }
/* How many full sized? How many bytes leftover? */ /* How many full sized? How many bytes leftover? */
......
...@@ -674,7 +674,7 @@ static sctp_xmit_t sctp_packet_can_append_data(struct sctp_packet *packet, ...@@ -674,7 +674,7 @@ static sctp_xmit_t sctp_packet_can_append_data(struct sctp_packet *packet,
* Don't delay large message writes that may have been * Don't delay large message writes that may have been
* fragmeneted into small peices. * fragmeneted into small peices.
*/ */
if ((len < max) && (chunk->msg->msg_size < max)) { if ((len < max) && chunk->msg->can_delay) {
retval = SCTP_XMIT_NAGLE_DELAY; retval = SCTP_XMIT_NAGLE_DELAY;
goto finish; goto finish;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment