Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 241669
b: refs/heads/master
c: 7fe135d
h: refs/heads/master
i:
  241667: 3322f0e
v: v3
  • Loading branch information
Rafael J. Wysocki committed Feb 24, 2011
1 parent bacb116 commit 57f7fb6
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 14 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 7bbb890358b96cb6f77adc6815f2072bdf813d5d
refs/heads/master: 7fe135dc058faea0ce319a03e3b6f98c5049955c
33 changes: 20 additions & 13 deletions trunk/drivers/acpi/osl.c
Original file line number Diff line number Diff line change
Expand Up @@ -358,6 +358,13 @@ static void acpi_kref_del_iomap(struct kref *ref)
list_del_rcu(&map->list);
}

static void acpi_os_remove_map(struct acpi_ioremap *map)
{
synchronize_rcu();
iounmap(map->virt);
kfree(map);
}

void __ref acpi_os_unmap_memory(void __iomem *virt, acpi_size size)
{
struct acpi_ioremap *map;
Expand All @@ -372,20 +379,14 @@ void __ref acpi_os_unmap_memory(void __iomem *virt, acpi_size size)
map = acpi_map_lookup_virt(virt, size);
if (!map) {
mutex_unlock(&acpi_ioremap_lock);
printk(KERN_ERR PREFIX "%s: bad address %p\n", __func__, virt);
dump_stack();
WARN(true, PREFIX "%s: bad address %p\n", __func__, virt);
return;
}

del = kref_put(&map->ref, acpi_kref_del_iomap);
mutex_unlock(&acpi_ioremap_lock);

if (!del)
return;

synchronize_rcu();
iounmap(map->virt);
kfree(map);
if (del)
acpi_os_remove_map(map);
}
EXPORT_SYMBOL_GPL(acpi_os_unmap_memory);

Expand Down Expand Up @@ -414,8 +415,8 @@ static int acpi_os_map_generic_address(struct acpi_generic_address *addr)

static void acpi_os_unmap_generic_address(struct acpi_generic_address *addr)
{
void __iomem *virt;
acpi_size size = addr->bit_width / 8;
struct acpi_ioremap *map;
int del;

if (addr->space_id != ACPI_ADR_SPACE_SYSTEM_MEMORY)
return;
Expand All @@ -424,10 +425,16 @@ static void acpi_os_unmap_generic_address(struct acpi_generic_address *addr)
return;

mutex_lock(&acpi_ioremap_lock);
virt = acpi_map_vaddr_lookup(addr->address, size);
map = acpi_map_lookup(addr->address, addr->bit_width / 8);
if (!map) {
mutex_unlock(&acpi_ioremap_lock);
return;
}
del = kref_put(&map->ref, acpi_kref_del_iomap);
mutex_unlock(&acpi_ioremap_lock);

acpi_os_unmap_memory(virt, size);
if (del)
acpi_os_remove_map(map);
}

#ifdef ACPI_FUTURE_USAGE
Expand Down

0 comments on commit 57f7fb6

Please sign in to comment.