Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[NET]: Store skb->timestamp as offset to a base timestamp

Reduces skb size by 8 bytes on 64-bit.

Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Patrick McHardy and committed by
David S. Miller
a61bbcf2 25ed8910

+172 -88
+1 -1
drivers/atm/ambassador.c
··· 513 513 514 514 // VC layer stats 515 515 atomic_inc(&atm_vcc->stats->rx); 516 - do_gettimeofday(&skb->stamp); 516 + __net_timestamp(skb); 517 517 // end of our responsability 518 518 atm_vcc->push (atm_vcc, skb); 519 519 return;
+1 -1
drivers/atm/atmtcp.c
··· 325 325 result = -ENOBUFS; 326 326 goto done; 327 327 } 328 - do_gettimeofday(&new_skb->stamp); 328 + __net_timestamp(new_skb); 329 329 memcpy(skb_put(new_skb,skb->len),skb->data,skb->len); 330 330 out_vcc->push(out_vcc,new_skb); 331 331 atomic_inc(&vcc->stats->tx);
+1 -1
drivers/atm/eni.c
··· 537 537 return 0; 538 538 } 539 539 skb_put(skb,length); 540 - skb->stamp = eni_vcc->timestamp; 540 + skb_set_timestamp(skb, &eni_vcc->timestamp); 541 541 DPRINTK("got len %ld\n",length); 542 542 if (do_rx_dma(vcc,skb,1,length >> 2,length >> 2)) return 1; 543 543 eni_vcc->rxing++;
+1 -1
drivers/atm/firestream.c
··· 815 815 skb_put (skb, qe->p1 & 0xffff); 816 816 ATM_SKB(skb)->vcc = atm_vcc; 817 817 atomic_inc(&atm_vcc->stats->rx); 818 - do_gettimeofday(&skb->stamp); 818 + __net_timestamp(skb); 819 819 fs_dprintk (FS_DEBUG_ALLOC, "Free rec-skb: %p (pushed)\n", skb); 820 820 atm_vcc->push (atm_vcc, skb); 821 821 fs_dprintk (FS_DEBUG_ALLOC, "Free rec-d: %p\n", pe);
+1 -1
drivers/atm/fore200e.c
··· 1176 1176 return -ENOMEM; 1177 1177 } 1178 1178 1179 - do_gettimeofday(&skb->stamp); 1179 + __net_timestamp(skb); 1180 1180 1181 1181 #ifdef FORE200E_52BYTE_AAL0_SDU 1182 1182 if (cell_header) {
+1 -1
drivers/atm/he.c
··· 1886 1886 if (rx_skb_reserve > 0) 1887 1887 skb_reserve(skb, rx_skb_reserve); 1888 1888 1889 - do_gettimeofday(&skb->stamp); 1889 + __net_timestamp(skb); 1890 1890 1891 1891 for (iov = he_vcc->iov_head; 1892 1892 iov < he_vcc->iov_tail; ++iov) {
+1 -1
drivers/atm/horizon.c
··· 1034 1034 struct atm_vcc * vcc = ATM_SKB(skb)->vcc; 1035 1035 // VC layer stats 1036 1036 atomic_inc(&vcc->stats->rx); 1037 - do_gettimeofday(&skb->stamp); 1037 + __net_timestamp(skb); 1038 1038 // end of our responsability 1039 1039 vcc->push (vcc, skb); 1040 1040 }
+4 -4
drivers/atm/idt77252.c
··· 1101 1101 cell, ATM_CELL_PAYLOAD); 1102 1102 1103 1103 ATM_SKB(sb)->vcc = vcc; 1104 - do_gettimeofday(&sb->stamp); 1104 + __net_timestamp(sb); 1105 1105 vcc->push(vcc, sb); 1106 1106 atomic_inc(&vcc->stats->rx); 1107 1107 ··· 1179 1179 1180 1180 skb_trim(skb, len); 1181 1181 ATM_SKB(skb)->vcc = vcc; 1182 - do_gettimeofday(&skb->stamp); 1182 + __net_timestamp(skb); 1183 1183 1184 1184 vcc->push(vcc, skb); 1185 1185 atomic_inc(&vcc->stats->rx); ··· 1201 1201 1202 1202 skb_trim(skb, len); 1203 1203 ATM_SKB(skb)->vcc = vcc; 1204 - do_gettimeofday(&skb->stamp); 1204 + __net_timestamp(skb); 1205 1205 1206 1206 vcc->push(vcc, skb); 1207 1207 atomic_inc(&vcc->stats->rx); ··· 1340 1340 ATM_CELL_PAYLOAD); 1341 1341 1342 1342 ATM_SKB(sb)->vcc = vcc; 1343 - do_gettimeofday(&sb->stamp); 1343 + __net_timestamp(sb); 1344 1344 vcc->push(vcc, sb); 1345 1345 atomic_inc(&vcc->stats->rx); 1346 1346
+1 -1
drivers/atm/lanai.c
··· 1427 1427 skb_put(skb, size); 1428 1428 vcc_rx_memcpy(skb->data, lvcc, size); 1429 1429 ATM_SKB(skb)->vcc = lvcc->rx.atmvcc; 1430 - do_gettimeofday(&skb->stamp); 1430 + __net_timestamp(skb); 1431 1431 lvcc->rx.atmvcc->push(lvcc->rx.atmvcc, skb); 1432 1432 atomic_inc(&lvcc->rx.atmvcc->stats->rx); 1433 1433 out:
+5 -5
drivers/atm/nicstar.c
··· 2213 2213 memcpy(sb->tail, cell, ATM_CELL_PAYLOAD); 2214 2214 skb_put(sb, ATM_CELL_PAYLOAD); 2215 2215 ATM_SKB(sb)->vcc = vcc; 2216 - do_gettimeofday(&sb->stamp); 2216 + __net_timestamp(sb); 2217 2217 vcc->push(vcc, sb); 2218 2218 atomic_inc(&vcc->stats->rx); 2219 2219 cell += ATM_CELL_PAYLOAD; ··· 2346 2346 skb->destructor = ns_sb_destructor; 2347 2347 #endif /* NS_USE_DESTRUCTORS */ 2348 2348 ATM_SKB(skb)->vcc = vcc; 2349 - do_gettimeofday(&skb->stamp); 2349 + __net_timestamp(skb); 2350 2350 vcc->push(vcc, skb); 2351 2351 atomic_inc(&vcc->stats->rx); 2352 2352 } ··· 2373 2373 sb->destructor = ns_sb_destructor; 2374 2374 #endif /* NS_USE_DESTRUCTORS */ 2375 2375 ATM_SKB(sb)->vcc = vcc; 2376 - do_gettimeofday(&sb->stamp); 2376 + __net_timestamp(sb); 2377 2377 vcc->push(vcc, sb); 2378 2378 atomic_inc(&vcc->stats->rx); 2379 2379 } ··· 2398 2398 memcpy(skb->data, sb->data, NS_SMBUFSIZE); 2399 2399 skb_put(skb, len - NS_SMBUFSIZE); 2400 2400 ATM_SKB(skb)->vcc = vcc; 2401 - do_gettimeofday(&skb->stamp); 2401 + __net_timestamp(skb); 2402 2402 vcc->push(vcc, skb); 2403 2403 atomic_inc(&vcc->stats->rx); 2404 2404 } ··· 2505 2505 #ifdef NS_USE_DESTRUCTORS 2506 2506 hb->destructor = ns_hb_destructor; 2507 2507 #endif /* NS_USE_DESTRUCTORS */ 2508 - do_gettimeofday(&hb->stamp); 2508 + __net_timestamp(hb); 2509 2509 vcc->push(vcc, hb); 2510 2510 atomic_inc(&vcc->stats->rx); 2511 2511 }
+1 -1
drivers/atm/zatm.c
··· 400 400 EVENT("error code 0x%x/0x%x\n",(here[3] & uPD98401_AAL5_ES) >> 401 401 uPD98401_AAL5_ES_SHIFT,error); 402 402 skb = ((struct rx_buffer_head *) bus_to_virt(here[2]))->skb; 403 - do_gettimeofday(&skb->stamp); 403 + __net_timestamp(skb); 404 404 #if 0 405 405 printk("[-3..0] 0x%08lx 0x%08lx 0x%08lx 0x%08lx\n",((unsigned *) skb->data)[-3], 406 406 ((unsigned *) skb->data)[-2],((unsigned *) skb->data)[-1],
+45 -2
include/linux/skbuff.h
··· 155 155 #define SKB_DATAREF_SHIFT 16 156 156 #define SKB_DATAREF_MASK ((1 << SKB_DATAREF_SHIFT) - 1) 157 157 158 + extern struct timeval skb_tv_base; 159 + 160 + struct skb_timeval { 161 + u32 off_sec; 162 + u32 off_usec; 163 + }; 164 + 158 165 /** 159 166 * struct sk_buff - socket buffer 160 167 * @next: Next buffer in list 161 168 * @prev: Previous buffer in list 162 169 * @list: List we are on 163 170 * @sk: Socket we are owned by 164 - * @stamp: Time we arrived 171 + * @tstamp: Time we arrived stored as offset to skb_tv_base 165 172 * @dev: Device we arrived on/are leaving by 166 173 * @input_dev: Device we arrived on 167 174 * @h: Transport layer header ··· 209 202 struct sk_buff *prev; 210 203 211 204 struct sock *sk; 212 - struct timeval stamp; 205 + struct skb_timeval tstamp; 213 206 struct net_device *dev; 214 207 struct net_device *input_dev; 215 208 ··· 1219 1212 1220 1213 extern void skb_init(void); 1221 1214 extern void skb_add_mtu(int mtu); 1215 + 1216 + /** 1217 + * skb_get_timestamp - get timestamp from a skb 1218 + * @skb: skb to get stamp from 1219 + * @stamp: pointer to struct timeval to store stamp in 1220 + * 1221 + * Timestamps are stored in the skb as offsets to a base timestamp. 1222 + * This function converts the offset back to a struct timeval and stores 1223 + * it in stamp. 1224 + */ 1225 + static inline void skb_get_timestamp(struct sk_buff *skb, struct timeval *stamp) 1226 + { 1227 + stamp->tv_sec = skb->tstamp.off_sec; 1228 + stamp->tv_usec = skb->tstamp.off_usec; 1229 + if (skb->tstamp.off_sec) { 1230 + stamp->tv_sec += skb_tv_base.tv_sec; 1231 + stamp->tv_usec += skb_tv_base.tv_usec; 1232 + } 1233 + } 1234 + 1235 + /** 1236 + * skb_set_timestamp - set timestamp of a skb 1237 + * @skb: skb to set stamp of 1238 + * @stamp: pointer to struct timeval to get stamp from 1239 + * 1240 + * Timestamps are stored in the skb as offsets to a base timestamp. 1241 + * This function converts a struct timeval to an offset and stores 1242 + * it in the skb. 1243 + */ 1244 + static inline void skb_set_timestamp(struct sk_buff *skb, struct timeval *stamp) 1245 + { 1246 + skb->tstamp.off_sec = stamp->tv_sec - skb_tv_base.tv_sec; 1247 + skb->tstamp.off_usec = stamp->tv_usec - skb_tv_base.tv_usec; 1248 + } 1249 + 1250 + extern void __net_timestamp(struct sk_buff *skb); 1222 1251 1223 1252 #ifdef CONFIG_NETFILTER 1224 1253 static inline void nf_conntrack_put(struct nf_conntrack *nfct)
+1 -1
include/net/bluetooth/hci_core.h
··· 404 404 bt_cb(skb)->incoming = 1; 405 405 406 406 /* Time stamp */ 407 - do_gettimeofday(&skb->stamp); 407 + __net_timestamp(skb); 408 408 409 409 /* Queue frame for rx task */ 410 410 skb_queue_tail(&hdev->rx_q, skb);
+8 -1
include/net/neighbour.h
··· 363 363 return neigh_create(tbl, pkey, dev); 364 364 } 365 365 366 - #define LOCALLY_ENQUEUED -2 366 + struct neighbour_cb { 367 + unsigned long sched_next; 368 + unsigned int flags; 369 + }; 370 + 371 + #define LOCALLY_ENQUEUED 0x1 372 + 373 + #define NEIGH_CB(skb) ((struct neighbour_cb *)(skb)->cb) 367 374 368 375 #endif 369 376 #endif
+8 -5
include/net/sock.h
··· 1282 1282 static __inline__ void 1283 1283 sock_recv_timestamp(struct msghdr *msg, struct sock *sk, struct sk_buff *skb) 1284 1284 { 1285 - struct timeval *stamp = &skb->stamp; 1285 + struct timeval stamp; 1286 + 1287 + skb_get_timestamp(skb, &stamp); 1286 1288 if (sock_flag(sk, SOCK_RCVTSTAMP)) { 1287 1289 /* Race occurred between timestamp enabling and packet 1288 1290 receiving. Fill in the current time for now. */ 1289 - if (stamp->tv_sec == 0) 1290 - do_gettimeofday(stamp); 1291 + if (stamp.tv_sec == 0) 1292 + do_gettimeofday(&stamp); 1293 + skb_set_timestamp(skb, &stamp); 1291 1294 put_cmsg(msg, SOL_SOCKET, SO_TIMESTAMP, sizeof(struct timeval), 1292 - stamp); 1295 + &stamp); 1293 1296 } else 1294 - sk->sk_stamp = *stamp; 1297 + sk->sk_stamp = stamp; 1295 1298 } 1296 1299 1297 1300 /**
+1 -1
net/bluetooth/hci_core.c
··· 999 999 1000 1000 if (atomic_read(&hdev->promisc)) { 1001 1001 /* Time stamp */ 1002 - do_gettimeofday(&skb->stamp); 1002 + __net_timestamp(skb); 1003 1003 1004 1004 hci_send_to_sock(hdev, skb); 1005 1005 }
+1 -1
net/bluetooth/hci_event.c
··· 1087 1087 memcpy(ev->data, data, dlen); 1088 1088 1089 1089 bt_cb(skb)->incoming = 1; 1090 - do_gettimeofday(&skb->stamp); 1090 + __net_timestamp(skb); 1091 1091 1092 1092 bt_cb(skb)->pkt_type = HCI_EVENT_PKT; 1093 1093 skb->dev = (void *) hdev;
+6 -2
net/bluetooth/hci_sock.c
··· 332 332 put_cmsg(msg, SOL_HCI, HCI_CMSG_DIR, sizeof(incoming), &incoming); 333 333 } 334 334 335 - if (mask & HCI_CMSG_TSTAMP) 336 - put_cmsg(msg, SOL_HCI, HCI_CMSG_TSTAMP, sizeof(skb->stamp), &skb->stamp); 335 + if (mask & HCI_CMSG_TSTAMP) { 336 + struct timeval tv; 337 + 338 + skb_get_timestamp(skb, &tv); 339 + put_cmsg(msg, SOL_HCI, HCI_CMSG_TSTAMP, sizeof(tv), &tv); 340 + } 337 341 } 338 342 339 343 static int hci_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
+1 -1
net/bridge/netfilter/ebt_ulog.c
··· 162 162 pm->version = EBT_ULOG_VERSION; 163 163 do_gettimeofday(&pm->stamp); 164 164 if (ub->qlen == 1) 165 - ub->skb->stamp = pm->stamp; 165 + skb_set_timestamp(ub->skb, &pm->stamp); 166 166 pm->data_len = copy_len; 167 167 pm->mark = skb->nfmark; 168 168 pm->hook = hooknr;
+19 -9
net/core/dev.c
··· 1009 1009 atomic_dec(&netstamp_needed); 1010 1010 } 1011 1011 1012 - static inline void net_timestamp(struct timeval *stamp) 1012 + void __net_timestamp(struct sk_buff *skb) 1013 + { 1014 + struct timeval tv; 1015 + 1016 + do_gettimeofday(&tv); 1017 + skb_set_timestamp(skb, &tv); 1018 + } 1019 + EXPORT_SYMBOL(__net_timestamp); 1020 + 1021 + static inline void net_timestamp(struct sk_buff *skb) 1013 1022 { 1014 1023 if (atomic_read(&netstamp_needed)) 1015 - do_gettimeofday(stamp); 1024 + __net_timestamp(skb); 1016 1025 else { 1017 - stamp->tv_sec = 0; 1018 - stamp->tv_usec = 0; 1026 + skb->tstamp.off_sec = 0; 1027 + skb->tstamp.off_usec = 0; 1019 1028 } 1020 1029 } 1021 1030 ··· 1036 1027 void dev_queue_xmit_nit(struct sk_buff *skb, struct net_device *dev) 1037 1028 { 1038 1029 struct packet_type *ptype; 1039 - net_timestamp(&skb->stamp); 1030 + 1031 + net_timestamp(skb); 1040 1032 1041 1033 rcu_read_lock(); 1042 1034 list_for_each_entry_rcu(ptype, &ptype_all, list) { ··· 1389 1379 if (netpoll_rx(skb)) 1390 1380 return NET_RX_DROP; 1391 1381 1392 - if (!skb->stamp.tv_sec) 1393 - net_timestamp(&skb->stamp); 1382 + if (!skb->tstamp.off_sec) 1383 + net_timestamp(skb); 1394 1384 1395 1385 /* 1396 1386 * The code is rearranged so that the path is the most ··· 1576 1566 if (skb->dev->poll && netpoll_rx(skb)) 1577 1567 return NET_RX_DROP; 1578 1568 1579 - if (!skb->stamp.tv_sec) 1580 - net_timestamp(&skb->stamp); 1569 + if (!skb->tstamp.off_sec) 1570 + net_timestamp(skb); 1581 1571 1582 1572 if (!skb->input_dev) 1583 1573 skb->input_dev = skb->dev;
+4 -3
net/core/neighbour.c
··· 1217 1217 1218 1218 while (skb != (struct sk_buff *)&tbl->proxy_queue) { 1219 1219 struct sk_buff *back = skb; 1220 - long tdif = back->stamp.tv_usec - now; 1220 + long tdif = NEIGH_CB(back)->sched_next - now; 1221 1221 1222 1222 skb = skb->next; 1223 1223 if (tdif <= 0) { ··· 1248 1248 kfree_skb(skb); 1249 1249 return; 1250 1250 } 1251 - skb->stamp.tv_sec = LOCALLY_ENQUEUED; 1252 - skb->stamp.tv_usec = sched_next; 1251 + 1252 + NEIGH_CB(skb)->sched_next = sched_next; 1253 + NEIGH_CB(skb)->flags |= LOCALLY_ENQUEUED; 1253 1254 1254 1255 spin_lock(&tbl->proxy_queue.lock); 1255 1256 if (del_timer(&tbl->proxy_timer)) {
+6 -2
net/core/skbuff.c
··· 70 70 71 71 static kmem_cache_t *skbuff_head_cache; 72 72 73 + struct timeval __read_mostly skb_tv_base; 74 + 73 75 /* 74 76 * Keep out-of-line to prevent kernel bloat. 75 77 * __builtin_return_address is not used because it is not always ··· 333 331 334 332 n->next = n->prev = NULL; 335 333 n->sk = NULL; 336 - C(stamp); 334 + C(tstamp); 337 335 C(dev); 338 336 C(h); 339 337 C(nh); ··· 410 408 memcpy(new->cb, old->cb, sizeof(old->cb)); 411 409 new->local_df = old->local_df; 412 410 new->pkt_type = old->pkt_type; 413 - new->stamp = old->stamp; 411 + new->tstamp = old->tstamp; 414 412 new->destructor = NULL; 415 413 #ifdef CONFIG_NETFILTER 416 414 new->nfmark = old->nfmark; ··· 1647 1645 NULL, NULL); 1648 1646 if (!skbuff_head_cache) 1649 1647 panic("cannot create skbuff cache"); 1648 + do_gettimeofday(&skb_tv_base); 1650 1649 } 1651 1650 1652 1651 EXPORT_SYMBOL(___pskb_trim); ··· 1681 1678 EXPORT_SYMBOL(skb_seq_read); 1682 1679 EXPORT_SYMBOL(skb_abort_seq_read); 1683 1680 EXPORT_SYMBOL(skb_find_text); 1681 + EXPORT_SYMBOL(skb_tv_base);
+1 -1
net/econet/af_econet.c
··· 159 159 err = memcpy_toiovec(msg->msg_iov, skb->data, copied); 160 160 if (err) 161 161 goto out_free; 162 - sk->sk_stamp = skb->stamp; 162 + skb_get_timestamp(skb, &sk->sk_stamp); 163 163 164 164 if (msg->msg_name) 165 165 memcpy(msg->msg_name, skb->cb, msg->msg_namelen);
+3 -1
net/ipv4/arp.c
··· 865 865 if (n) 866 866 neigh_release(n); 867 867 868 - if (skb->stamp.tv_sec == LOCALLY_ENQUEUED || 868 + if (NEIGH_CB(skb)->flags & LOCALLY_ENQUEUED || 869 869 skb->pkt_type == PACKET_HOST || 870 870 in_dev->arp_parms->proxy_delay == 0) { 871 871 arp_send(ARPOP_REPLY,ETH_P_ARP,sip,dev,tip,sha,dev->dev_addr,sha); ··· 947 947 948 948 if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL) 949 949 goto out_of_mem; 950 + 951 + memset(NEIGH_CB(skb), 0, sizeof(struct neighbour_cb)); 950 952 951 953 return NF_HOOK(NF_ARP, NF_ARP_IN, skb, dev, NULL, arp_process); 952 954
+2 -2
net/ipv4/ip_fragment.c
··· 533 533 if (skb->dev) 534 534 qp->iif = skb->dev->ifindex; 535 535 skb->dev = NULL; 536 - qp->stamp = skb->stamp; 536 + skb_get_timestamp(skb, &qp->stamp); 537 537 qp->meat += skb->len; 538 538 atomic_add(skb->truesize, &ip_frag_mem); 539 539 if (offset == 0) ··· 615 615 616 616 head->next = NULL; 617 617 head->dev = dev; 618 - head->stamp = qp->stamp; 618 + skb_set_timestamp(head, &qp->stamp); 619 619 620 620 iph = head->nh.iph; 621 621 iph->frag_off = 0;
+2 -2
net/ipv4/netfilter/ip_queue.c
··· 240 240 241 241 pmsg->packet_id = (unsigned long )entry; 242 242 pmsg->data_len = data_len; 243 - pmsg->timestamp_sec = entry->skb->stamp.tv_sec; 244 - pmsg->timestamp_usec = entry->skb->stamp.tv_usec; 243 + pmsg->timestamp_sec = skb_tv_base.tv_sec + entry->skb->tstamp.off_sec; 244 + pmsg->timestamp_usec = skb_tv_base.tv_usec + entry->skb->tstamp.off_usec; 245 245 pmsg->mark = entry->skb->nfmark; 246 246 pmsg->hook = entry->info->hook; 247 247 pmsg->hw_protocol = entry->skb->protocol;
+4 -4
net/ipv4/netfilter/ipt_ULOG.c
··· 220 220 pm = NLMSG_DATA(nlh); 221 221 222 222 /* We might not have a timestamp, get one */ 223 - if (skb->stamp.tv_sec == 0) 224 - do_gettimeofday((struct timeval *)&skb->stamp); 223 + if (skb->tstamp.off_sec == 0) 224 + __net_timestamp((struct sk_buff *)skb); 225 225 226 226 /* copy hook, prefix, timestamp, payload, etc. */ 227 227 pm->data_len = copy_len; 228 - pm->timestamp_sec = skb->stamp.tv_sec; 229 - pm->timestamp_usec = skb->stamp.tv_usec; 228 + pm->timestamp_sec = skb_tv_base.tv_sec + skb->tstamp.off_sec; 229 + pm->timestamp_usec = skb_tv_base.tv_usec + skb->tstamp.off_usec; 230 230 pm->mark = skb->nfmark; 231 231 pm->hook = hooknum; 232 232 if (prefix != NULL)
+7 -3
net/ipv4/tcp_input.c
··· 2097 2097 seq_rtt = -1; 2098 2098 } else if (seq_rtt < 0) 2099 2099 seq_rtt = now - scb->when; 2100 - if (seq_usrtt) 2101 - *seq_usrtt = (usnow.tv_sec - skb->stamp.tv_sec) * 1000000 2102 - + (usnow.tv_usec - skb->stamp.tv_usec); 2100 + if (seq_usrtt) { 2101 + struct timeval tv; 2102 + 2103 + skb_get_timestamp(skb, &tv); 2104 + *seq_usrtt = (usnow.tv_sec - tv.tv_sec) * 1000000 2105 + + (usnow.tv_usec - tv.tv_usec); 2106 + } 2103 2107 2104 2108 if (sacked & TCPCB_SACKED_ACKED) 2105 2109 tp->sacked_out -= tcp_skb_pcount(skb);
+2 -2
net/ipv4/tcp_output.c
··· 282 282 283 283 /* If congestion control is doing timestamping */ 284 284 if (icsk->icsk_ca_ops->rtt_sample) 285 - do_gettimeofday(&skb->stamp); 285 + __net_timestamp(skb); 286 286 287 287 sysctl_flags = 0; 288 288 if (tcb->flags & TCPCB_FLAG_SYN) { ··· 483 483 * skbs, which it never sent before. --ANK 484 484 */ 485 485 TCP_SKB_CB(buff)->when = TCP_SKB_CB(skb)->when; 486 - buff->stamp = skb->stamp; 486 + buff->tstamp = skb->tstamp; 487 487 488 488 if (TCP_SKB_CB(skb)->sacked & TCPCB_LOST) { 489 489 tp->lost_out -= tcp_skb_pcount(skb);
+3 -1
net/ipv6/ndisc.c
··· 812 812 if (ipv6_chk_acast_addr(dev, &msg->target) || 813 813 (idev->cnf.forwarding && 814 814 pneigh_lookup(&nd_tbl, &msg->target, dev, 0))) { 815 - if (skb->stamp.tv_sec != LOCALLY_ENQUEUED && 815 + if (!(NEIGH_CB(skb)->flags & LOCALLY_ENQUEUED) && 816 816 skb->pkt_type != PACKET_HOST && 817 817 inc != 0 && 818 818 idev->nd_parms->proxy_delay != 0) { ··· 1486 1486 msg->icmph.icmp6_code); 1487 1487 return 0; 1488 1488 } 1489 + 1490 + memset(NEIGH_CB(skb), 0, sizeof(struct neighbour_cb)); 1489 1491 1490 1492 switch (msg->icmph.icmp6_type) { 1491 1493 case NDISC_NEIGHBOUR_SOLICITATION:
+2 -2
net/ipv6/netfilter/ip6_queue.c
··· 238 238 239 239 pmsg->packet_id = (unsigned long )entry; 240 240 pmsg->data_len = data_len; 241 - pmsg->timestamp_sec = entry->skb->stamp.tv_sec; 242 - pmsg->timestamp_usec = entry->skb->stamp.tv_usec; 241 + pmsg->timestamp_sec = skb_tv_base.tv_sec + entry->skb->tstamp.off_sec; 242 + pmsg->timestamp_usec = skb_tv_base.tv_usec + entry->skb->tstamp.off_usec; 243 243 pmsg->mark = entry->skb->nfmark; 244 244 pmsg->hook = entry->info->hook; 245 245 pmsg->hw_protocol = entry->skb->protocol;
+2 -2
net/ipv6/reassembly.c
··· 562 562 if (skb->dev) 563 563 fq->iif = skb->dev->ifindex; 564 564 skb->dev = NULL; 565 - fq->stamp = skb->stamp; 565 + skb_get_timestamp(skb, &fq->stamp); 566 566 fq->meat += skb->len; 567 567 atomic_add(skb->truesize, &ip6_frag_mem); 568 568 ··· 664 664 665 665 head->next = NULL; 666 666 head->dev = dev; 667 - head->stamp = fq->stamp; 667 + skb_set_timestamp(head, &fq->stamp); 668 668 head->nh.ipv6h->payload_len = htons(payload_len); 669 669 670 670 *skb_in = head;
+2 -2
net/ipx/af_ipx.c
··· 1796 1796 copied); 1797 1797 if (rc) 1798 1798 goto out_free; 1799 - if (skb->stamp.tv_sec) 1800 - sk->sk_stamp = skb->stamp; 1799 + if (skb->tstamp.off_sec) 1800 + skb_get_timestamp(skb, &sk->sk_stamp) 1801 1801 1802 1802 msg->msg_namelen = sizeof(*sipx); 1803 1803
+4 -4
net/packet/af_packet.c
··· 635 635 h->tp_snaplen = snaplen; 636 636 h->tp_mac = macoff; 637 637 h->tp_net = netoff; 638 - if (skb->stamp.tv_sec == 0) { 639 - do_gettimeofday(&skb->stamp); 638 + if (skb->tstamp.off_sec == 0) { 639 + __net_timestamp(skb); 640 640 sock_enable_timestamp(sk); 641 641 } 642 - h->tp_sec = skb->stamp.tv_sec; 643 - h->tp_usec = skb->stamp.tv_usec; 642 + h->tp_sec = skb_tv_base.tv_sec + skb->tstamp.off_sec; 643 + h->tp_usec = skb_tv_base.tv_usec + skb->tstamp.off_usec; 644 644 645 645 sll = (struct sockaddr_ll*)((u8*)h + TPACKET_ALIGN(sizeof(*h))); 646 646 sll->sll_halen = 0;
+2 -2
net/sctp/input.c
··· 236 236 } 237 237 238 238 /* SCTP seems to always need a timestamp right now (FIXME) */ 239 - if (skb->stamp.tv_sec == 0) { 240 - do_gettimeofday(&skb->stamp); 239 + if (skb->tstamp.off_sec == 0) { 240 + __net_timestamp(skb); 241 241 sock_enable_timestamp(sk); 242 242 } 243 243
+5 -4
net/sctp/sm_make_chunk.c
··· 1362 1362 char *key; 1363 1363 sctp_scope_t scope; 1364 1364 struct sk_buff *skb = chunk->skb; 1365 + struct timeval tv; 1365 1366 1366 1367 headersize = sizeof(sctp_chunkhdr_t) + SCTP_SECRET_SIZE; 1367 1368 bodysize = ntohs(chunk->chunk_hdr->length) - headersize; ··· 1435 1434 * an association, there is no need to check cookie's expiration 1436 1435 * for init collision case of lost COOKIE ACK. 1437 1436 */ 1438 - if (!asoc && tv_lt(bear_cookie->expiration, skb->stamp)) { 1437 + skb_get_timestamp(skb, &tv); 1438 + if (!asoc && tv_lt(bear_cookie->expiration, tv)) { 1439 1439 __u16 len; 1440 1440 /* 1441 1441 * Section 3.3.10.3 Stale Cookie Error (3) ··· 1449 1447 len = ntohs(chunk->chunk_hdr->length); 1450 1448 *errp = sctp_make_op_error_space(asoc, chunk, len); 1451 1449 if (*errp) { 1452 - suseconds_t usecs = (skb->stamp.tv_sec - 1450 + suseconds_t usecs = (tv.tv_sec - 1453 1451 bear_cookie->expiration.tv_sec) * 1000000L + 1454 - skb->stamp.tv_usec - 1455 - bear_cookie->expiration.tv_usec; 1452 + tv.tv_usec - bear_cookie->expiration.tv_usec; 1456 1453 1457 1454 usecs = htonl(usecs); 1458 1455 sctp_init_cause(*errp, SCTP_ERROR_STALE_COOKIE,
+7 -4
net/sunrpc/svcsock.c
··· 584 584 /* possibly an icmp error */ 585 585 dprintk("svc: recvfrom returned error %d\n", -err); 586 586 } 587 - if (skb->stamp.tv_sec == 0) { 588 - skb->stamp.tv_sec = xtime.tv_sec; 589 - skb->stamp.tv_usec = xtime.tv_nsec / NSEC_PER_USEC; 587 + if (skb->tstamp.off_sec == 0) { 588 + struct timeval tv; 589 + 590 + tv.tv_sec = xtime.tv_sec; 591 + tv.tv_usec = xtime.tv_nsec * 1000; 592 + skb_set_timestamp(skb, &tv); 590 593 /* Don't enable netstamp, sunrpc doesn't 591 594 need that much accuracy */ 592 595 } 593 - svsk->sk_sk->sk_stamp = skb->stamp; 596 + skb_get_timestamp(skb, &svsk->sk_sk->sk_stamp); 594 597 set_bit(SK_DATA, &svsk->sk_flags); /* there may be more data... */ 595 598 596 599 /*