diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-07-22 19:44:08 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-07-22 19:44:08 -0400 |
| commit | 0342cbcfced2ee937d7c8e1c63f3d3082da7c7dc (patch) | |
| tree | fb98291d321a50de2dfd99f9bcaa33274f0c3952 | |
| parent | 391d6276db9fbdedfbc30e1b56390414f0e55988 (diff) | |
| parent | 7f70893173b056df691b2ee7546bb44fd9abae6a (diff) | |
Merge branch 'core-rcu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'core-rcu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
rcu: Fix wrong check in list_splice_init_rcu()
net,rcu: Convert call_rcu(xt_rateest_free_rcu) to kfree_rcu()
sysctl,rcu: Convert call_rcu(free_head) to kfree
vmalloc,rcu: Convert call_rcu(rcu_free_vb) to kfree_rcu()
vmalloc,rcu: Convert call_rcu(rcu_free_va) to kfree_rcu()
ipc,rcu: Convert call_rcu(ipc_immediate_free) to kfree_rcu()
ipc,rcu: Convert call_rcu(free_un) to kfree_rcu()
security,rcu: Convert call_rcu(sel_netport_free) to kfree_rcu()
security,rcu: Convert call_rcu(sel_netnode_free) to kfree_rcu()
ia64,rcu: Convert call_rcu(sn_irq_info_free) to kfree_rcu()
block,rcu: Convert call_rcu(disk_free_ptbl_rcu_cb) to kfree_rcu()
scsi,rcu: Convert call_rcu(fc_rport_free_rcu) to kfree_rcu()
audit_tree,rcu: Convert call_rcu(__put_tree) to kfree_rcu()
security,rcu: Convert call_rcu(whitelist_item_free) to kfree_rcu()
md,rcu: Convert call_rcu(free_conf) to kfree_rcu()
| -rw-r--r-- | arch/ia64/sn/kernel/irq.c | 14 | ||||
| -rw-r--r-- | block/genhd.c | 10 | ||||
| -rw-r--r-- | drivers/md/linear.c | 8 | ||||
| -rw-r--r-- | drivers/scsi/libfc/fc_rport.c | 14 | ||||
| -rw-r--r-- | include/linux/rculist.h | 2 | ||||
| -rw-r--r-- | ipc/sem.c | 10 | ||||
| -rw-r--r-- | ipc/util.c | 16 | ||||
| -rw-r--r-- | kernel/audit_tree.c | 8 | ||||
| -rw-r--r-- | kernel/sysctl.c | 11 | ||||
| -rw-r--r-- | mm/vmalloc.c | 18 | ||||
| -rw-r--r-- | net/netfilter/xt_RATEEST.c | 8 | ||||
| -rw-r--r-- | security/device_cgroup.c | 10 | ||||
| -rw-r--r-- | security/selinux/netnode.c | 20 | ||||
| -rw-r--r-- | security/selinux/netport.c | 20 |
14 files changed, 21 insertions, 148 deletions
diff --git a/arch/ia64/sn/kernel/irq.c b/arch/ia64/sn/kernel/irq.c index 81a1f4e6bcd8..485c42d97e83 100644 --- a/arch/ia64/sn/kernel/irq.c +++ b/arch/ia64/sn/kernel/irq.c | |||
| @@ -112,8 +112,6 @@ static void sn_ack_irq(struct irq_data *data) | |||
| 112 | irq_move_irq(data); | 112 | irq_move_irq(data); |
| 113 | } | 113 | } |
| 114 | 114 | ||
| 115 | static void sn_irq_info_free(struct rcu_head *head); | ||
| 116 | |||
| 117 | struct sn_irq_info *sn_retarget_vector(struct sn_irq_info *sn_irq_info, | 115 | struct sn_irq_info *sn_retarget_vector(struct sn_irq_info *sn_irq_info, |
| 118 | nasid_t nasid, int slice) | 116 | nasid_t nasid, int slice) |
| 119 | { | 117 | { |
| @@ -177,7 +175,7 @@ struct sn_irq_info *sn_retarget_vector(struct sn_irq_info *sn_irq_info, | |||
| 177 | spin_lock(&sn_irq_info_lock); | 175 | spin_lock(&sn_irq_info_lock); |
| 178 | list_replace_rcu(&sn_irq_info->list, &new_irq_info->list); | 176 | list_replace_rcu(&sn_irq_info->list, &new_irq_info->list); |
| 179 | spin_unlock(&sn_irq_info_lock); | 177 | spin_unlock(&sn_irq_info_lock); |
| 180 | call_rcu(&sn_irq_info->rcu, sn_irq_info_free); | 178 | kfree_rcu(sn_irq_info, rcu); |
| 181 | 179 | ||
| 182 | 180 | ||
| 183 | finish_up: | 181 | finish_up: |
| @@ -338,14 +336,6 @@ static void unregister_intr_pda(struct sn_irq_info *sn_irq_info) | |||
| 338 | rcu_read_unlock(); | 336 | rcu_read_unlock(); |
| 339 | } | 337 | } |
| 340 | 338 | ||
| 341 | static void sn_irq_info_free(struct rcu_head *head) | ||
| 342 | { | ||
| 343 | struct sn_irq_info *sn_irq_info; | ||
| 344 | |||
| 345 | sn_irq_info = container_of(head, struct sn_irq_info, rcu); | ||
| 346 | kfree(sn_irq_info); | ||
| 347 | } | ||
| 348 | |||
| 349 | void sn_irq_fixup(struct pci_dev *pci_dev, struct sn_irq_info *sn_irq_info) | 339 | void sn_irq_fixup(struct pci_dev *pci_dev, struct sn_irq_info *sn_irq_info) |
| 350 | { | 340 | { |
| 351 | nasid_t nasid = sn_irq_info->irq_nasid; | 341 | nasid_t nasid = sn_irq_info->irq_nasid; |
| @@ -399,7 +389,7 @@ void sn_irq_unfixup(struct pci_dev *pci_dev) | |||
| 399 | spin_unlock(&sn_irq_info_lock); | 389 | spin_unlock(&sn_irq_info_lock); |
| 400 | if (list_empty(sn_irq_lh[sn_irq_info->irq_irq])) | 390 | if (list_empty(sn_irq_lh[sn_irq_info->irq_irq])) |
| 401 | free_irq_vector(sn_irq_info->irq_irq); | 391 | free_irq_vector(sn_irq_info->irq_irq); |
| 402 | call_rcu(&sn_irq_info->rcu, sn_irq_info_free); | 392 | kfree_rcu(sn_irq_info, rcu); |
| 403 | pci_dev_put(pci_dev); | 393 | pci_dev_put(pci_dev); |
| 404 | 394 | ||
| 405 | } | 395 | } |
diff --git a/block/genhd.c b/block/genhd.c index 3608289c8ecd..6024b82e3209 100644 --- a/block/genhd.c +++ b/block/genhd.c | |||
| @@ -1018,14 +1018,6 @@ static const struct attribute_group *disk_attr_groups[] = { | |||
| 1018 | NULL | 1018 | NULL |
| 1019 | }; | 1019 | }; |
| 1020 | 1020 | ||
| 1021 | static void disk_free_ptbl_rcu_cb(struct rcu_head *head) | ||
| 1022 | { | ||
| 1023 | struct disk_part_tbl *ptbl = | ||
| 1024 | container_of(head, struct disk_part_tbl, rcu_head); | ||
| 1025 | |||
| 1026 | kfree(ptbl); | ||
| 1027 | } | ||
| 1028 | |||
| 1029 | /** | 1021 | /** |
| 1030 | * disk_replace_part_tbl - replace disk->part_tbl in RCU-safe way | 1022 | * disk_replace_part_tbl - replace disk->part_tbl in RCU-safe way |
| 1031 | * @disk: disk to replace part_tbl for | 1023 | * @disk: disk to replace part_tbl for |
| @@ -1046,7 +1038,7 @@ static void disk_replace_part_tbl(struct gendisk *disk, | |||
| 1046 | 1038 | ||
| 1047 | if (old_ptbl) { | 1039 | if (old_ptbl) { |
| 1048 | rcu_assign_pointer(old_ptbl->last_lookup, NULL); | 1040 | rcu_assign_pointer(old_ptbl->last_lookup, NULL); |
| 1049 | call_rcu(&old_ptbl->rcu_head, disk_free_ptbl_rcu_cb); | 1041 | kfree_rcu(old_ptbl, rcu_head); |
| 1050 | } | 1042 | } |
| 1051 | } | 1043 | } |
| 1052 | 1044 | ||
diff --git a/drivers/md/linear.c b/drivers/md/linear.c index abfb59a61ede..6cd2c313e800 100644 --- a/drivers/md/linear.c +++ b/drivers/md/linear.c | |||
| @@ -213,12 +213,6 @@ static int linear_run (mddev_t *mddev) | |||
| 213 | return md_integrity_register(mddev); | 213 | return md_integrity_register(mddev); |
| 214 | } | 214 | } |
| 215 | 215 | ||
| 216 | static void free_conf(struct rcu_head *head) | ||
| 217 | { | ||
| 218 | linear_conf_t *conf = container_of(head, linear_conf_t, rcu); | ||
| 219 | kfree(conf); | ||
| 220 | } | ||
| 221 | |||
| 222 | static int linear_add(mddev_t *mddev, mdk_rdev_t *rdev) | 216 | static int linear_add(mddev_t *mddev, mdk_rdev_t *rdev) |
| 223 | { | 217 | { |
| 224 | /* Adding a drive to a linear array allows the array to grow. | 218 | /* Adding a drive to a linear array allows the array to grow. |
| @@ -247,7 +241,7 @@ static int linear_add(mddev_t *mddev, mdk_rdev_t *rdev) | |||
| 247 | md_set_array_sectors(mddev, linear_size(mddev, 0, 0)); | 241 | md_set_array_sectors(mddev, linear_size(mddev, 0, 0)); |
| 248 | set_capacity(mddev->gendisk, mddev->array_sectors); | 242 | set_capacity(mddev->gendisk, mddev->array_sectors); |
| 249 | revalidate_disk(mddev->gendisk); | 243 | revalidate_disk(mddev->gendisk); |
| 250 | call_rcu(&oldconf->rcu, free_conf); | 244 | kfree_rcu(oldconf, rcu); |
| 251 | return 0; | 245 | return 0; |
| 252 | } | 246 | } |
| 253 | 247 | ||
diff --git a/drivers/scsi/libfc/fc_rport.c b/drivers/scsi/libfc/fc_rport.c index 49e1ccca09d5..01e13a2eb93a 100644 --- a/drivers/scsi/libfc/fc_rport.c +++ b/drivers/scsi/libfc/fc_rport.c | |||
| @@ -153,18 +153,6 @@ static struct fc_rport_priv *fc_rport_create(struct fc_lport *lport, | |||
| 153 | } | 153 | } |
| 154 | 154 | ||
| 155 | /** | 155 | /** |
| 156 | * fc_rport_free_rcu() - Free a remote port | ||
| 157 | * @rcu: The rcu_head structure inside the remote port | ||
| 158 | */ | ||
| 159 | static void fc_rport_free_rcu(struct rcu_head *rcu) | ||
| 160 | { | ||
| 161 | struct fc_rport_priv *rdata; | ||
| 162 | |||
| 163 | rdata = container_of(rcu, struct fc_rport_priv, rcu); | ||
| 164 | kfree(rdata); | ||
| 165 | } | ||
| 166 | |||
| 167 | /** | ||
| 168 | * fc_rport_destroy() - Free a remote port after last reference is released | 156 | * fc_rport_destroy() - Free a remote port after last reference is released |
| 169 | * @kref: The remote port's kref | 157 | * @kref: The remote port's kref |
| 170 | */ | 158 | */ |
| @@ -173,7 +161,7 @@ static void fc_rport_destroy(struct kref *kref) | |||
| 173 | struct fc_rport_priv *rdata; | 161 | struct fc_rport_priv *rdata; |
| 174 | 162 | ||
| 175 | rdata = container_of(kref, struct fc_rport_priv, kref); | 163 | rdata = container_of(kref, struct fc_rport_priv, kref); |
| 176 | call_rcu(&rdata->rcu, fc_rport_free_rcu); | 164 | kfree_rcu(rdata, rcu); |
| 177 | } | 165 | } |
| 178 | 166 | ||
| 179 | /** | 167 | /** |
diff --git a/include/linux/rculist.h b/include/linux/rculist.h index e3beb315517a..d079290843a9 100644 --- a/include/linux/rculist.h +++ b/include/linux/rculist.h | |||
| @@ -183,7 +183,7 @@ static inline void list_splice_init_rcu(struct list_head *list, | |||
| 183 | struct list_head *last = list->prev; | 183 | struct list_head *last = list->prev; |
| 184 | struct list_head *at = head->next; | 184 | struct list_head *at = head->next; |
| 185 | 185 | ||
| 186 | if (list_empty(head)) | 186 | if (list_empty(list)) |
| 187 | return; | 187 | return; |
| 188 | 188 | ||
| 189 | /* "first" and "last" tracking list, so initialize it. */ | 189 | /* "first" and "last" tracking list, so initialize it. */ |
| @@ -689,12 +689,6 @@ static int count_semzcnt (struct sem_array * sma, ushort semnum) | |||
| 689 | return semzcnt; | 689 | return semzcnt; |
| 690 | } | 690 | } |
| 691 | 691 | ||
| 692 | static void free_un(struct rcu_head *head) | ||
| 693 | { | ||
| 694 | struct sem_undo *un = container_of(head, struct sem_undo, rcu); | ||
| 695 | kfree(un); | ||
| 696 | } | ||
| 697 | |||
| 698 | /* Free a semaphore set. freeary() is called with sem_ids.rw_mutex locked | 692 | /* Free a semaphore set. freeary() is called with sem_ids.rw_mutex locked |
| 699 | * as a writer and the spinlock for this semaphore set hold. sem_ids.rw_mutex | 693 | * as a writer and the spinlock for this semaphore set hold. sem_ids.rw_mutex |
| 700 | * remains locked on exit. | 694 | * remains locked on exit. |
| @@ -714,7 +708,7 @@ static void freeary(struct ipc_namespace *ns, struct kern_ipc_perm *ipcp) | |||
| 714 | un->semid = -1; | 708 | un->semid = -1; |
| 715 | list_del_rcu(&un->list_proc); | 709 | list_del_rcu(&un->list_proc); |
| 716 | spin_unlock(&un->ulp->lock); | 710 | spin_unlock(&un->ulp->lock); |
| 717 | call_rcu(&un->rcu, free_un); | 711 | kfree_rcu(un, rcu); |
| 718 | } | 712 | } |
| 719 | 713 | ||
| 720 | /* Wake up all pending processes and let them fail with EIDRM. */ | 714 | /* Wake up all pending processes and let them fail with EIDRM. */ |
| @@ -1612,7 +1606,7 @@ void exit_sem(struct task_struct *tsk) | |||
| 1612 | sem_unlock(sma); | 1606 | sem_unlock(sma); |
| 1613 | wake_up_sem_queue_do(&tasks); | 1607 | wake_up_sem_queue_do(&tasks); |
| 1614 | 1608 | ||
| 1615 | call_rcu(&un->rcu, free_un); | 1609 | kfree_rcu(un, rcu); |
| 1616 | } | 1610 | } |
| 1617 | kfree(ulp); | 1611 | kfree(ulp); |
| 1618 | } | 1612 | } |
diff --git a/ipc/util.c b/ipc/util.c index 5c0d28921ba8..75261a31d48d 100644 --- a/ipc/util.c +++ b/ipc/util.c | |||
| @@ -579,19 +579,6 @@ static void ipc_schedule_free(struct rcu_head *head) | |||
| 579 | schedule_work(&sched->work); | 579 | schedule_work(&sched->work); |
| 580 | } | 580 | } |
| 581 | 581 | ||
| 582 | /** | ||
| 583 | * ipc_immediate_free - free ipc + rcu space | ||
| 584 | * @head: RCU callback structure that contains pointer to be freed | ||
| 585 | * | ||
| 586 | * Free from the RCU callback context. | ||
| 587 | */ | ||
| 588 | static void ipc_immediate_free(struct rcu_head *head) | ||
| 589 | { | ||
| 590 | struct ipc_rcu_grace *free = | ||
| 591 | container_of(head, struct ipc_rcu_grace, rcu); | ||
| 592 | kfree(free); | ||
| 593 | } | ||
| 594 | |||
| 595 | void ipc_rcu_putref(void *ptr) | 582 | void ipc_rcu_putref(void *ptr) |
| 596 | { | 583 | { |
| 597 | if (--container_of(ptr, struct ipc_rcu_hdr, data)->refcount > 0) | 584 | if (--container_of(ptr, struct ipc_rcu_hdr, data)->refcount > 0) |
| @@ -601,8 +588,7 @@ void ipc_rcu_putref(void *ptr) | |||
| 601 | call_rcu(&container_of(ptr, struct ipc_rcu_grace, data)->rcu, | 588 | call_rcu(&container_of(ptr, struct ipc_rcu_grace, data)->rcu, |
| 602 | ipc_schedule_free); | 589 | ipc_schedule_free); |
| 603 | } else { | 590 | } else { |
| 604 | call_rcu(&container_of(ptr, struct ipc_rcu_grace, data)->rcu, | 591 | kfree_rcu(container_of(ptr, struct ipc_rcu_grace, data), rcu); |
| 605 | ipc_immediate_free); | ||
| 606 | } | 592 | } |
| 607 | } | 593 | } |
| 608 | 594 | ||
diff --git a/kernel/audit_tree.c b/kernel/audit_tree.c index e99dda04b126..5bf0790497e7 100644 --- a/kernel/audit_tree.c +++ b/kernel/audit_tree.c | |||
| @@ -93,16 +93,10 @@ static inline void get_tree(struct audit_tree *tree) | |||
| 93 | atomic_inc(&tree->count); | 93 | atomic_inc(&tree->count); |
| 94 | } | 94 | } |
| 95 | 95 | ||
| 96 | static void __put_tree(struct rcu_head *rcu) | ||
| 97 | { | ||
| 98 | struct audit_tree *tree = container_of(rcu, struct audit_tree, head); | ||
| 99 | kfree(tree); | ||
| 100 | } | ||
| 101 | |||
| 102 | static inline void put_tree(struct audit_tree *tree) | 96 | static inline void put_tree(struct audit_tree *tree) |
| 103 | { | 97 | { |
| 104 | if (atomic_dec_and_test(&tree->count)) | 98 | if (atomic_dec_and_test(&tree->count)) |
| 105 | call_rcu(&tree->head, __put_tree); | 99 | kfree_rcu(tree, head); |
| 106 | } | 100 | } |
| 107 | 101 | ||
| 108 | /* to avoid bringing the entire thing in audit.h */ | 102 | /* to avoid bringing the entire thing in audit.h */ |
diff --git a/kernel/sysctl.c b/kernel/sysctl.c index f175d98bd355..11d65b531e50 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c | |||
| @@ -1590,16 +1590,11 @@ void sysctl_head_get(struct ctl_table_header *head) | |||
| 1590 | spin_unlock(&sysctl_lock); | 1590 | spin_unlock(&sysctl_lock); |
| 1591 | } | 1591 | } |
| 1592 | 1592 | ||
| 1593 | static void free_head(struct rcu_head *rcu) | ||
| 1594 | { | ||
| 1595 | kfree(container_of(rcu, struct ctl_table_header, rcu)); | ||
| 1596 | } | ||
| 1597 | |||
| 1598 | void sysctl_head_put(struct ctl_table_header *head) | 1593 | void sysctl_head_put(struct ctl_table_header *head) |
| 1599 | { | 1594 | { |
| 1600 | spin_lock(&sysctl_lock); | 1595 | spin_lock(&sysctl_lock); |
| 1601 | if (!--head->count) | 1596 | if (!--head->count) |
| 1602 | call_rcu(&head->rcu, free_head); | 1597 | kfree_rcu(head, rcu); |
| 1603 | spin_unlock(&sysctl_lock); | 1598 | spin_unlock(&sysctl_lock); |
| 1604 | } | 1599 | } |
| 1605 | 1600 | ||
| @@ -1971,10 +1966,10 @@ void unregister_sysctl_table(struct ctl_table_header * header) | |||
| 1971 | start_unregistering(header); | 1966 | start_unregistering(header); |
| 1972 | if (!--header->parent->count) { | 1967 | if (!--header->parent->count) { |
| 1973 | WARN_ON(1); | 1968 | WARN_ON(1); |
| 1974 | call_rcu(&header->parent->rcu, free_head); | 1969 | kfree_rcu(header->parent, rcu); |
| 1975 | } | 1970 | } |
| 1976 | if (!--header->count) | 1971 | if (!--header->count) |
| 1977 | call_rcu(&header->rcu, free_head); | 1972 | kfree_rcu(header, rcu); |
| 1978 | spin_unlock(&sysctl_lock); | 1973 | spin_unlock(&sysctl_lock); |
| 1979 | } | 1974 | } |
| 1980 | 1975 | ||
diff --git a/mm/vmalloc.c b/mm/vmalloc.c index 1d34d75366a7..ab8494cde007 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c | |||
| @@ -452,13 +452,6 @@ overflow: | |||
| 452 | return ERR_PTR(-EBUSY); | 452 | return ERR_PTR(-EBUSY); |
| 453 | } | 453 | } |
| 454 | 454 | ||
| 455 | static void rcu_free_va(struct rcu_head *head) | ||
| 456 | { | ||
| 457 | struct vmap_area *va = container_of(head, struct vmap_area, rcu_head); | ||
| 458 | |||
| 459 | kfree(va); | ||
| 460 | } | ||
| 461 | |||
| 462 | static void __free_vmap_area(struct vmap_area *va) | 455 | static void __free_vmap_area(struct vmap_area *va) |
| 463 | { | 456 | { |
| 464 | BUG_ON(RB_EMPTY_NODE(&va->rb_node)); | 457 | BUG_ON(RB_EMPTY_NODE(&va->rb_node)); |
| @@ -491,7 +484,7 @@ static void __free_vmap_area(struct vmap_area *va) | |||
| 491 | if (va->va_end > VMALLOC_START && va->va_end <= VMALLOC_END) | 484 | if (va->va_end > VMALLOC_START && va->va_end <= VMALLOC_END) |
| 492 | vmap_area_pcpu_hole = max(vmap_area_pcpu_hole, va->va_end); | 485 | vmap_area_pcpu_hole = max(vmap_area_pcpu_hole, va->va_end); |
| 493 | 486 | ||
| 494 | call_rcu(&va->rcu_head, rcu_free_va); | 487 | kfree_rcu(va, rcu_head); |
| 495 | } | 488 | } |
| 496 | 489 | ||
| 497 | /* | 490 | /* |
| @@ -837,13 +830,6 @@ static struct vmap_block *new_vmap_block(gfp_t gfp_mask) | |||
| 837 | return vb; | 830 | return vb; |
| 838 | } | 831 | } |
| 839 | 832 | ||
| 840 | static void rcu_free_vb(struct rcu_head *head) | ||
| 841 | { | ||
| 842 | struct vmap_block *vb = container_of(head, struct vmap_block, rcu_head); | ||
| 843 | |||
| 844 | kfree(vb); | ||
| 845 | } | ||
| 846 | |||
| 847 | static void free_vmap_block(struct vmap_block *vb) | 833 | static void free_vmap_block(struct vmap_block *vb) |
| 848 | { | 834 | { |
| 849 | struct vmap_block *tmp; | 835 | struct vmap_block *tmp; |
| @@ -856,7 +842,7 @@ static void free_vmap_block(struct vmap_block *vb) | |||
| 856 | BUG_ON(tmp != vb); | 842 | BUG_ON(tmp != vb); |
| 857 | 843 | ||
| 858 | free_vmap_area_noflush(vb->va); | 844 | free_vmap_area_noflush(vb->va); |
| 859 | call_rcu(&vb->rcu_head, rcu_free_vb); | 845 | kfree_rcu(vb, rcu_head); |
| 860 | } | 846 | } |
| 861 | 847 | ||
| 862 | static void purge_fragmented_blocks(int cpu) | 848 | static void purge_fragmented_blocks(int cpu) |
diff --git a/net/netfilter/xt_RATEEST.c b/net/netfilter/xt_RATEEST.c index de079abd5bc8..f264032b8c56 100644 --- a/net/netfilter/xt_RATEEST.c +++ b/net/netfilter/xt_RATEEST.c | |||
| @@ -60,11 +60,6 @@ struct xt_rateest *xt_rateest_lookup(const char *name) | |||
| 60 | } | 60 | } |
| 61 | EXPORT_SYMBOL_GPL(xt_rateest_lookup); | 61 | EXPORT_SYMBOL_GPL(xt_rateest_lookup); |
| 62 | 62 | ||
| 63 | static void xt_rateest_free_rcu(struct rcu_head *head) | ||
| 64 | { | ||
| 65 | kfree(container_of(head, struct xt_rateest, rcu)); | ||
| 66 | } | ||
| 67 | |||
| 68 | void xt_rateest_put(struct xt_rateest *est) | 63 | void xt_rateest_put(struct xt_rateest *est) |
| 69 | { | 64 | { |
| 70 | mutex_lock(&xt_rateest_mutex); | 65 | mutex_lock(&xt_rateest_mutex); |
| @@ -75,7 +70,7 @@ void xt_rateest_put(struct xt_rateest *est) | |||
| 75 | * gen_estimator est_timer() might access est->lock or bstats, | 70 | * gen_estimator est_timer() might access est->lock or bstats, |
| 76 | * wait a RCU grace period before freeing 'est' | 71 | * wait a RCU grace period before freeing 'est' |
| 77 | */ | 72 | */ |
| 78 | call_rcu(&est->rcu, xt_rateest_free_rcu); | 73 | kfree_rcu(est, rcu); |
| 79 | } | 74 | } |
| 80 | mutex_unlock(&xt_rateest_mutex); | 75 | mutex_unlock(&xt_rateest_mutex); |
| 81 | } | 76 | } |
| @@ -188,7 +183,6 @@ static int __init xt_rateest_tg_init(void) | |||
| 188 | static void __exit xt_rateest_tg_fini(void) | 183 | static void __exit xt_rateest_tg_fini(void) |
| 189 | { | 184 | { |
| 190 | xt_unregister_target(&xt_rateest_tg_reg); | 185 | xt_unregister_target(&xt_rateest_tg_reg); |
| 191 | rcu_barrier(); /* Wait for completion of call_rcu()'s (xt_rateest_free_rcu) */ | ||
| 192 | } | 186 | } |
| 193 | 187 | ||
| 194 | 188 | ||
diff --git a/security/device_cgroup.c b/security/device_cgroup.c index 1be68269e1c2..4450fbeec411 100644 --- a/security/device_cgroup.c +++ b/security/device_cgroup.c | |||
| @@ -125,14 +125,6 @@ static int dev_whitelist_add(struct dev_cgroup *dev_cgroup, | |||
| 125 | return 0; | 125 | return 0; |
| 126 | } | 126 | } |
| 127 | 127 | ||
| 128 | static void whitelist_item_free(struct rcu_head *rcu) | ||
| 129 | { | ||
| 130 | struct dev_whitelist_item *item; | ||
| 131 | |||
| 132 | item = container_of(rcu, struct dev_whitelist_item, rcu); | ||
| 133 | kfree(item); | ||
| 134 | } | ||
| 135 | |||
| 136 | /* | 128 | /* |
| 137 | * called under devcgroup_mutex | 129 | * called under devcgroup_mutex |
| 138 | */ | 130 | */ |
| @@ -155,7 +147,7 @@ remove: | |||
| 155 | walk->access &= ~wh->access; | 147 | walk->access &= ~wh->access; |
| 156 | if (!walk->access) { | 148 | if (!walk->access) { |
| 157 | list_del_rcu(&walk->list); | 149 | list_del_rcu(&walk->list); |
| 158 | call_rcu(&walk->rcu, whitelist_item_free); | 150 | kfree_rcu(walk, rcu); |
| 159 | } | 151 | } |
| 160 | } | 152 | } |
| 161 | } | 153 | } |
diff --git a/security/selinux/netnode.c b/security/selinux/netnode.c index 3618251d0fdb..8b691a863186 100644 --- a/security/selinux/netnode.c +++ b/security/selinux/netnode.c | |||
| @@ -69,22 +69,6 @@ static DEFINE_SPINLOCK(sel_netnode_lock); | |||
| 69 | static struct sel_netnode_bkt sel_netnode_hash[SEL_NETNODE_HASH_SIZE]; | 69 | static struct sel_netnode_bkt sel_netnode_hash[SEL_NETNODE_HASH_SIZE]; |
| 70 | 70 | ||
| 71 | /** | 71 | /** |
| 72 | * sel_netnode_free - Frees a node entry | ||
| 73 | * @p: the entry's RCU field | ||
| 74 | * | ||
| 75 | * Description: | ||
| 76 | * This function is designed to be used as a callback to the call_rcu() | ||
| 77 | * function so that memory allocated to a hash table node entry can be | ||
| 78 | * released safely. | ||
| 79 | * | ||
| 80 | */ | ||
| 81 | static void sel_netnode_free(struct rcu_head *p) | ||
| 82 | { | ||
| 83 | struct sel_netnode *node = container_of(p, struct sel_netnode, rcu); | ||
| 84 | kfree(node); | ||
| 85 | } | ||
| 86 | |||
| 87 | /** | ||
| 88 | * sel_netnode_hashfn_ipv4 - IPv4 hashing function for the node table | 72 | * sel_netnode_hashfn_ipv4 - IPv4 hashing function for the node table |
| 89 | * @addr: IPv4 address | 73 | * @addr: IPv4 address |
| 90 | * | 74 | * |
| @@ -193,7 +177,7 @@ static void sel_netnode_insert(struct sel_netnode *node) | |||
| 193 | rcu_dereference(sel_netnode_hash[idx].list.prev), | 177 | rcu_dereference(sel_netnode_hash[idx].list.prev), |
| 194 | struct sel_netnode, list); | 178 | struct sel_netnode, list); |
| 195 | list_del_rcu(&tail->list); | 179 | list_del_rcu(&tail->list); |
| 196 | call_rcu(&tail->rcu, sel_netnode_free); | 180 | kfree_rcu(tail, rcu); |
| 197 | } else | 181 | } else |
| 198 | sel_netnode_hash[idx].size++; | 182 | sel_netnode_hash[idx].size++; |
| 199 | } | 183 | } |
| @@ -306,7 +290,7 @@ static void sel_netnode_flush(void) | |||
| 306 | list_for_each_entry_safe(node, node_tmp, | 290 | list_for_each_entry_safe(node, node_tmp, |
| 307 | &sel_netnode_hash[idx].list, list) { | 291 | &sel_netnode_hash[idx].list, list) { |
| 308 | list_del_rcu(&node->list); | 292 | list_del_rcu(&node->list); |
| 309 | call_rcu(&node->rcu, sel_netnode_free); | 293 | kfree_rcu(node, rcu); |
| 310 | } | 294 | } |
| 311 | sel_netnode_hash[idx].size = 0; | 295 | sel_netnode_hash[idx].size = 0; |
| 312 | } | 296 | } |
diff --git a/security/selinux/netport.c b/security/selinux/netport.c index cfe2d72d3fb7..ae76e298de7d 100644 --- a/security/selinux/netport.c +++ b/security/selinux/netport.c | |||
| @@ -68,22 +68,6 @@ static DEFINE_SPINLOCK(sel_netport_lock); | |||
| 68 | static struct sel_netport_bkt sel_netport_hash[SEL_NETPORT_HASH_SIZE]; | 68 | static struct sel_netport_bkt sel_netport_hash[SEL_NETPORT_HASH_SIZE]; |
| 69 | 69 | ||
| 70 | /** | 70 | /** |
| 71 | * sel_netport_free - Frees a port entry | ||
| 72 | * @p: the entry's RCU field | ||
| 73 | * | ||
| 74 | * Description: | ||
| 75 | * This function is designed to be used as a callback to the call_rcu() | ||
| 76 | * function so that memory allocated to a hash table port entry can be | ||
| 77 | * released safely. | ||
| 78 | * | ||
| 79 | */ | ||
| 80 | static void sel_netport_free(struct rcu_head *p) | ||
| 81 | { | ||
| 82 | struct sel_netport *port = container_of(p, struct sel_netport, rcu); | ||
| 83 | kfree(port); | ||
| 84 | } | ||
| 85 | |||
| 86 | /** | ||
| 87 | * sel_netport_hashfn - Hashing function for the port table | 71 | * sel_netport_hashfn - Hashing function for the port table |
| 88 | * @pnum: port number | 72 | * @pnum: port number |
| 89 | * | 73 | * |
| @@ -142,7 +126,7 @@ static void sel_netport_insert(struct sel_netport *port) | |||
| 142 | rcu_dereference(sel_netport_hash[idx].list.prev), | 126 | rcu_dereference(sel_netport_hash[idx].list.prev), |
| 143 | struct sel_netport, list); | 127 | struct sel_netport, list); |
| 144 | list_del_rcu(&tail->list); | 128 | list_del_rcu(&tail->list); |
| 145 | call_rcu(&tail->rcu, sel_netport_free); | 129 | kfree_rcu(tail, rcu); |
| 146 | } else | 130 | } else |
| 147 | sel_netport_hash[idx].size++; | 131 | sel_netport_hash[idx].size++; |
| 148 | } | 132 | } |
| @@ -241,7 +225,7 @@ static void sel_netport_flush(void) | |||
| 241 | list_for_each_entry_safe(port, port_tmp, | 225 | list_for_each_entry_safe(port, port_tmp, |
| 242 | &sel_netport_hash[idx].list, list) { | 226 | &sel_netport_hash[idx].list, list) { |
| 243 | list_del_rcu(&port->list); | 227 | list_del_rcu(&port->list); |
| 244 | call_rcu(&port->rcu, sel_netport_free); | 228 | kfree_rcu(port, rcu); |
| 245 | } | 229 | } |
| 246 | sel_netport_hash[idx].size = 0; | 230 | sel_netport_hash[idx].size = 0; |
| 247 | } | 231 | } |
