diff options
Diffstat (limited to 'net/core')
| -rw-r--r-- | net/core/dev.c | 71 | ||||
| -rw-r--r-- | net/core/neighbour.c | 14 | ||||
| -rw-r--r-- | net/core/net-sysfs.c | 4 | ||||
| -rw-r--r-- | net/core/net_namespace.c | 89 | ||||
| -rw-r--r-- | net/core/skbuff.c | 8 | ||||
| -rw-r--r-- | net/core/sock.c | 3 |
6 files changed, 110 insertions, 79 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index 5379b0c1190a..f1129706ce7b 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -1090,7 +1090,7 @@ int dev_open(struct net_device *dev) | |||
| 1090 | /* | 1090 | /* |
| 1091 | * Enable NET_DMA | 1091 | * Enable NET_DMA |
| 1092 | */ | 1092 | */ |
| 1093 | dmaengine_get(); | 1093 | net_dmaengine_get(); |
| 1094 | 1094 | ||
| 1095 | /* | 1095 | /* |
| 1096 | * Initialize multicasting status | 1096 | * Initialize multicasting status |
| @@ -1172,7 +1172,7 @@ int dev_close(struct net_device *dev) | |||
| 1172 | /* | 1172 | /* |
| 1173 | * Shutdown NET_DMA | 1173 | * Shutdown NET_DMA |
| 1174 | */ | 1174 | */ |
| 1175 | dmaengine_put(); | 1175 | net_dmaengine_put(); |
| 1176 | 1176 | ||
| 1177 | return 0; | 1177 | return 0; |
| 1178 | } | 1178 | } |
| @@ -2267,12 +2267,6 @@ int netif_receive_skb(struct sk_buff *skb) | |||
| 2267 | 2267 | ||
| 2268 | rcu_read_lock(); | 2268 | rcu_read_lock(); |
| 2269 | 2269 | ||
| 2270 | /* Don't receive packets in an exiting network namespace */ | ||
| 2271 | if (!net_alive(dev_net(skb->dev))) { | ||
| 2272 | kfree_skb(skb); | ||
| 2273 | goto out; | ||
| 2274 | } | ||
| 2275 | |||
| 2276 | #ifdef CONFIG_NET_CLS_ACT | 2270 | #ifdef CONFIG_NET_CLS_ACT |
| 2277 | if (skb->tc_verd & TC_NCLS) { | 2271 | if (skb->tc_verd & TC_NCLS) { |
| 2278 | skb->tc_verd = CLR_TC_NCLS(skb->tc_verd); | 2272 | skb->tc_verd = CLR_TC_NCLS(skb->tc_verd); |
| @@ -2488,6 +2482,9 @@ static int __napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb) | |||
| 2488 | 2482 | ||
| 2489 | int napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb) | 2483 | int napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb) |
| 2490 | { | 2484 | { |
| 2485 | if (netpoll_receive_skb(skb)) | ||
| 2486 | return NET_RX_DROP; | ||
| 2487 | |||
| 2491 | switch (__napi_gro_receive(napi, skb)) { | 2488 | switch (__napi_gro_receive(napi, skb)) { |
| 2492 | case -1: | 2489 | case -1: |
| 2493 | return netif_receive_skb(skb); | 2490 | return netif_receive_skb(skb); |
| @@ -2558,6 +2555,9 @@ int napi_gro_frags(struct napi_struct *napi, struct napi_gro_fraginfo *info) | |||
| 2558 | if (!skb) | 2555 | if (!skb) |
| 2559 | goto out; | 2556 | goto out; |
| 2560 | 2557 | ||
| 2558 | if (netpoll_receive_skb(skb)) | ||
| 2559 | goto out; | ||
| 2560 | |||
| 2561 | err = NET_RX_SUCCESS; | 2561 | err = NET_RX_SUCCESS; |
| 2562 | 2562 | ||
| 2563 | switch (__napi_gro_receive(napi, skb)) { | 2563 | switch (__napi_gro_receive(napi, skb)) { |
| @@ -4282,6 +4282,39 @@ unsigned long netdev_fix_features(unsigned long features, const char *name) | |||
| 4282 | } | 4282 | } |
| 4283 | EXPORT_SYMBOL(netdev_fix_features); | 4283 | EXPORT_SYMBOL(netdev_fix_features); |
| 4284 | 4284 | ||
| 4285 | /* Some devices need to (re-)set their netdev_ops inside | ||
| 4286 | * ->init() or similar. If that happens, we have to setup | ||
| 4287 | * the compat pointers again. | ||
| 4288 | */ | ||
| 4289 | void netdev_resync_ops(struct net_device *dev) | ||
| 4290 | { | ||
| 4291 | #ifdef CONFIG_COMPAT_NET_DEV_OPS | ||
| 4292 | const struct net_device_ops *ops = dev->netdev_ops; | ||
| 4293 | |||
| 4294 | dev->init = ops->ndo_init; | ||
| 4295 | dev->uninit = ops->ndo_uninit; | ||
| 4296 | dev->open = ops->ndo_open; | ||
| 4297 | dev->change_rx_flags = ops->ndo_change_rx_flags; | ||
| 4298 | dev->set_rx_mode = ops->ndo_set_rx_mode; | ||
| 4299 | dev->set_multicast_list = ops->ndo_set_multicast_list; | ||
| 4300 | dev->set_mac_address = ops->ndo_set_mac_address; | ||
| 4301 | dev->validate_addr = ops->ndo_validate_addr; | ||
| 4302 | dev->do_ioctl = ops->ndo_do_ioctl; | ||
| 4303 | dev->set_config = ops->ndo_set_config; | ||
| 4304 | dev->change_mtu = ops->ndo_change_mtu; | ||
| 4305 | dev->neigh_setup = ops->ndo_neigh_setup; | ||
| 4306 | dev->tx_timeout = ops->ndo_tx_timeout; | ||
| 4307 | dev->get_stats = ops->ndo_get_stats; | ||
| 4308 | dev->vlan_rx_register = ops->ndo_vlan_rx_register; | ||
| 4309 | dev->vlan_rx_add_vid = ops->ndo_vlan_rx_add_vid; | ||
| 4310 | dev->vlan_rx_kill_vid = ops->ndo_vlan_rx_kill_vid; | ||
| 4311 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
| 4312 | dev->poll_controller = ops->ndo_poll_controller; | ||
| 4313 | #endif | ||
| 4314 | #endif | ||
| 4315 | } | ||
| 4316 | EXPORT_SYMBOL(netdev_resync_ops); | ||
| 4317 | |||
| 4285 | /** | 4318 | /** |
| 4286 | * register_netdevice - register a network device | 4319 | * register_netdevice - register a network device |
| 4287 | * @dev: device to register | 4320 | * @dev: device to register |
| @@ -4326,27 +4359,7 @@ int register_netdevice(struct net_device *dev) | |||
| 4326 | * This is temporary until all network devices are converted. | 4359 | * This is temporary until all network devices are converted. |
| 4327 | */ | 4360 | */ |
| 4328 | if (dev->netdev_ops) { | 4361 | if (dev->netdev_ops) { |
| 4329 | const struct net_device_ops *ops = dev->netdev_ops; | 4362 | netdev_resync_ops(dev); |
| 4330 | |||
| 4331 | dev->init = ops->ndo_init; | ||
| 4332 | dev->uninit = ops->ndo_uninit; | ||
| 4333 | dev->open = ops->ndo_open; | ||
| 4334 | dev->change_rx_flags = ops->ndo_change_rx_flags; | ||
| 4335 | dev->set_rx_mode = ops->ndo_set_rx_mode; | ||
| 4336 | dev->set_multicast_list = ops->ndo_set_multicast_list; | ||
| 4337 | dev->set_mac_address = ops->ndo_set_mac_address; | ||
| 4338 | dev->validate_addr = ops->ndo_validate_addr; | ||
| 4339 | dev->do_ioctl = ops->ndo_do_ioctl; | ||
| 4340 | dev->set_config = ops->ndo_set_config; | ||
| 4341 | dev->change_mtu = ops->ndo_change_mtu; | ||
| 4342 | dev->tx_timeout = ops->ndo_tx_timeout; | ||
| 4343 | dev->get_stats = ops->ndo_get_stats; | ||
| 4344 | dev->vlan_rx_register = ops->ndo_vlan_rx_register; | ||
| 4345 | dev->vlan_rx_add_vid = ops->ndo_vlan_rx_add_vid; | ||
| 4346 | dev->vlan_rx_kill_vid = ops->ndo_vlan_rx_kill_vid; | ||
| 4347 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
| 4348 | dev->poll_controller = ops->ndo_poll_controller; | ||
| 4349 | #endif | ||
| 4350 | } else { | 4363 | } else { |
| 4351 | char drivername[64]; | 4364 | char drivername[64]; |
| 4352 | pr_info("%s (%s): not using net_device_ops yet\n", | 4365 | pr_info("%s (%s): not using net_device_ops yet\n", |
diff --git a/net/core/neighbour.c b/net/core/neighbour.c index f66c58df8953..278a142d1047 100644 --- a/net/core/neighbour.c +++ b/net/core/neighbour.c | |||
| @@ -1994,8 +1994,8 @@ static int neightbl_dump_info(struct sk_buff *skb, struct netlink_callback *cb) | |||
| 1994 | if (!net_eq(neigh_parms_net(p), net)) | 1994 | if (!net_eq(neigh_parms_net(p), net)) |
| 1995 | continue; | 1995 | continue; |
| 1996 | 1996 | ||
| 1997 | if (nidx++ < neigh_skip) | 1997 | if (nidx < neigh_skip) |
| 1998 | continue; | 1998 | goto next; |
| 1999 | 1999 | ||
| 2000 | if (neightbl_fill_param_info(skb, tbl, p, | 2000 | if (neightbl_fill_param_info(skb, tbl, p, |
| 2001 | NETLINK_CB(cb->skb).pid, | 2001 | NETLINK_CB(cb->skb).pid, |
| @@ -2003,6 +2003,8 @@ static int neightbl_dump_info(struct sk_buff *skb, struct netlink_callback *cb) | |||
| 2003 | RTM_NEWNEIGHTBL, | 2003 | RTM_NEWNEIGHTBL, |
| 2004 | NLM_F_MULTI) <= 0) | 2004 | NLM_F_MULTI) <= 0) |
| 2005 | goto out; | 2005 | goto out; |
| 2006 | next: | ||
| 2007 | nidx++; | ||
| 2006 | } | 2008 | } |
| 2007 | 2009 | ||
| 2008 | neigh_skip = 0; | 2010 | neigh_skip = 0; |
| @@ -2082,12 +2084,10 @@ static int neigh_dump_table(struct neigh_table *tbl, struct sk_buff *skb, | |||
| 2082 | if (h > s_h) | 2084 | if (h > s_h) |
| 2083 | s_idx = 0; | 2085 | s_idx = 0; |
| 2084 | for (n = tbl->hash_buckets[h], idx = 0; n; n = n->next) { | 2086 | for (n = tbl->hash_buckets[h], idx = 0; n; n = n->next) { |
| 2085 | int lidx; | ||
| 2086 | if (dev_net(n->dev) != net) | 2087 | if (dev_net(n->dev) != net) |
| 2087 | continue; | 2088 | continue; |
| 2088 | lidx = idx++; | 2089 | if (idx < s_idx) |
| 2089 | if (lidx < s_idx) | 2090 | goto next; |
| 2090 | continue; | ||
| 2091 | if (neigh_fill_info(skb, n, NETLINK_CB(cb->skb).pid, | 2091 | if (neigh_fill_info(skb, n, NETLINK_CB(cb->skb).pid, |
| 2092 | cb->nlh->nlmsg_seq, | 2092 | cb->nlh->nlmsg_seq, |
| 2093 | RTM_NEWNEIGH, | 2093 | RTM_NEWNEIGH, |
| @@ -2096,6 +2096,8 @@ static int neigh_dump_table(struct neigh_table *tbl, struct sk_buff *skb, | |||
| 2096 | rc = -1; | 2096 | rc = -1; |
| 2097 | goto out; | 2097 | goto out; |
| 2098 | } | 2098 | } |
| 2099 | next: | ||
| 2100 | idx++; | ||
| 2099 | } | 2101 | } |
| 2100 | } | 2102 | } |
| 2101 | read_unlock_bh(&tbl->lock); | 2103 | read_unlock_bh(&tbl->lock); |
diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c index 6ac29a46e23e..484f58750eba 100644 --- a/net/core/net-sysfs.c +++ b/net/core/net-sysfs.c | |||
| @@ -77,7 +77,9 @@ static ssize_t netdev_store(struct device *dev, struct device_attribute *attr, | |||
| 77 | if (endp == buf) | 77 | if (endp == buf) |
| 78 | goto err; | 78 | goto err; |
| 79 | 79 | ||
| 80 | rtnl_lock(); | 80 | if (!rtnl_trylock()) |
| 81 | return -ERESTARTSYS; | ||
| 82 | |||
| 81 | if (dev_isalive(net)) { | 83 | if (dev_isalive(net)) { |
| 82 | if ((ret = (*set)(net, new)) == 0) | 84 | if ((ret = (*set)(net, new)) == 0) |
| 83 | ret = len; | 85 | ret = len; |
diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c index 55151faaf90c..e3bebd36f053 100644 --- a/net/core/net_namespace.c +++ b/net/core/net_namespace.c | |||
| @@ -32,24 +32,14 @@ static __net_init int setup_net(struct net *net) | |||
| 32 | { | 32 | { |
| 33 | /* Must be called with net_mutex held */ | 33 | /* Must be called with net_mutex held */ |
| 34 | struct pernet_operations *ops; | 34 | struct pernet_operations *ops; |
| 35 | int error; | 35 | int error = 0; |
| 36 | struct net_generic *ng; | ||
| 37 | 36 | ||
| 38 | atomic_set(&net->count, 1); | 37 | atomic_set(&net->count, 1); |
| 38 | |||
| 39 | #ifdef NETNS_REFCNT_DEBUG | 39 | #ifdef NETNS_REFCNT_DEBUG |
| 40 | atomic_set(&net->use_count, 0); | 40 | atomic_set(&net->use_count, 0); |
| 41 | #endif | 41 | #endif |
| 42 | 42 | ||
| 43 | error = -ENOMEM; | ||
| 44 | ng = kzalloc(sizeof(struct net_generic) + | ||
| 45 | INITIAL_NET_GEN_PTRS * sizeof(void *), GFP_KERNEL); | ||
| 46 | if (ng == NULL) | ||
| 47 | goto out; | ||
| 48 | |||
| 49 | ng->len = INITIAL_NET_GEN_PTRS; | ||
| 50 | rcu_assign_pointer(net->gen, ng); | ||
| 51 | |||
| 52 | error = 0; | ||
| 53 | list_for_each_entry(ops, &pernet_list, list) { | 43 | list_for_each_entry(ops, &pernet_list, list) { |
| 54 | if (ops->init) { | 44 | if (ops->init) { |
| 55 | error = ops->init(net); | 45 | error = ops->init(net); |
| @@ -70,24 +60,50 @@ out_undo: | |||
| 70 | } | 60 | } |
| 71 | 61 | ||
| 72 | rcu_barrier(); | 62 | rcu_barrier(); |
| 73 | kfree(ng); | ||
| 74 | goto out; | 63 | goto out; |
| 75 | } | 64 | } |
| 76 | 65 | ||
| 66 | static struct net_generic *net_alloc_generic(void) | ||
| 67 | { | ||
| 68 | struct net_generic *ng; | ||
| 69 | size_t generic_size = sizeof(struct net_generic) + | ||
| 70 | INITIAL_NET_GEN_PTRS * sizeof(void *); | ||
| 71 | |||
| 72 | ng = kzalloc(generic_size, GFP_KERNEL); | ||
| 73 | if (ng) | ||
| 74 | ng->len = INITIAL_NET_GEN_PTRS; | ||
| 75 | |||
| 76 | return ng; | ||
| 77 | } | ||
| 78 | |||
| 77 | #ifdef CONFIG_NET_NS | 79 | #ifdef CONFIG_NET_NS |
| 78 | static struct kmem_cache *net_cachep; | 80 | static struct kmem_cache *net_cachep; |
| 79 | static struct workqueue_struct *netns_wq; | 81 | static struct workqueue_struct *netns_wq; |
| 80 | 82 | ||
| 81 | static struct net *net_alloc(void) | 83 | static struct net *net_alloc(void) |
| 82 | { | 84 | { |
| 83 | return kmem_cache_zalloc(net_cachep, GFP_KERNEL); | 85 | struct net *net = NULL; |
| 86 | struct net_generic *ng; | ||
| 87 | |||
| 88 | ng = net_alloc_generic(); | ||
| 89 | if (!ng) | ||
| 90 | goto out; | ||
| 91 | |||
| 92 | net = kmem_cache_zalloc(net_cachep, GFP_KERNEL); | ||
| 93 | if (!net) | ||
| 94 | goto out_free; | ||
| 95 | |||
| 96 | rcu_assign_pointer(net->gen, ng); | ||
| 97 | out: | ||
| 98 | return net; | ||
| 99 | |||
| 100 | out_free: | ||
| 101 | kfree(ng); | ||
| 102 | goto out; | ||
| 84 | } | 103 | } |
| 85 | 104 | ||
| 86 | static void net_free(struct net *net) | 105 | static void net_free(struct net *net) |
| 87 | { | 106 | { |
| 88 | if (!net) | ||
| 89 | return; | ||
| 90 | |||
| 91 | #ifdef NETNS_REFCNT_DEBUG | 107 | #ifdef NETNS_REFCNT_DEBUG |
| 92 | if (unlikely(atomic_read(&net->use_count) != 0)) { | 108 | if (unlikely(atomic_read(&net->use_count) != 0)) { |
| 93 | printk(KERN_EMERG "network namespace not free! Usage: %d\n", | 109 | printk(KERN_EMERG "network namespace not free! Usage: %d\n", |
| @@ -112,27 +128,28 @@ struct net *copy_net_ns(unsigned long flags, struct net *old_net) | |||
| 112 | err = -ENOMEM; | 128 | err = -ENOMEM; |
| 113 | new_net = net_alloc(); | 129 | new_net = net_alloc(); |
| 114 | if (!new_net) | 130 | if (!new_net) |
| 115 | goto out; | 131 | goto out_err; |
| 116 | 132 | ||
| 117 | mutex_lock(&net_mutex); | 133 | mutex_lock(&net_mutex); |
| 118 | err = setup_net(new_net); | 134 | err = setup_net(new_net); |
| 119 | if (err) | 135 | if (!err) { |
| 120 | goto out_unlock; | 136 | rtnl_lock(); |
| 121 | 137 | list_add_tail(&new_net->list, &net_namespace_list); | |
| 122 | rtnl_lock(); | 138 | rtnl_unlock(); |
| 123 | list_add_tail(&new_net->list, &net_namespace_list); | 139 | } |
| 124 | rtnl_unlock(); | ||
| 125 | |||
| 126 | |||
| 127 | out_unlock: | ||
| 128 | mutex_unlock(&net_mutex); | 140 | mutex_unlock(&net_mutex); |
| 141 | |||
| 142 | if (err) | ||
| 143 | goto out_free; | ||
| 129 | out: | 144 | out: |
| 130 | put_net(old_net); | 145 | put_net(old_net); |
| 131 | if (err) { | ||
| 132 | net_free(new_net); | ||
| 133 | new_net = ERR_PTR(err); | ||
| 134 | } | ||
| 135 | return new_net; | 146 | return new_net; |
| 147 | |||
| 148 | out_free: | ||
| 149 | net_free(new_net); | ||
| 150 | out_err: | ||
| 151 | new_net = ERR_PTR(err); | ||
| 152 | goto out; | ||
| 136 | } | 153 | } |
| 137 | 154 | ||
| 138 | static void cleanup_net(struct work_struct *work) | 155 | static void cleanup_net(struct work_struct *work) |
| @@ -140,9 +157,6 @@ static void cleanup_net(struct work_struct *work) | |||
| 140 | struct pernet_operations *ops; | 157 | struct pernet_operations *ops; |
| 141 | struct net *net; | 158 | struct net *net; |
| 142 | 159 | ||
| 143 | /* Be very certain incoming network packets will not find us */ | ||
| 144 | rcu_barrier(); | ||
| 145 | |||
| 146 | net = container_of(work, struct net, work); | 160 | net = container_of(work, struct net, work); |
| 147 | 161 | ||
| 148 | mutex_lock(&net_mutex); | 162 | mutex_lock(&net_mutex); |
| @@ -188,6 +202,7 @@ struct net *copy_net_ns(unsigned long flags, struct net *old_net) | |||
| 188 | 202 | ||
| 189 | static int __init net_ns_init(void) | 203 | static int __init net_ns_init(void) |
| 190 | { | 204 | { |
| 205 | struct net_generic *ng; | ||
| 191 | int err; | 206 | int err; |
| 192 | 207 | ||
| 193 | printk(KERN_INFO "net_namespace: %zd bytes\n", sizeof(struct net)); | 208 | printk(KERN_INFO "net_namespace: %zd bytes\n", sizeof(struct net)); |
| @@ -202,6 +217,12 @@ static int __init net_ns_init(void) | |||
| 202 | panic("Could not create netns workq"); | 217 | panic("Could not create netns workq"); |
| 203 | #endif | 218 | #endif |
| 204 | 219 | ||
| 220 | ng = net_alloc_generic(); | ||
| 221 | if (!ng) | ||
| 222 | panic("Could not allocate generic netns"); | ||
| 223 | |||
| 224 | rcu_assign_pointer(init_net.gen, ng); | ||
| 225 | |||
| 205 | mutex_lock(&net_mutex); | 226 | mutex_lock(&net_mutex); |
| 206 | err = setup_net(&init_net); | 227 | err = setup_net(&init_net); |
| 207 | 228 | ||
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index da74b844f4ea..c6a6b166f8d6 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
| @@ -143,14 +143,6 @@ void skb_under_panic(struct sk_buff *skb, int sz, void *here) | |||
| 143 | BUG(); | 143 | BUG(); |
| 144 | } | 144 | } |
| 145 | 145 | ||
| 146 | void skb_truesize_bug(struct sk_buff *skb) | ||
| 147 | { | ||
| 148 | WARN(net_ratelimit(), KERN_ERR "SKB BUG: Invalid truesize (%u) " | ||
| 149 | "len=%u, sizeof(sk_buff)=%Zd\n", | ||
| 150 | skb->truesize, skb->len, sizeof(struct sk_buff)); | ||
| 151 | } | ||
| 152 | EXPORT_SYMBOL(skb_truesize_bug); | ||
| 153 | |||
| 154 | /* Allocate a new skbuff. We do this ourselves so we can fill in a few | 146 | /* Allocate a new skbuff. We do this ourselves so we can fill in a few |
| 155 | * 'private' fields and also do memory statistics to find all the | 147 | * 'private' fields and also do memory statistics to find all the |
| 156 | * [BEEP] leaks. | 148 | * [BEEP] leaks. |
diff --git a/net/core/sock.c b/net/core/sock.c index f3a0d08cbb48..5f97caa158e8 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
| @@ -696,6 +696,8 @@ int sock_getsockopt(struct socket *sock, int level, int optname, | |||
| 696 | if (len < 0) | 696 | if (len < 0) |
| 697 | return -EINVAL; | 697 | return -EINVAL; |
| 698 | 698 | ||
| 699 | memset(&v, 0, sizeof(v)); | ||
| 700 | |||
| 699 | switch(optname) { | 701 | switch(optname) { |
| 700 | case SO_DEBUG: | 702 | case SO_DEBUG: |
| 701 | v.val = sock_flag(sk, SOCK_DBG); | 703 | v.val = sock_flag(sk, SOCK_DBG); |
| @@ -1135,7 +1137,6 @@ void sock_rfree(struct sk_buff *skb) | |||
| 1135 | { | 1137 | { |
| 1136 | struct sock *sk = skb->sk; | 1138 | struct sock *sk = skb->sk; |
| 1137 | 1139 | ||
| 1138 | skb_truesize_check(skb); | ||
| 1139 | atomic_sub(skb->truesize, &sk->sk_rmem_alloc); | 1140 | atomic_sub(skb->truesize, &sk->sk_rmem_alloc); |
| 1140 | sk_mem_uncharge(skb->sk, skb->truesize); | 1141 | sk_mem_uncharge(skb->sk, skb->truesize); |
| 1141 | } | 1142 | } |
