Skip to content

Commit 7b7fc97

Browse files
edumazetdavem330
authored andcommitted
tcp: optimize some skb_shinfo(skb) uses
Compiler doesn't know skb_shinfo(skb) pointer is usually constant. By using a temporary variable, we help generating smaller code. For example, tcp_init_nondata_skb() is inlined after this patch. Signed-off-by: Eric Dumazet <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 84b9cd6 commit 7b7fc97

File tree

1 file changed

+21
-15
lines changed

1 file changed

+21
-15
lines changed

net/ipv4/tcp_output.c

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -363,15 +363,17 @@ static inline void TCP_ECN_send(struct sock *sk, struct sk_buff *skb,
363363
*/
364364
static void tcp_init_nondata_skb(struct sk_buff *skb, u32 seq, u8 flags)
365365
{
366+
struct skb_shared_info *shinfo = skb_shinfo(skb);
367+
366368
skb->ip_summed = CHECKSUM_PARTIAL;
367369
skb->csum = 0;
368370

369371
TCP_SKB_CB(skb)->tcp_flags = flags;
370372
TCP_SKB_CB(skb)->sacked = 0;
371373

372-
skb_shinfo(skb)->gso_segs = 1;
373-
skb_shinfo(skb)->gso_size = 0;
374-
skb_shinfo(skb)->gso_type = 0;
374+
shinfo->gso_segs = 1;
375+
shinfo->gso_size = 0;
376+
shinfo->gso_type = 0;
375377

376378
TCP_SKB_CB(skb)->seq = seq;
377379
if (flags & (TCPHDR_SYN | TCPHDR_FIN))
@@ -986,20 +988,22 @@ static void tcp_queue_skb(struct sock *sk, struct sk_buff *skb)
986988
static void tcp_set_skb_tso_segs(const struct sock *sk, struct sk_buff *skb,
987989
unsigned int mss_now)
988990
{
991+
struct skb_shared_info *shinfo = skb_shinfo(skb);
992+
989993
/* Make sure we own this skb before messing gso_size/gso_segs */
990994
WARN_ON_ONCE(skb_cloned(skb));
991995

992996
if (skb->len <= mss_now || skb->ip_summed == CHECKSUM_NONE) {
993997
/* Avoid the costly divide in the normal
994998
* non-TSO case.
995999
*/
996-
skb_shinfo(skb)->gso_segs = 1;
997-
skb_shinfo(skb)->gso_size = 0;
998-
skb_shinfo(skb)->gso_type = 0;
1000+
shinfo->gso_segs = 1;
1001+
shinfo->gso_size = 0;
1002+
shinfo->gso_type = 0;
9991003
} else {
1000-
skb_shinfo(skb)->gso_segs = DIV_ROUND_UP(skb->len, mss_now);
1001-
skb_shinfo(skb)->gso_size = mss_now;
1002-
skb_shinfo(skb)->gso_type = sk->sk_gso_type;
1004+
shinfo->gso_segs = DIV_ROUND_UP(skb->len, mss_now);
1005+
shinfo->gso_size = mss_now;
1006+
shinfo->gso_type = sk->sk_gso_type;
10031007
}
10041008
}
10051009

@@ -1146,6 +1150,7 @@ int tcp_fragment(struct sock *sk, struct sk_buff *skb, u32 len,
11461150
*/
11471151
static void __pskb_trim_head(struct sk_buff *skb, int len)
11481152
{
1153+
struct skb_shared_info *shinfo;
11491154
int i, k, eat;
11501155

11511156
eat = min_t(int, len, skb_headlen(skb));
@@ -1157,23 +1162,24 @@ static void __pskb_trim_head(struct sk_buff *skb, int len)
11571162
}
11581163
eat = len;
11591164
k = 0;
1160-
for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
1161-
int size = skb_frag_size(&skb_shinfo(skb)->frags[i]);
1165+
shinfo = skb_shinfo(skb);
1166+
for (i = 0; i < shinfo->nr_frags; i++) {
1167+
int size = skb_frag_size(&shinfo->frags[i]);
11621168

11631169
if (size <= eat) {
11641170
skb_frag_unref(skb, i);
11651171
eat -= size;
11661172
} else {
1167-
skb_shinfo(skb)->frags[k] = skb_shinfo(skb)->frags[i];
1173+
shinfo->frags[k] = shinfo->frags[i];
11681174
if (eat) {
1169-
skb_shinfo(skb)->frags[k].page_offset += eat;
1170-
skb_frag_size_sub(&skb_shinfo(skb)->frags[k], eat);
1175+
shinfo->frags[k].page_offset += eat;
1176+
skb_frag_size_sub(&shinfo->frags[k], eat);
11711177
eat = 0;
11721178
}
11731179
k++;
11741180
}
11751181
}
1176-
skb_shinfo(skb)->nr_frags = k;
1182+
shinfo->nr_frags = k;
11771183

11781184
skb_reset_tail_pointer(skb);
11791185
skb->data_len -= len;

0 commit comments

Comments
 (0)