sctp: a bunch of fixes for prsctp polices
Subsystems (3)
Xin Long
maintainerv3 cover sctp: a bunch of fixes for prsctp polices
This patchset is to fix 2 issues for prsctp polices:
1. patch 1 and 2 fix "netperf-Throughput_Mbps -37.2% regression" issue when overloading the CPU.
2. patch 3 fix "prsctp polices should check both sides' prsctp_capable, instead of only local side".
Xin Long (3):
sctp: move sent_count to the memory hole in sctp_chunk
sctp: remove prsctp_param from sctp_chunk
sctp: change to check peer prsctp_capable when using prsctp polices
include/net/sctp/structs.h | 13 +++---------- net/sctp/chunk.c | 11 ++++++++--- net/sctp/outqueue.c | 12 ++++++------ net/sctp/sm_make_chunk.c | 15 --------------- 4 files changed, 17 insertions(+), 34 deletions(-)
Signature · 1 line
2.1.0
Xin Long
maintainerPATCH v3 1/3 sctp: move sent_count to the memory hole in sctp_chunk
Now pahole sctp_chunk, it has 2 memory holes:
struct sctp_chunk {
struct list_head list;
atomic_t refcnt;
/* XXX 4 bytes hole, try to pack */
...
long unsigned int prsctp_param;
int sent_count;
/* XXX 4 bytes hole, try to pack */This patch is to move up sent_count to fill the 1st one and eliminate the 2nd one.
It's not just another struct compaction, it also fixes the "netperf- Throughput_Mbps -37.2% regression" issue when overloading the CPU.
--- include/net/sctp/structs.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
include/net/sctp/structs.h +3 -3
@@ -554,6 +554,9 @@ struct sctp_chunk {atomic_t refcnt; +/* How many times this chunk have been sent, for prsctp RTX policy */ +int sent_count; +/* This is our link to the per-transport transmitted list. */ struct list_head transmitted_list;
@@ -610,9 +613,6 @@ struct sctp_chunk {*/ unsigned long prsctp_param; -/* How many times this chunk have been sent, for prsctp RTX policy */ -int sent_count; -/* Which association does this belong to? */ struct sctp_association *asoc;
Signature · 1 line
2.1.0
Xin Long
maintainerPATCH v3 2/3 sctp: remove prsctp_param from sctp_chunk
Now sctp uses chunk->prsctp_param to save the prsctp param for all the prsctp polices, we didn't need to introduce prsctp_param to sctp_chunk. We can just use chunk->sinfo.sinfo_timetolive for RTX and BUF polices, and reuse msg->expires_at for TTL policy, as the prsctp polices and old expires policy are mutual exclusive.
This patch is to remove prsctp_param from sctp_chunk, and reuse msg's expires_at for TTL and chunk's sinfo.sinfo_timetolive for RTX and BUF polices.
Note that sctp can't use chunk's sinfo.sinfo_timetolive for TTL policy, as it needs a u64 variables to save the expires_at time.
This one also fixes the "netperf-Throughput_Mbps -37.2% regression" issue.
--- include/net/sctp/structs.h | 7 ------- net/sctp/chunk.c | 9 +++++++-- net/sctp/outqueue.c | 4 ++-- net/sctp/sm_make_chunk.c | 15 --------------- 4 files changed, 9 insertions(+), 26 deletions(-)
include/net/sctp/structs.h +0 -7
@@ -606,13 +606,6 @@ struct sctp_chunk {/* This needs to be recoverable for SCTP_SEND_FAILED events. */ struct sctp_sndrcvinfo sinfo; -/* We use this field to record param for prsctp policies, -* for TTL policy, it is the time_to_drop of this chunk, -* for RTX policy, it is the max_sent_count of this chunk, -* for PRIO policy, it is the priority of this chunk. -*/ -unsigned long prsctp_param; -/* Which association does this belong to? */ struct sctp_association *asoc;
net/sctp/chunk.c +6 -2
@@ -179,6 +179,11 @@ struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *asoc, msg, msg->expires_at, jiffies); } +if (asoc->prsctp_enable && +SCTP_PR_TTL_ENABLED (sinfo->sinfo_flags)) + msg->expires_at + jiffies +msecs_to_jiffies (sinfo->sinfo_timetolive); +/* This is the biggest possible DATA chunk that can fit into * the packet */
@@ -349,14 +354,14 @@ int sctp_chunk_abandoned(struct sctp_chunk *chunk) }if (SCTP_PR_TTL_ENABLED (chunk->sinfo.sinfo_flags) && -time_after (jiffies, chunk->prsctp_param)) { +time_after (jiffies, chunk->msg->expires_at)) {if (chunk->sent_count) chunk->asoc->abandoned_sent[SCTP_PR_INDEX (TTL )]++;else chunk->asoc->abandoned_unsent[SCTP_PR_INDEX (TTL )]++;return 1 ; }else if (SCTP_PR_RTX_ENABLED (chunk->sinfo.sinfo_flags) && - chunk->sent_count > chunk->prsctp_param) { + chunk->sent_count > chunk->sinfo.sinfo_timetolive) { chunk->asoc->abandoned_sent[SCTP_PR_INDEX (RTX )]++;return 1 ; }
net/sctp/outqueue.c +2 -2
@@ -383,7 +383,7 @@ static int sctp_prsctp_prune_sent(struct sctp_association *asoc,list_for_each_entry_safe (chk, temp, queue, transmitted_list) {if (!SCTP_PR_PRIO_ENABLED (chk->sinfo.sinfo_flags) || - chk->prsctp_param <= sinfo->sinfo_timetolive) + chk->sinfo.sinfo_timetolive <= sinfo->sinfo_timetolive)continue ;list_del_init (&chk->transmitted_list);
@@ -418,7 +418,7 @@ static int sctp_prsctp_prune_unsent(struct sctp_association *asoc,list_for_each_entry_safe (chk, temp, queue, list) {if (!SCTP_PR_PRIO_ENABLED (chk->sinfo.sinfo_flags) || - chk->prsctp_param <= sinfo->sinfo_timetolive) + chk->sinfo.sinfo_timetolive <= sinfo->sinfo_timetolive)continue ;list_del_init (&chk->list);
net/sctp/sm_make_chunk.c +0 -14
@@ -706,20 +706,6 @@ nodata:return retval; } -static void sctp_set_prsctp_policy (struct sctp_chunk *chunk, -const struct sctp_sndrcvinfo *sinfo) -{ -if (!chunk->asoc->prsctp_enable) -return ; - -if (SCTP_PR_TTL_ENABLED (sinfo->sinfo_flags)) - chunk->prsctp_param - jiffies +msecs_to_jiffies (sinfo->sinfo_timetolive); -else if (SCTP_PR_RTX_ENABLED (sinfo->sinfo_flags) || -SCTP_PR_PRIO_ENABLED (sinfo->sinfo_flags)) - chunk->prsctp_param = sinfo->sinfo_timetolive; -} -/* Make a DATA chunk for the given association from the provided * parameters. However, do not populate the data payload. */
@@ -753,7 +739,6 @@ struct sctp_chunk *sctp_make_datafrag_empty(struct sctp_association *asoc, retval->subh.data_hdr =sctp_addto_chunk (retval,sizeof (dp), &dp);memcpy (&retval->sinfo, sinfo,sizeof (struct sctp_sndrcvinfo )); -sctp_set_prsctp_policy (retval, sinfo); nodata:return retval;
Signature · 1 line
2.1.0
Xin Long
maintainerPATCH v3 3/3 sctp: change to check peer prsctp_capable when using prsctp polices
Now before using prsctp polices, sctp uses asoc->prsctp_enable to check if prsctp is enabled. However asoc->prsctp_enable is set only means local host support prsctp, sctp should not abandon packet if peer host doesn't enable prsctp.
So this patch is to use asoc->peer.prsctp_capable to check if prsctp is enabled on both side, instead of asoc->prsctp_enable, as asoc's peer.prsctp_capable is set only when local and peer both enable prsctp.
--- net/sctp/chunk.c | 4 ++-- net/sctp/outqueue.c | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-)
net/sctp/chunk.c +2 -2
@@ -179,7 +179,7 @@ struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *asoc, msg, msg->expires_at, jiffies); } -if (asoc->prsctp_enable && +if (asoc->peer.prsctp_capable &&SCTP_PR_TTL_ENABLED (sinfo->sinfo_flags)) msg->expires_at jiffies + msecs_to_jiffies(sinfo->sinfo_timetolive);
@@ -340,7 +340,7 @@ errout:/* Check whether this message has expired. */ int sctp_chunk_abandoned (struct sctp_chunk *chunk) { -if (!chunk->asoc->prsctp_enable || +if (!chunk->asoc->peer.prsctp_capable || !SCTP_PR_POLICY (chunk->sinfo.sinfo_flags)) {struct sctp_datamsg *msg = chunk->msg;
net/sctp/outqueue.c +4 -4
@@ -326,7 +326,7 @@ int sctp_outq_tail(struct sctp_outq *q, struct sctp_chunk *chunk, gfp_t gfp)sctp_chunk_hold (chunk);sctp_outq_tail_data (q, chunk); -if (chunk->asoc->prsctp_enable && +if (chunk->asoc->peer.prsctp_capable &&SCTP_PR_PRIO_ENABLED (chunk->sinfo.sinfo_flags)) chunk->asoc->sent_cnt_removable++;if (chunk->chunk_hdr->flags &SCTP_DATA_UNORDERED )
@@ -442,7 +442,7 @@ void sctp_prsctp_prune(struct sctp_association *asoc, {struct sctp_transport *transport; -if (!asoc->prsctp_enable || !asoc->sent_cnt_removable) +if (!asoc->peer.prsctp_capable || !asoc->sent_cnt_removable)return ; msg_len = sctp_prsctp_prune_sent(asoc, sinfo,
@@ -1055,7 +1055,7 @@ static int sctp_outq_flush(struct sctp_outq *q, int rtx_timeout, gfp_t gfp)/* Mark as failed send. */ sctp_chunk_fail (chunk,SCTP_ERROR_INV_STRM ); -if (asoc->prsctp_enable && +if (asoc->peer.prsctp_capable &&SCTP_PR_PRIO_ENABLED (chunk->sinfo.sinfo_flags)) asoc->sent_cnt_removable--;sctp_chunk_free (chunk);
@@ -1347,7 +1347,7 @@ int sctp_outq_sack(struct sctp_outq *q, struct sctp_chunk *chunk) tsn =ntohl (tchunk->subh.data_hdr->tsn);if (TSN_lte (tsn, ctsn)) {list_del_init (&tchunk->transmitted_list); -if (asoc->prsctp_enable && +if (asoc->peer.prsctp_capable &&SCTP_PR_PRIO_ENABLED (chunk->sinfo.sinfo_flags)) asoc->sent_cnt_removable--;sctp_chunk_free (tchunk);
Signature · 1 line
2.1.0
David Miller
maintainerFrom: Xin Long <[email protected]>
Date: Thu, 29 Sep 2016 02:37:25 +0800
Quoted 7 lines
This patchset is to fix 2 issues for prsctp polices:
1. patch 1 and 2 fix "netperf-Throughput_Mbps -37.2% regression" issue when overloading the CPU.
2. patch 3 fix "prsctp polices should check both sides'
prsctp_capable, instead of only local side".
Series applied, thanks.