diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2005-10-18 16:50:52 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2005-10-18 16:50:52 -0400 |
commit | cff6bf970965c98c62007fc8a36527fd147fe233 (patch) | |
tree | 2791f2208b54ade86625af416ff5342f11282f0c /net/core | |
parent | 6cd7525a00f3b926e8bd2e402954ed3e09a8e924 (diff) | |
parent | 39ca371c45b04cd50d0974030ae051906fc516b6 (diff) |
Merge /home/trondmy/scm/kernel/git/torvalds/linux-2.6
Diffstat (limited to 'net/core')
-rw-r--r-- | net/core/datagram.c | 81 | ||||
-rw-r--r-- | net/core/dev.c | 6 | ||||
-rw-r--r-- | net/core/neighbour.c | 25 | ||||
-rw-r--r-- | net/core/netpoll.c | 2 | ||||
-rw-r--r-- | net/core/pktgen.c | 26 | ||||
-rw-r--r-- | net/core/skbuff.c | 19 | ||||
-rw-r--r-- | net/core/sock.c | 30 |
7 files changed, 79 insertions, 110 deletions
diff --git a/net/core/datagram.c b/net/core/datagram.c index da9bf71421a7..81987df536eb 100644 --- a/net/core/datagram.c +++ b/net/core/datagram.c | |||
@@ -211,74 +211,45 @@ void skb_free_datagram(struct sock *sk, struct sk_buff *skb) | |||
211 | int skb_copy_datagram_iovec(const struct sk_buff *skb, int offset, | 211 | int skb_copy_datagram_iovec(const struct sk_buff *skb, int offset, |
212 | struct iovec *to, int len) | 212 | struct iovec *to, int len) |
213 | { | 213 | { |
214 | int start = skb_headlen(skb); | 214 | int i, err, fraglen, end = 0; |
215 | int i, copy = start - offset; | 215 | struct sk_buff *next = skb_shinfo(skb)->frag_list; |
216 | 216 | next_skb: | |
217 | /* Copy header. */ | 217 | fraglen = skb_headlen(skb); |
218 | if (copy > 0) { | 218 | i = -1; |
219 | if (copy > len) | ||
220 | copy = len; | ||
221 | if (memcpy_toiovec(to, skb->data + offset, copy)) | ||
222 | goto fault; | ||
223 | if ((len -= copy) == 0) | ||
224 | return 0; | ||
225 | offset += copy; | ||
226 | } | ||
227 | 219 | ||
228 | /* Copy paged appendix. Hmm... why does this look so complicated? */ | 220 | while (1) { |
229 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { | 221 | int start = end; |
230 | int end; | ||
231 | |||
232 | BUG_TRAP(start <= offset + len); | ||
233 | 222 | ||
234 | end = start + skb_shinfo(skb)->frags[i].size; | 223 | if ((end += fraglen) > offset) { |
235 | if ((copy = end - offset) > 0) { | 224 | int copy = end - offset, o = offset - start; |
236 | int err; | ||
237 | u8 *vaddr; | ||
238 | skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; | ||
239 | struct page *page = frag->page; | ||
240 | 225 | ||
241 | if (copy > len) | 226 | if (copy > len) |
242 | copy = len; | 227 | copy = len; |
243 | vaddr = kmap(page); | 228 | if (i == -1) |
244 | err = memcpy_toiovec(to, vaddr + frag->page_offset + | 229 | err = memcpy_toiovec(to, skb->data + o, copy); |
245 | offset - start, copy); | 230 | else { |
246 | kunmap(page); | 231 | skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; |
232 | struct page *page = frag->page; | ||
233 | void *p = kmap(page) + frag->page_offset + o; | ||
234 | err = memcpy_toiovec(to, p, copy); | ||
235 | kunmap(page); | ||
236 | } | ||
247 | if (err) | 237 | if (err) |
248 | goto fault; | 238 | goto fault; |
249 | if (!(len -= copy)) | 239 | if (!(len -= copy)) |
250 | return 0; | 240 | return 0; |
251 | offset += copy; | 241 | offset += copy; |
252 | } | 242 | } |
253 | start = end; | 243 | if (++i >= skb_shinfo(skb)->nr_frags) |
244 | break; | ||
245 | fraglen = skb_shinfo(skb)->frags[i].size; | ||
254 | } | 246 | } |
255 | 247 | if (next) { | |
256 | if (skb_shinfo(skb)->frag_list) { | 248 | skb = next; |
257 | struct sk_buff *list = skb_shinfo(skb)->frag_list; | 249 | BUG_ON(skb_shinfo(skb)->frag_list); |
258 | 250 | next = skb->next; | |
259 | for (; list; list = list->next) { | 251 | goto next_skb; |
260 | int end; | ||
261 | |||
262 | BUG_TRAP(start <= offset + len); | ||
263 | |||
264 | end = start + list->len; | ||
265 | if ((copy = end - offset) > 0) { | ||
266 | if (copy > len) | ||
267 | copy = len; | ||
268 | if (skb_copy_datagram_iovec(list, | ||
269 | offset - start, | ||
270 | to, copy)) | ||
271 | goto fault; | ||
272 | if ((len -= copy) == 0) | ||
273 | return 0; | ||
274 | offset += copy; | ||
275 | } | ||
276 | start = end; | ||
277 | } | ||
278 | } | 252 | } |
279 | if (!len) | ||
280 | return 0; | ||
281 | |||
282 | fault: | 253 | fault: |
283 | return -EFAULT; | 254 | return -EFAULT; |
284 | } | 255 | } |
diff --git a/net/core/dev.c b/net/core/dev.c index c01511e3d0c1..a44eeef24edf 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -574,6 +574,8 @@ struct net_device *dev_getbyhwaddr(unsigned short type, char *ha) | |||
574 | return dev; | 574 | return dev; |
575 | } | 575 | } |
576 | 576 | ||
577 | EXPORT_SYMBOL(dev_getbyhwaddr); | ||
578 | |||
577 | struct net_device *dev_getfirstbyhwtype(unsigned short type) | 579 | struct net_device *dev_getfirstbyhwtype(unsigned short type) |
578 | { | 580 | { |
579 | struct net_device *dev; | 581 | struct net_device *dev; |
@@ -1130,7 +1132,7 @@ static inline int illegal_highdma(struct net_device *dev, struct sk_buff *skb) | |||
1130 | #endif | 1132 | #endif |
1131 | 1133 | ||
1132 | /* Keep head the same: replace data */ | 1134 | /* Keep head the same: replace data */ |
1133 | int __skb_linearize(struct sk_buff *skb, unsigned int __nocast gfp_mask) | 1135 | int __skb_linearize(struct sk_buff *skb, gfp_t gfp_mask) |
1134 | { | 1136 | { |
1135 | unsigned int size; | 1137 | unsigned int size; |
1136 | u8 *data; | 1138 | u8 *data; |
@@ -1257,6 +1259,8 @@ int dev_queue_xmit(struct sk_buff *skb) | |||
1257 | if (skb_checksum_help(skb, 0)) | 1259 | if (skb_checksum_help(skb, 0)) |
1258 | goto out_kfree_skb; | 1260 | goto out_kfree_skb; |
1259 | 1261 | ||
1262 | spin_lock_prefetch(&dev->queue_lock); | ||
1263 | |||
1260 | /* Disable soft irqs for various locks below. Also | 1264 | /* Disable soft irqs for various locks below. Also |
1261 | * stops preemption for RCU. | 1265 | * stops preemption for RCU. |
1262 | */ | 1266 | */ |
diff --git a/net/core/neighbour.c b/net/core/neighbour.c index 39fc55edf691..4128fc76ac3a 100644 --- a/net/core/neighbour.c +++ b/net/core/neighbour.c | |||
@@ -61,7 +61,9 @@ static int pneigh_ifdown(struct neigh_table *tbl, struct net_device *dev); | |||
61 | void neigh_changeaddr(struct neigh_table *tbl, struct net_device *dev); | 61 | void neigh_changeaddr(struct neigh_table *tbl, struct net_device *dev); |
62 | 62 | ||
63 | static struct neigh_table *neigh_tables; | 63 | static struct neigh_table *neigh_tables; |
64 | #ifdef CONFIG_PROC_FS | ||
64 | static struct file_operations neigh_stat_seq_fops; | 65 | static struct file_operations neigh_stat_seq_fops; |
66 | #endif | ||
65 | 67 | ||
66 | /* | 68 | /* |
67 | Neighbour hash table buckets are protected with rwlock tbl->lock. | 69 | Neighbour hash table buckets are protected with rwlock tbl->lock. |
@@ -725,6 +727,13 @@ static __inline__ int neigh_max_probes(struct neighbour *n) | |||
725 | p->ucast_probes + p->app_probes + p->mcast_probes); | 727 | p->ucast_probes + p->app_probes + p->mcast_probes); |
726 | } | 728 | } |
727 | 729 | ||
730 | static inline void neigh_add_timer(struct neighbour *n, unsigned long when) | ||
731 | { | ||
732 | if (unlikely(mod_timer(&n->timer, when))) { | ||
733 | printk("NEIGH: BUG, double timer add, state is %x\n", | ||
734 | n->nud_state); | ||
735 | } | ||
736 | } | ||
728 | 737 | ||
729 | /* Called when a timer expires for a neighbour entry. */ | 738 | /* Called when a timer expires for a neighbour entry. */ |
730 | 739 | ||
@@ -809,8 +818,7 @@ static void neigh_timer_handler(unsigned long arg) | |||
809 | neigh_hold(neigh); | 818 | neigh_hold(neigh); |
810 | if (time_before(next, jiffies + HZ/2)) | 819 | if (time_before(next, jiffies + HZ/2)) |
811 | next = jiffies + HZ/2; | 820 | next = jiffies + HZ/2; |
812 | neigh->timer.expires = next; | 821 | neigh_add_timer(neigh, next); |
813 | add_timer(&neigh->timer); | ||
814 | } | 822 | } |
815 | if (neigh->nud_state & (NUD_INCOMPLETE | NUD_PROBE)) { | 823 | if (neigh->nud_state & (NUD_INCOMPLETE | NUD_PROBE)) { |
816 | struct sk_buff *skb = skb_peek(&neigh->arp_queue); | 824 | struct sk_buff *skb = skb_peek(&neigh->arp_queue); |
@@ -852,8 +860,7 @@ int __neigh_event_send(struct neighbour *neigh, struct sk_buff *skb) | |||
852 | atomic_set(&neigh->probes, neigh->parms->ucast_probes); | 860 | atomic_set(&neigh->probes, neigh->parms->ucast_probes); |
853 | neigh->nud_state = NUD_INCOMPLETE; | 861 | neigh->nud_state = NUD_INCOMPLETE; |
854 | neigh_hold(neigh); | 862 | neigh_hold(neigh); |
855 | neigh->timer.expires = now + 1; | 863 | neigh_add_timer(neigh, now + 1); |
856 | add_timer(&neigh->timer); | ||
857 | } else { | 864 | } else { |
858 | neigh->nud_state = NUD_FAILED; | 865 | neigh->nud_state = NUD_FAILED; |
859 | write_unlock_bh(&neigh->lock); | 866 | write_unlock_bh(&neigh->lock); |
@@ -866,8 +873,8 @@ int __neigh_event_send(struct neighbour *neigh, struct sk_buff *skb) | |||
866 | NEIGH_PRINTK2("neigh %p is delayed.\n", neigh); | 873 | NEIGH_PRINTK2("neigh %p is delayed.\n", neigh); |
867 | neigh_hold(neigh); | 874 | neigh_hold(neigh); |
868 | neigh->nud_state = NUD_DELAY; | 875 | neigh->nud_state = NUD_DELAY; |
869 | neigh->timer.expires = jiffies + neigh->parms->delay_probe_time; | 876 | neigh_add_timer(neigh, |
870 | add_timer(&neigh->timer); | 877 | jiffies + neigh->parms->delay_probe_time); |
871 | } | 878 | } |
872 | 879 | ||
873 | if (neigh->nud_state == NUD_INCOMPLETE) { | 880 | if (neigh->nud_state == NUD_INCOMPLETE) { |
@@ -1013,10 +1020,10 @@ int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new, | |||
1013 | neigh_del_timer(neigh); | 1020 | neigh_del_timer(neigh); |
1014 | if (new & NUD_IN_TIMER) { | 1021 | if (new & NUD_IN_TIMER) { |
1015 | neigh_hold(neigh); | 1022 | neigh_hold(neigh); |
1016 | neigh->timer.expires = jiffies + | 1023 | neigh_add_timer(neigh, (jiffies + |
1017 | ((new & NUD_REACHABLE) ? | 1024 | ((new & NUD_REACHABLE) ? |
1018 | neigh->parms->reachable_time : 0); | 1025 | neigh->parms->reachable_time : |
1019 | add_timer(&neigh->timer); | 1026 | 0))); |
1020 | } | 1027 | } |
1021 | neigh->nud_state = new; | 1028 | neigh->nud_state = new; |
1022 | } | 1029 | } |
diff --git a/net/core/netpoll.c b/net/core/netpoll.c index 5265dfd69928..802fe11efad0 100644 --- a/net/core/netpoll.c +++ b/net/core/netpoll.c | |||
@@ -703,7 +703,7 @@ int netpoll_setup(struct netpoll *np) | |||
703 | 703 | ||
704 | if (!np->local_ip) { | 704 | if (!np->local_ip) { |
705 | rcu_read_lock(); | 705 | rcu_read_lock(); |
706 | in_dev = __in_dev_get(ndev); | 706 | in_dev = __in_dev_get_rcu(ndev); |
707 | 707 | ||
708 | if (!in_dev || !in_dev->ifa_list) { | 708 | if (!in_dev || !in_dev->ifa_list) { |
709 | rcu_read_unlock(); | 709 | rcu_read_unlock(); |
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index ef430b1e8e42..5f043d346694 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c | |||
@@ -186,7 +186,7 @@ | |||
186 | 186 | ||
187 | /* Used to help with determining the pkts on receive */ | 187 | /* Used to help with determining the pkts on receive */ |
188 | #define PKTGEN_MAGIC 0xbe9be955 | 188 | #define PKTGEN_MAGIC 0xbe9be955 |
189 | #define PG_PROC_DIR "pktgen" | 189 | #define PG_PROC_DIR "net/pktgen" |
190 | 190 | ||
191 | #define MAX_CFLOWS 65536 | 191 | #define MAX_CFLOWS 65536 |
192 | 192 | ||
@@ -1476,18 +1476,7 @@ static int proc_thread_write(struct file *file, const char __user *user_buffer, | |||
1476 | 1476 | ||
1477 | static int create_proc_dir(void) | 1477 | static int create_proc_dir(void) |
1478 | { | 1478 | { |
1479 | int len; | 1479 | pg_proc_dir = proc_mkdir(PG_PROC_DIR, NULL); |
1480 | /* does proc_dir already exists */ | ||
1481 | len = strlen(PG_PROC_DIR); | ||
1482 | |||
1483 | for (pg_proc_dir = proc_net->subdir; pg_proc_dir; pg_proc_dir=pg_proc_dir->next) { | ||
1484 | if ((pg_proc_dir->namelen == len) && | ||
1485 | (! memcmp(pg_proc_dir->name, PG_PROC_DIR, len))) | ||
1486 | break; | ||
1487 | } | ||
1488 | |||
1489 | if (!pg_proc_dir) | ||
1490 | pg_proc_dir = create_proc_entry(PG_PROC_DIR, S_IFDIR, proc_net); | ||
1491 | 1480 | ||
1492 | if (!pg_proc_dir) | 1481 | if (!pg_proc_dir) |
1493 | return -ENODEV; | 1482 | return -ENODEV; |
@@ -1497,7 +1486,7 @@ static int create_proc_dir(void) | |||
1497 | 1486 | ||
1498 | static int remove_proc_dir(void) | 1487 | static int remove_proc_dir(void) |
1499 | { | 1488 | { |
1500 | remove_proc_entry(PG_PROC_DIR, proc_net); | 1489 | remove_proc_entry(PG_PROC_DIR, NULL); |
1501 | return 0; | 1490 | return 0; |
1502 | } | 1491 | } |
1503 | 1492 | ||
@@ -1678,13 +1667,12 @@ static void pktgen_setup_inject(struct pktgen_dev *pkt_dev) | |||
1678 | struct in_device *in_dev; | 1667 | struct in_device *in_dev; |
1679 | 1668 | ||
1680 | rcu_read_lock(); | 1669 | rcu_read_lock(); |
1681 | in_dev = __in_dev_get(pkt_dev->odev); | 1670 | in_dev = __in_dev_get_rcu(pkt_dev->odev); |
1682 | if (in_dev) { | 1671 | if (in_dev) { |
1683 | if (in_dev->ifa_list) { | 1672 | if (in_dev->ifa_list) { |
1684 | pkt_dev->saddr_min = in_dev->ifa_list->ifa_address; | 1673 | pkt_dev->saddr_min = in_dev->ifa_list->ifa_address; |
1685 | pkt_dev->saddr_max = pkt_dev->saddr_min; | 1674 | pkt_dev->saddr_max = pkt_dev->saddr_min; |
1686 | } | 1675 | } |
1687 | __in_dev_put(in_dev); | ||
1688 | } | 1676 | } |
1689 | rcu_read_unlock(); | 1677 | rcu_read_unlock(); |
1690 | } | 1678 | } |
@@ -2908,7 +2896,7 @@ static int pktgen_add_device(struct pktgen_thread *t, const char* ifname) | |||
2908 | pkt_dev->udp_dst_max = 9; | 2896 | pkt_dev->udp_dst_max = 9; |
2909 | 2897 | ||
2910 | strncpy(pkt_dev->ifname, ifname, 31); | 2898 | strncpy(pkt_dev->ifname, ifname, 31); |
2911 | sprintf(pkt_dev->fname, "net/%s/%s", PG_PROC_DIR, ifname); | 2899 | sprintf(pkt_dev->fname, "%s/%s", PG_PROC_DIR, ifname); |
2912 | 2900 | ||
2913 | if (! pktgen_setup_dev(pkt_dev)) { | 2901 | if (! pktgen_setup_dev(pkt_dev)) { |
2914 | printk("pktgen: ERROR: pktgen_setup_dev failed.\n"); | 2902 | printk("pktgen: ERROR: pktgen_setup_dev failed.\n"); |
@@ -2981,7 +2969,7 @@ static int pktgen_create_thread(const char* name, int cpu) | |||
2981 | spin_lock_init(&t->if_lock); | 2969 | spin_lock_init(&t->if_lock); |
2982 | t->cpu = cpu; | 2970 | t->cpu = cpu; |
2983 | 2971 | ||
2984 | sprintf(t->fname, "net/%s/%s", PG_PROC_DIR, t->name); | 2972 | sprintf(t->fname, "%s/%s", PG_PROC_DIR, t->name); |
2985 | t->proc_ent = create_proc_entry(t->fname, 0600, NULL); | 2973 | t->proc_ent = create_proc_entry(t->fname, 0600, NULL); |
2986 | if (!t->proc_ent) { | 2974 | if (!t->proc_ent) { |
2987 | printk("pktgen: cannot create %s procfs entry.\n", t->fname); | 2975 | printk("pktgen: cannot create %s procfs entry.\n", t->fname); |
@@ -3064,7 +3052,7 @@ static int __init pg_init(void) | |||
3064 | 3052 | ||
3065 | create_proc_dir(); | 3053 | create_proc_dir(); |
3066 | 3054 | ||
3067 | sprintf(module_fname, "net/%s/pgctrl", PG_PROC_DIR); | 3055 | sprintf(module_fname, "%s/pgctrl", PG_PROC_DIR); |
3068 | module_proc_ent = create_proc_entry(module_fname, 0600, NULL); | 3056 | module_proc_ent = create_proc_entry(module_fname, 0600, NULL); |
3069 | if (!module_proc_ent) { | 3057 | if (!module_proc_ent) { |
3070 | printk("pktgen: ERROR: cannot create %s procfs entry.\n", module_fname); | 3058 | printk("pktgen: ERROR: cannot create %s procfs entry.\n", module_fname); |
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index f80a28785610..af9b1516e21f 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
@@ -71,8 +71,6 @@ | |||
71 | static kmem_cache_t *skbuff_head_cache __read_mostly; | 71 | static kmem_cache_t *skbuff_head_cache __read_mostly; |
72 | static kmem_cache_t *skbuff_fclone_cache __read_mostly; | 72 | static kmem_cache_t *skbuff_fclone_cache __read_mostly; |
73 | 73 | ||
74 | struct timeval __read_mostly skb_tv_base; | ||
75 | |||
76 | /* | 74 | /* |
77 | * Keep out-of-line to prevent kernel bloat. | 75 | * Keep out-of-line to prevent kernel bloat. |
78 | * __builtin_return_address is not used because it is not always | 76 | * __builtin_return_address is not used because it is not always |
@@ -132,7 +130,7 @@ void skb_under_panic(struct sk_buff *skb, int sz, void *here) | |||
132 | * Buffers may only be allocated from interrupts using a @gfp_mask of | 130 | * Buffers may only be allocated from interrupts using a @gfp_mask of |
133 | * %GFP_ATOMIC. | 131 | * %GFP_ATOMIC. |
134 | */ | 132 | */ |
135 | struct sk_buff *__alloc_skb(unsigned int size, unsigned int __nocast gfp_mask, | 133 | struct sk_buff *__alloc_skb(unsigned int size, gfp_t gfp_mask, |
136 | int fclone) | 134 | int fclone) |
137 | { | 135 | { |
138 | struct sk_buff *skb; | 136 | struct sk_buff *skb; |
@@ -200,7 +198,7 @@ nodata: | |||
200 | */ | 198 | */ |
201 | struct sk_buff *alloc_skb_from_cache(kmem_cache_t *cp, | 199 | struct sk_buff *alloc_skb_from_cache(kmem_cache_t *cp, |
202 | unsigned int size, | 200 | unsigned int size, |
203 | unsigned int __nocast gfp_mask) | 201 | gfp_t gfp_mask) |
204 | { | 202 | { |
205 | struct sk_buff *skb; | 203 | struct sk_buff *skb; |
206 | u8 *data; | 204 | u8 *data; |
@@ -363,7 +361,7 @@ void __kfree_skb(struct sk_buff *skb) | |||
363 | * %GFP_ATOMIC. | 361 | * %GFP_ATOMIC. |
364 | */ | 362 | */ |
365 | 363 | ||
366 | struct sk_buff *skb_clone(struct sk_buff *skb, unsigned int __nocast gfp_mask) | 364 | struct sk_buff *skb_clone(struct sk_buff *skb, gfp_t gfp_mask) |
367 | { | 365 | { |
368 | struct sk_buff *n; | 366 | struct sk_buff *n; |
369 | 367 | ||
@@ -502,7 +500,7 @@ static void copy_skb_header(struct sk_buff *new, const struct sk_buff *old) | |||
502 | * header is going to be modified. Use pskb_copy() instead. | 500 | * header is going to be modified. Use pskb_copy() instead. |
503 | */ | 501 | */ |
504 | 502 | ||
505 | struct sk_buff *skb_copy(const struct sk_buff *skb, unsigned int __nocast gfp_mask) | 503 | struct sk_buff *skb_copy(const struct sk_buff *skb, gfp_t gfp_mask) |
506 | { | 504 | { |
507 | int headerlen = skb->data - skb->head; | 505 | int headerlen = skb->data - skb->head; |
508 | /* | 506 | /* |
@@ -541,7 +539,7 @@ struct sk_buff *skb_copy(const struct sk_buff *skb, unsigned int __nocast gfp_ma | |||
541 | * The returned buffer has a reference count of 1. | 539 | * The returned buffer has a reference count of 1. |
542 | */ | 540 | */ |
543 | 541 | ||
544 | struct sk_buff *pskb_copy(struct sk_buff *skb, unsigned int __nocast gfp_mask) | 542 | struct sk_buff *pskb_copy(struct sk_buff *skb, gfp_t gfp_mask) |
545 | { | 543 | { |
546 | /* | 544 | /* |
547 | * Allocate the copy buffer | 545 | * Allocate the copy buffer |
@@ -600,7 +598,7 @@ out: | |||
600 | */ | 598 | */ |
601 | 599 | ||
602 | int pskb_expand_head(struct sk_buff *skb, int nhead, int ntail, | 600 | int pskb_expand_head(struct sk_buff *skb, int nhead, int ntail, |
603 | unsigned int __nocast gfp_mask) | 601 | gfp_t gfp_mask) |
604 | { | 602 | { |
605 | int i; | 603 | int i; |
606 | u8 *data; | 604 | u8 *data; |
@@ -691,7 +689,7 @@ struct sk_buff *skb_realloc_headroom(struct sk_buff *skb, unsigned int headroom) | |||
691 | */ | 689 | */ |
692 | struct sk_buff *skb_copy_expand(const struct sk_buff *skb, | 690 | struct sk_buff *skb_copy_expand(const struct sk_buff *skb, |
693 | int newheadroom, int newtailroom, | 691 | int newheadroom, int newtailroom, |
694 | unsigned int __nocast gfp_mask) | 692 | gfp_t gfp_mask) |
695 | { | 693 | { |
696 | /* | 694 | /* |
697 | * Allocate the copy buffer | 695 | * Allocate the copy buffer |
@@ -1708,8 +1706,6 @@ void __init skb_init(void) | |||
1708 | NULL, NULL); | 1706 | NULL, NULL); |
1709 | if (!skbuff_fclone_cache) | 1707 | if (!skbuff_fclone_cache) |
1710 | panic("cannot create skbuff cache"); | 1708 | panic("cannot create skbuff cache"); |
1711 | |||
1712 | do_gettimeofday(&skb_tv_base); | ||
1713 | } | 1709 | } |
1714 | 1710 | ||
1715 | EXPORT_SYMBOL(___pskb_trim); | 1711 | EXPORT_SYMBOL(___pskb_trim); |
@@ -1743,4 +1739,3 @@ EXPORT_SYMBOL(skb_prepare_seq_read); | |||
1743 | EXPORT_SYMBOL(skb_seq_read); | 1739 | EXPORT_SYMBOL(skb_seq_read); |
1744 | EXPORT_SYMBOL(skb_abort_seq_read); | 1740 | EXPORT_SYMBOL(skb_abort_seq_read); |
1745 | EXPORT_SYMBOL(skb_find_text); | 1741 | EXPORT_SYMBOL(skb_find_text); |
1746 | EXPORT_SYMBOL(skb_tv_base); | ||
diff --git a/net/core/sock.c b/net/core/sock.c index ac63b56e23b2..1c52fe809eda 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
@@ -637,7 +637,7 @@ lenout: | |||
637 | * @prot: struct proto associated with this new sock instance | 637 | * @prot: struct proto associated with this new sock instance |
638 | * @zero_it: if we should zero the newly allocated sock | 638 | * @zero_it: if we should zero the newly allocated sock |
639 | */ | 639 | */ |
640 | struct sock *sk_alloc(int family, unsigned int __nocast priority, | 640 | struct sock *sk_alloc(int family, gfp_t priority, |
641 | struct proto *prot, int zero_it) | 641 | struct proto *prot, int zero_it) |
642 | { | 642 | { |
643 | struct sock *sk = NULL; | 643 | struct sock *sk = NULL; |
@@ -660,16 +660,20 @@ struct sock *sk_alloc(int family, unsigned int __nocast priority, | |||
660 | sock_lock_init(sk); | 660 | sock_lock_init(sk); |
661 | } | 661 | } |
662 | 662 | ||
663 | if (security_sk_alloc(sk, family, priority)) { | 663 | if (security_sk_alloc(sk, family, priority)) |
664 | if (slab != NULL) | 664 | goto out_free; |
665 | kmem_cache_free(slab, sk); | 665 | |
666 | else | 666 | if (!try_module_get(prot->owner)) |
667 | kfree(sk); | 667 | goto out_free; |
668 | sk = NULL; | ||
669 | } else | ||
670 | __module_get(prot->owner); | ||
671 | } | 668 | } |
672 | return sk; | 669 | return sk; |
670 | |||
671 | out_free: | ||
672 | if (slab != NULL) | ||
673 | kmem_cache_free(slab, sk); | ||
674 | else | ||
675 | kfree(sk); | ||
676 | return NULL; | ||
673 | } | 677 | } |
674 | 678 | ||
675 | void sk_free(struct sock *sk) | 679 | void sk_free(struct sock *sk) |
@@ -700,7 +704,7 @@ void sk_free(struct sock *sk) | |||
700 | module_put(owner); | 704 | module_put(owner); |
701 | } | 705 | } |
702 | 706 | ||
703 | struct sock *sk_clone(const struct sock *sk, const unsigned int __nocast priority) | 707 | struct sock *sk_clone(const struct sock *sk, const gfp_t priority) |
704 | { | 708 | { |
705 | struct sock *newsk = sk_alloc(sk->sk_family, priority, sk->sk_prot, 0); | 709 | struct sock *newsk = sk_alloc(sk->sk_family, priority, sk->sk_prot, 0); |
706 | 710 | ||
@@ -841,7 +845,7 @@ unsigned long sock_i_ino(struct sock *sk) | |||
841 | * Allocate a skb from the socket's send buffer. | 845 | * Allocate a skb from the socket's send buffer. |
842 | */ | 846 | */ |
843 | struct sk_buff *sock_wmalloc(struct sock *sk, unsigned long size, int force, | 847 | struct sk_buff *sock_wmalloc(struct sock *sk, unsigned long size, int force, |
844 | unsigned int __nocast priority) | 848 | gfp_t priority) |
845 | { | 849 | { |
846 | if (force || atomic_read(&sk->sk_wmem_alloc) < sk->sk_sndbuf) { | 850 | if (force || atomic_read(&sk->sk_wmem_alloc) < sk->sk_sndbuf) { |
847 | struct sk_buff * skb = alloc_skb(size, priority); | 851 | struct sk_buff * skb = alloc_skb(size, priority); |
@@ -857,7 +861,7 @@ struct sk_buff *sock_wmalloc(struct sock *sk, unsigned long size, int force, | |||
857 | * Allocate a skb from the socket's receive buffer. | 861 | * Allocate a skb from the socket's receive buffer. |
858 | */ | 862 | */ |
859 | struct sk_buff *sock_rmalloc(struct sock *sk, unsigned long size, int force, | 863 | struct sk_buff *sock_rmalloc(struct sock *sk, unsigned long size, int force, |
860 | unsigned int __nocast priority) | 864 | gfp_t priority) |
861 | { | 865 | { |
862 | if (force || atomic_read(&sk->sk_rmem_alloc) < sk->sk_rcvbuf) { | 866 | if (force || atomic_read(&sk->sk_rmem_alloc) < sk->sk_rcvbuf) { |
863 | struct sk_buff *skb = alloc_skb(size, priority); | 867 | struct sk_buff *skb = alloc_skb(size, priority); |
@@ -872,7 +876,7 @@ struct sk_buff *sock_rmalloc(struct sock *sk, unsigned long size, int force, | |||
872 | /* | 876 | /* |
873 | * Allocate a memory block from the socket's option memory buffer. | 877 | * Allocate a memory block from the socket's option memory buffer. |
874 | */ | 878 | */ |
875 | void *sock_kmalloc(struct sock *sk, int size, unsigned int __nocast priority) | 879 | void *sock_kmalloc(struct sock *sk, int size, gfp_t priority) |
876 | { | 880 | { |
877 | if ((unsigned)size <= sysctl_optmem_max && | 881 | if ((unsigned)size <= sysctl_optmem_max && |
878 | atomic_read(&sk->sk_omem_alloc) + size < sysctl_optmem_max) { | 882 | atomic_read(&sk->sk_omem_alloc) + size < sysctl_optmem_max) { |