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

Configure Feed

Select the types of activity you want to include in your feed.

Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6

* master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6:
[VLAN]: __vlan_hwaccel_rx can use the faster ether_compare_addr
[PKT_SCHED] HTB: initialize upper bound properly
[IPV4]: Clear skb cb on IP input
[NET]: Update frag_list in pskb_trim

+73 -30
+3 -2
include/linux/if_vlan.h
··· 23 23 struct vlan_dev_info; 24 24 struct hlist_node; 25 25 26 - #include <linux/proc_fs.h> /* for proc_dir_entry */ 27 26 #include <linux/netdevice.h> 27 + #include <linux/etherdevice.h> 28 28 29 29 #define VLAN_HLEN 4 /* The additional bytes (on top of the Ethernet header) 30 30 * that VLAN requires. ··· 185 185 * This allows the VLAN to have a different MAC than the underlying 186 186 * device, and still route correctly. 187 187 */ 188 - if (!memcmp(eth_hdr(skb)->h_dest, skb->dev->dev_addr, ETH_ALEN)) 188 + if (!compare_ether_addr(eth_hdr(skb)->h_dest, 189 + skb->dev->dev_addr)) 189 190 skb->pkt_type = PACKET_HOST; 190 191 break; 191 192 };
+65 -26
net/core/skbuff.c
··· 257 257 } 258 258 259 259 260 - static void skb_drop_fraglist(struct sk_buff *skb) 260 + static void skb_drop_list(struct sk_buff **listp) 261 261 { 262 - struct sk_buff *list = skb_shinfo(skb)->frag_list; 262 + struct sk_buff *list = *listp; 263 263 264 - skb_shinfo(skb)->frag_list = NULL; 264 + *listp = NULL; 265 265 266 266 do { 267 267 struct sk_buff *this = list; 268 268 list = list->next; 269 269 kfree_skb(this); 270 270 } while (list); 271 + } 272 + 273 + static inline void skb_drop_fraglist(struct sk_buff *skb) 274 + { 275 + skb_drop_list(&skb_shinfo(skb)->frag_list); 271 276 } 272 277 273 278 static void skb_clone_fraglist(struct sk_buff *skb) ··· 835 830 836 831 int ___pskb_trim(struct sk_buff *skb, unsigned int len) 837 832 { 833 + struct sk_buff **fragp; 834 + struct sk_buff *frag; 838 835 int offset = skb_headlen(skb); 839 836 int nfrags = skb_shinfo(skb)->nr_frags; 840 837 int i; 838 + int err; 839 + 840 + if (skb_cloned(skb) && 841 + unlikely((err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC)))) 842 + return err; 841 843 842 844 for (i = 0; i < nfrags; i++) { 843 845 int end = offset + skb_shinfo(skb)->frags[i].size; 844 - if (end > len) { 845 - if (skb_cloned(skb)) { 846 - if (pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) 847 - return -ENOMEM; 848 - } 849 - if (len <= offset) { 850 - put_page(skb_shinfo(skb)->frags[i].page); 851 - skb_shinfo(skb)->nr_frags--; 852 - } else { 853 - skb_shinfo(skb)->frags[i].size = len - offset; 854 - } 846 + 847 + if (end < len) { 848 + offset = end; 849 + continue; 855 850 } 856 - offset = end; 851 + 852 + if (len > offset) 853 + skb_shinfo(skb)->frags[i++].size = len - offset; 854 + 855 + skb_shinfo(skb)->nr_frags = i; 856 + 857 + for (; i < nfrags; i++) 858 + put_page(skb_shinfo(skb)->frags[i].page); 859 + 860 + if (skb_shinfo(skb)->frag_list) 861 + skb_drop_fraglist(skb); 862 + break; 857 863 } 858 864 859 - if (offset < len) { 865 + for (fragp = &skb_shinfo(skb)->frag_list; (frag = *fragp); 866 + fragp = &frag->next) { 867 + int end = offset + frag->len; 868 + 869 + if (skb_shared(frag)) { 870 + struct sk_buff *nfrag; 871 + 872 + nfrag = skb_clone(frag, GFP_ATOMIC); 873 + if (unlikely(!nfrag)) 874 + return -ENOMEM; 875 + 876 + nfrag->next = frag->next; 877 + frag = nfrag; 878 + *fragp = frag; 879 + } 880 + 881 + if (end < len) { 882 + offset = end; 883 + continue; 884 + } 885 + 886 + if (end > len && 887 + unlikely((err = pskb_trim(frag, len - offset)))) 888 + return err; 889 + 890 + if (frag->next) 891 + skb_drop_list(&frag->next); 892 + break; 893 + } 894 + 895 + if (len > skb_headlen(skb)) { 860 896 skb->data_len -= skb->len - len; 861 897 skb->len = len; 862 898 } else { 863 - if (len <= skb_headlen(skb)) { 864 - skb->len = len; 865 - skb->data_len = 0; 866 - skb->tail = skb->data + len; 867 - if (skb_shinfo(skb)->frag_list && !skb_cloned(skb)) 868 - skb_drop_fraglist(skb); 869 - } else { 870 - skb->data_len -= skb->len - len; 871 - skb->len = len; 872 - } 899 + skb->len = len; 900 + skb->data_len = 0; 901 + skb->tail = skb->data + len; 873 902 } 874 903 875 904 return 0;
+3
net/ipv4/ip_input.c
··· 428 428 goto drop; 429 429 } 430 430 431 + /* Remove any debris in the socket control block */ 432 + memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options)); 433 + 431 434 return NF_HOOK(PF_INET, NF_IP_PRE_ROUTING, skb, dev, NULL, 432 435 ip_rcv_finish); 433 436
+2 -2
net/sched/sch_htb.c
··· 196 196 struct qdisc_rate_table *rate; /* rate table of the class itself */ 197 197 struct qdisc_rate_table *ceil; /* ceiling rate (limits borrows too) */ 198 198 long buffer,cbuffer; /* token bucket depth/rate */ 199 - long mbuffer; /* max wait time */ 199 + psched_tdiff_t mbuffer; /* max wait time */ 200 200 long tokens,ctokens; /* current number of tokens */ 201 201 psched_time_t t_c; /* checkpoint time */ 202 202 }; ··· 1601 1601 /* set class to be in HTB_CAN_SEND state */ 1602 1602 cl->tokens = hopt->buffer; 1603 1603 cl->ctokens = hopt->cbuffer; 1604 - cl->mbuffer = 60000000; /* 1min */ 1604 + cl->mbuffer = PSCHED_JIFFIE2US(HZ*60) /* 1min */ 1605 1605 PSCHED_GET_TIME(cl->t_c); 1606 1606 cl->cmode = HTB_CAN_SEND; 1607 1607