sctp: Tag messages that can be Nagle delayed at creation.
authorVlad Yasevich <vladislav.yasevich@hp.com>
Sat, 1 May 2010 02:41:10 +0000 (22:41 -0400)
committerVlad Yasevich <vladislav.yasevich@hp.com>
Sat, 1 May 2010 02:41:10 +0000 (22:41 -0400)
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: Vlad Yasevich <vladislav.yasevich@hp.com>
include/net/sctp/structs.h
net/sctp/chunk.c
net/sctp/output.c

index d463296..9d44aef 100644 (file)
@@ -643,17 +643,15 @@ struct sctp_pf {
 struct sctp_datamsg {
        /* Chunks waiting to be submitted to lower layer. */
        struct list_head chunks;
-       /* Chunks that have been transmitted. */
-       size_t msg_size;
        /* Reference counting. */
        atomic_t refcnt;
        /* When is this message no longer interesting to the peer? */
        unsigned long expires_at;
        /* Did the messenge fail to send? */
        int send_error;
-       char send_failed;
-       /* Control whether chunks from this message can be abandoned. */
-       char can_abandon;
+       u8 send_failed:1,
+          can_abandon:1,   /* can chunks from this message can be abandoned. */
+          can_delay;       /* should this message be Nagle delayed */
 };
 
 struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *,
index 3eab6db..476caaf 100644 (file)
@@ -58,9 +58,9 @@ static void sctp_datamsg_init(struct sctp_datamsg *msg)
        msg->send_failed = 0;
        msg->send_error = 0;
        msg->can_abandon = 0;
+       msg->can_delay = 1;
        msg->expires_at = 0;
        INIT_LIST_HEAD(&msg->chunks);
-       msg->msg_size = 0;
 }
 
 /* Allocate and initialize datamsg. */
@@ -157,7 +157,6 @@ static void sctp_datamsg_assign(struct sctp_datamsg *msg, struct sctp_chunk *chu
 {
        sctp_datamsg_hold(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,
        if (msg_len >= first_len) {
                msg_len -= first_len;
                whole = 1;
+               msg->can_delay = 0;
        }
 
        /* How many full sized?  How many bytes leftover? */
index 35e49b9..a646681 100644 (file)
@@ -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
                 * fragmeneted into small peices.
                 */
-               if ((len < max) && (chunk->msg->msg_size < max)) {
+               if ((len < max) && chunk->msg->can_delay) {
                        retval = SCTP_XMIT_NAGLE_DELAY;
                        goto finish;
                }