[PATCH] create iommu_free_table()
Olof Johansson
olof at austin.ibm.com
Thu Oct 21 08:26:41 EST 2004
John Rose wrote:
> The patch below creates iommu_free_table(). Iommu tables are not currently
> freed in PPC64. This could cause a memory leak for DLPAR of an EADS slot. The
> function verifies that there are no outstanding TCE entries for the range of
> the table before freeing it. I added a call to iommu_free_table() to the code
> that dynamically removes a device node. This should be fairly symmetrical with
> the table allocation, which happens during dynamic addition of a device node.
>
> Comments welcome.
Looks good, just a couple of minor nitpicks below.
-Olof
> Signed-off-by: John Rose <johnrose at austin.ibm.com>
>
> diff -Nru a/arch/ppc64/kernel/pSeries_iommu.c b/arch/ppc64/kernel/pSeries_iommu.c
> --- a/arch/ppc64/kernel/pSeries_iommu.c Thu Oct 7 11:08:19 2004
> +++ b/arch/ppc64/kernel/pSeries_iommu.c Thu Oct 7 11:08:19 2004
> @@ -412,6 +412,38 @@
> dn->iommu_table = iommu_init_table(tbl);
> }
>
> +void iommu_free_table(struct device_node *dn)
> +{
> + struct iommu_table *tbl = dn->iommu_table;
> + unsigned long bitmap_sz, i;
> + unsigned int order;
> +
> + if (!tbl || !tbl->it_map) {
whitespace above looks wrong (or below?)
> + printk(KERN_ERR "%s: expected TCE map for %s\n", __FUNCTION__,
> + dn->full_name);
> + return;
> + }
> +
> + /* verify that table contains no entries */
> + /* it_mapsize is in entries, and we're examining 64 at a time */
> + for (i = 0; i < (tbl->it_mapsize/64); i++) {
> + if (tbl->it_map[i] != 0) {
> + printk(KERN_WARNING "%s: Unexpected TCEs for %s\n",
> + __FUNCTION__, dn->full_name);
> + break;
> + }
Could this get spammy? It could be nice to see a WARN_ON(1) too, so the
call stack is dumped. If that's added, a printk_ratelimit() would
definately be warranted around both the printk and the WARN_ON().
> + }
> +
> + /* calculate bitmap size in bytes */
> + bitmap_sz = (tbl->it_mapsize + 7) / 8;
> +
> + /* free bitmap */
> + order = get_order(bitmap_sz);
> + free_pages((unsigned long) tbl->it_map, order);
> +
> + /* free table */
> + kfree(tbl);
whitespace
> +}
>
> void iommu_setup_pSeries(void)
> {
> diff -Nru a/arch/ppc64/kernel/prom.c b/arch/ppc64/kernel/prom.c
> --- a/arch/ppc64/kernel/prom.c Thu Oct 7 11:08:19 2004
> +++ b/arch/ppc64/kernel/prom.c Thu Oct 7 11:08:19 2004
> @@ -1818,6 +1818,9 @@
> return -EBUSY;
> }
>
> + if (np->iommu_table)
> + iommu_free_table(np);
> +
> write_lock(&devtree_lock);
> OF_MARK_STALE(np);
> remove_node_proc_entries(np);
> diff -Nru a/include/asm-ppc64/iommu.h b/include/asm-ppc64/iommu.h
> --- a/include/asm-ppc64/iommu.h Thu Oct 7 11:08:19 2004
> +++ b/include/asm-ppc64/iommu.h Thu Oct 7 11:08:19 2004
> @@ -113,6 +113,9 @@
> /* Creates table for an individual device node */
> extern void iommu_devnode_init(struct device_node *dn);
>
> +/* Frees table for an individual device node */
> +extern void iommu_free_table(struct device_node *dn);
> +
> #endif /* CONFIG_PPC_MULTIPLATFORM */
>
> #ifdef CONFIG_PPC_ISERIES
>
>
> _______________________________________________
> Linuxppc64-dev mailing list
> Linuxppc64-dev at ozlabs.org
> https://ozlabs.org/cgi-bin/mailman/listinfo/linuxppc64-dev
>
More information about the Linuxppc64-dev
mailing list