* [PATCH 1/5] m68k/amiga: Chip RAM - Use tabs for indentation
@ 2011-05-21 19:18 Geert Uytterhoeven
2011-05-21 19:18 ` [PATCH 2/5] m68k/amiga: Chip RAM - Convert from printk() to pr_*() Geert Uytterhoeven
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: Geert Uytterhoeven @ 2011-05-21 19:18 UTC (permalink / raw)
To: linux-m68k; +Cc: linux-kernel, Geert Uytterhoeven
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
---
arch/m68k/amiga/chipram.c | 118 +++++++++++++++++++++++----------------------
1 files changed, 61 insertions(+), 57 deletions(-)
diff --git a/arch/m68k/amiga/chipram.c b/arch/m68k/amiga/chipram.c
index dd0447d..e757fff 100644
--- a/arch/m68k/amiga/chipram.c
+++ b/arch/m68k/amiga/chipram.c
@@ -23,101 +23,105 @@ unsigned long amiga_chip_size;
EXPORT_SYMBOL(amiga_chip_size);
static struct resource chipram_res = {
- .name = "Chip RAM", .start = CHIP_PHYSADDR
+ .name = "Chip RAM", .start = CHIP_PHYSADDR
};
static unsigned long chipavail;
void __init amiga_chip_init(void)
{
- if (!AMIGAHW_PRESENT(CHIP_RAM))
- return;
+ if (!AMIGAHW_PRESENT(CHIP_RAM))
+ return;
- chipram_res.end = amiga_chip_size-1;
- request_resource(&iomem_resource, &chipram_res);
+ chipram_res.end = amiga_chip_size-1;
+ request_resource(&iomem_resource, &chipram_res);
- chipavail = amiga_chip_size;
+ chipavail = amiga_chip_size;
}
void *amiga_chip_alloc(unsigned long size, const char *name)
{
- struct resource *res;
+ struct resource *res;
- /* round up */
- size = PAGE_ALIGN(size);
+ /* round up */
+ size = PAGE_ALIGN(size);
#ifdef DEBUG
- printk("amiga_chip_alloc: allocate %ld bytes\n", size);
+ printk("amiga_chip_alloc: allocate %ld bytes\n", size);
#endif
- res = kzalloc(sizeof(struct resource), GFP_KERNEL);
- if (!res)
- return NULL;
- res->name = name;
-
- if (allocate_resource(&chipram_res, res, size, 0, UINT_MAX, PAGE_SIZE, NULL, NULL) < 0) {
- kfree(res);
- return NULL;
- }
- chipavail -= size;
+ res = kzalloc(sizeof(struct resource), GFP_KERNEL);
+ if (!res)
+ return NULL;
+ res->name = name;
+
+ if (allocate_resource(&chipram_res, res, size, 0, UINT_MAX, PAGE_SIZE,
+ NULL, NULL) < 0) {
+ kfree(res);
+ return NULL;
+ }
+ chipavail -= size;
#ifdef DEBUG
- printk("amiga_chip_alloc: returning %lx\n", res->start);
+ printk("amiga_chip_alloc: returning %lx\n", res->start);
#endif
- return (void *)ZTWO_VADDR(res->start);
+ return (void *)ZTWO_VADDR(res->start);
}
EXPORT_SYMBOL(amiga_chip_alloc);
- /*
- * Warning:
- * amiga_chip_alloc_res is meant only for drivers that need to allocate
- * Chip RAM before kmalloc() is functional. As a consequence, those
- * drivers must not free that Chip RAM afterwards.
- */
+ /*
+ * Warning:
+ * amiga_chip_alloc_res is meant only for drivers that need to
+ * allocate Chip RAM before kmalloc() is functional. As a consequence,
+ * those drivers must not free that Chip RAM afterwards.
+ */
void * __init amiga_chip_alloc_res(unsigned long size, struct resource *res)
{
- unsigned long start;
+ unsigned long start;
- /* round up */
- size = PAGE_ALIGN(size);
- /* dmesg into chipmem prefers memory at the safe end */
- start = CHIP_PHYSADDR + chipavail - size;
+ /* round up */
+ size = PAGE_ALIGN(size);
+ /* dmesg into chipmem prefers memory at the safe end */
+ start = CHIP_PHYSADDR + chipavail - size;
#ifdef DEBUG
- printk("amiga_chip_alloc_res: allocate %ld bytes\n", size);
+ printk("amiga_chip_alloc_res: allocate %ld bytes\n", size);
#endif
- if (allocate_resource(&chipram_res, res, size, start, UINT_MAX, PAGE_SIZE, NULL, NULL) < 0) {
- printk("amiga_chip_alloc_res: first alloc failed!\n");
- if (allocate_resource(&chipram_res, res, size, 0, UINT_MAX, PAGE_SIZE, NULL, NULL) < 0)
- return NULL;
- }
- chipavail -= size;
+ if (allocate_resource(&chipram_res, res, size, start, UINT_MAX,
+ PAGE_SIZE, NULL, NULL) < 0) {
+ printk("amiga_chip_alloc_res: first alloc failed!\n");
+ if (allocate_resource(&chipram_res, res, size, 0, UINT_MAX,
+ PAGE_SIZE, NULL, NULL) < 0)
+ return NULL;
+ }
+ chipavail -= size;
#ifdef DEBUG
- printk("amiga_chip_alloc_res: returning %lx\n", res->start);
+ printk("amiga_chip_alloc_res: returning %lx\n", res->start);
#endif
- return (void *)ZTWO_VADDR(res->start);
+ return (void *)ZTWO_VADDR(res->start);
}
void amiga_chip_free(void *ptr)
{
- unsigned long start = ZTWO_PADDR(ptr);
- struct resource **p, *res;
- unsigned long size;
-
- for (p = &chipram_res.child; (res = *p); p = &res->sibling) {
- if (res->start != start)
- continue;
- *p = res->sibling;
- size = res->end-start;
+ unsigned long start = ZTWO_PADDR(ptr);
+ struct resource **p, *res;
+ unsigned long size;
+
+ for (p = &chipram_res.child; (res = *p); p = &res->sibling) {
+ if (res->start != start)
+ continue;
+ *p = res->sibling;
+ size = res->end-start;
#ifdef DEBUG
- printk("amiga_chip_free: free %ld bytes at %p\n", size, ptr);
+ printk("amiga_chip_free: free %ld bytes at %p\n", size, ptr);
#endif
- chipavail += size;
- kfree(res);
- return;
- }
- printk("amiga_chip_free: trying to free nonexistent region at %p\n", ptr);
+ chipavail += size;
+ kfree(res);
+ return;
+ }
+ printk("amiga_chip_free: trying to free nonexistent region at %p\n",
+ ptr);
}
EXPORT_SYMBOL(amiga_chip_free);
--
1.7.0.4
^ permalink raw reply related [flat|nested] 5+ messages in thread* [PATCH 2/5] m68k/amiga: Chip RAM - Convert from printk() to pr_*()
2011-05-21 19:18 [PATCH 1/5] m68k/amiga: Chip RAM - Use tabs for indentation Geert Uytterhoeven
@ 2011-05-21 19:18 ` Geert Uytterhoeven
2011-05-21 19:18 ` [PATCH 3/5] m68k/amiga: Chip RAM - Always allocate from the start of memory Geert Uytterhoeven
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Geert Uytterhoeven @ 2011-05-21 19:18 UTC (permalink / raw)
To: linux-m68k; +Cc: linux-kernel, Geert Uytterhoeven
and fix a few formattings:
- resource sizes are now resource_size_t, use %pR to make it future proof,
- use %lu for unsigned long.
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
---
arch/m68k/amiga/chipram.c | 28 ++++++++--------------------
1 files changed, 8 insertions(+), 20 deletions(-)
diff --git a/arch/m68k/amiga/chipram.c b/arch/m68k/amiga/chipram.c
index e757fff..9005fa0 100644
--- a/arch/m68k/amiga/chipram.c
+++ b/arch/m68k/amiga/chipram.c
@@ -47,9 +47,7 @@ void *amiga_chip_alloc(unsigned long size, const char *name)
/* round up */
size = PAGE_ALIGN(size);
-#ifdef DEBUG
- printk("amiga_chip_alloc: allocate %ld bytes\n", size);
-#endif
+ pr_debug("amiga_chip_alloc: allocate %lu bytes\n", size);
res = kzalloc(sizeof(struct resource), GFP_KERNEL);
if (!res)
return NULL;
@@ -61,9 +59,7 @@ void *amiga_chip_alloc(unsigned long size, const char *name)
return NULL;
}
chipavail -= size;
-#ifdef DEBUG
- printk("amiga_chip_alloc: returning %lx\n", res->start);
-#endif
+ pr_debug("amiga_chip_alloc: returning %pR\n", res);
return (void *)ZTWO_VADDR(res->start);
}
EXPORT_SYMBOL(amiga_chip_alloc);
@@ -85,20 +81,16 @@ void * __init amiga_chip_alloc_res(unsigned long size, struct resource *res)
/* dmesg into chipmem prefers memory at the safe end */
start = CHIP_PHYSADDR + chipavail - size;
-#ifdef DEBUG
- printk("amiga_chip_alloc_res: allocate %ld bytes\n", size);
-#endif
+ pr_debug("amiga_chip_alloc_res: allocate %lu bytes\n", size);
if (allocate_resource(&chipram_res, res, size, start, UINT_MAX,
PAGE_SIZE, NULL, NULL) < 0) {
- printk("amiga_chip_alloc_res: first alloc failed!\n");
+ pr_err("amiga_chip_alloc_res: first alloc failed!\n");
if (allocate_resource(&chipram_res, res, size, 0, UINT_MAX,
PAGE_SIZE, NULL, NULL) < 0)
return NULL;
}
chipavail -= size;
-#ifdef DEBUG
- printk("amiga_chip_alloc_res: returning %lx\n", res->start);
-#endif
+ pr_debug("amiga_chip_alloc_res: returning %pR\n", res);
return (void *)ZTWO_VADDR(res->start);
}
@@ -113,14 +105,12 @@ void amiga_chip_free(void *ptr)
continue;
*p = res->sibling;
size = res->end-start;
-#ifdef DEBUG
- printk("amiga_chip_free: free %ld bytes at %p\n", size, ptr);
-#endif
+ pr_debug("amiga_chip_free: free %lu bytes at %p\n", size, ptr);
chipavail += size;
kfree(res);
return;
}
- printk("amiga_chip_free: trying to free nonexistent region at %p\n",
+ pr_err("amiga_chip_free: trying to free nonexistent region at %p\n",
ptr);
}
EXPORT_SYMBOL(amiga_chip_free);
@@ -128,9 +118,7 @@ EXPORT_SYMBOL(amiga_chip_free);
unsigned long amiga_chip_avail(void)
{
-#ifdef DEBUG
- printk("amiga_chip_avail : %ld bytes\n", chipavail);
-#endif
+ pr_debug("amiga_chip_avail : %lu bytes\n", chipavail);
return chipavail;
}
EXPORT_SYMBOL(amiga_chip_avail);
--
1.7.0.4
^ permalink raw reply related [flat|nested] 5+ messages in thread* [PATCH 3/5] m68k/amiga: Chip RAM - Always allocate from the start of memory
2011-05-21 19:18 [PATCH 1/5] m68k/amiga: Chip RAM - Use tabs for indentation Geert Uytterhoeven
2011-05-21 19:18 ` [PATCH 2/5] m68k/amiga: Chip RAM - Convert from printk() to pr_*() Geert Uytterhoeven
@ 2011-05-21 19:18 ` Geert Uytterhoeven
2011-05-21 19:18 ` [PATCH 4/5] m68k/amiga: Chip RAM - Change chipavail to an atomic_t Geert Uytterhoeven
2011-05-21 19:18 ` [PATCH 5/5] m68k/amiga: Chip RAM - Use resource_size() to fix off-by-one error Geert Uytterhoeven
3 siblings, 0 replies; 5+ messages in thread
From: Geert Uytterhoeven @ 2011-05-21 19:18 UTC (permalink / raw)
To: linux-m68k; +Cc: linux-kernel, Geert Uytterhoeven
As of commit 5df1abdbd37af2ae317a1c5b5944173284dc55d6 ('m68k/amiga: Fix
"debug=mem"'), "debug=mem" no longer uses amiga_chip_alloc_res(), so we
can remove the hack to prefer memory at the safe end.
This allows to simplify the code and make amiga_chip_alloc() just call
amiga_chip_alloc_res() internally.
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
---
arch/m68k/amiga/chipram.c | 35 +++++++++++++++--------------------
1 files changed, 15 insertions(+), 20 deletions(-)
diff --git a/arch/m68k/amiga/chipram.c b/arch/m68k/amiga/chipram.c
index 9005fa0..e5a8dbc 100644
--- a/arch/m68k/amiga/chipram.c
+++ b/arch/m68k/amiga/chipram.c
@@ -43,24 +43,20 @@ void __init amiga_chip_init(void)
void *amiga_chip_alloc(unsigned long size, const char *name)
{
struct resource *res;
+ void *p;
- /* round up */
- size = PAGE_ALIGN(size);
-
- pr_debug("amiga_chip_alloc: allocate %lu bytes\n", size);
res = kzalloc(sizeof(struct resource), GFP_KERNEL);
if (!res)
return NULL;
- res->name = name;
- if (allocate_resource(&chipram_res, res, size, 0, UINT_MAX, PAGE_SIZE,
- NULL, NULL) < 0) {
+ res->name = name;
+ p = amiga_chip_alloc_res(size, res);
+ if (!p) {
kfree(res);
return NULL;
}
- chipavail -= size;
- pr_debug("amiga_chip_alloc: returning %pR\n", res);
- return (void *)ZTWO_VADDR(res->start);
+
+ return p;
}
EXPORT_SYMBOL(amiga_chip_alloc);
@@ -72,23 +68,22 @@ EXPORT_SYMBOL(amiga_chip_alloc);
* those drivers must not free that Chip RAM afterwards.
*/
-void * __init amiga_chip_alloc_res(unsigned long size, struct resource *res)
+void *amiga_chip_alloc_res(unsigned long size, struct resource *res)
{
- unsigned long start;
+ int error;
/* round up */
size = PAGE_ALIGN(size);
- /* dmesg into chipmem prefers memory at the safe end */
- start = CHIP_PHYSADDR + chipavail - size;
pr_debug("amiga_chip_alloc_res: allocate %lu bytes\n", size);
- if (allocate_resource(&chipram_res, res, size, start, UINT_MAX,
- PAGE_SIZE, NULL, NULL) < 0) {
- pr_err("amiga_chip_alloc_res: first alloc failed!\n");
- if (allocate_resource(&chipram_res, res, size, 0, UINT_MAX,
- PAGE_SIZE, NULL, NULL) < 0)
- return NULL;
+ error = allocate_resource(&chipram_res, res, size, 0, UINT_MAX,
+ PAGE_SIZE, NULL, NULL);
+ if (error < 0) {
+ pr_err("amiga_chip_alloc_res: allocate_resource() failed %d!\n",
+ error);
+ return NULL;
}
+
chipavail -= size;
pr_debug("amiga_chip_alloc_res: returning %pR\n", res);
return (void *)ZTWO_VADDR(res->start);
--
1.7.0.4
^ permalink raw reply related [flat|nested] 5+ messages in thread* [PATCH 4/5] m68k/amiga: Chip RAM - Change chipavail to an atomic_t
2011-05-21 19:18 [PATCH 1/5] m68k/amiga: Chip RAM - Use tabs for indentation Geert Uytterhoeven
2011-05-21 19:18 ` [PATCH 2/5] m68k/amiga: Chip RAM - Convert from printk() to pr_*() Geert Uytterhoeven
2011-05-21 19:18 ` [PATCH 3/5] m68k/amiga: Chip RAM - Always allocate from the start of memory Geert Uytterhoeven
@ 2011-05-21 19:18 ` Geert Uytterhoeven
2011-05-21 19:18 ` [PATCH 5/5] m68k/amiga: Chip RAM - Use resource_size() to fix off-by-one error Geert Uytterhoeven
3 siblings, 0 replies; 5+ messages in thread
From: Geert Uytterhoeven @ 2011-05-21 19:18 UTC (permalink / raw)
To: linux-m68k; +Cc: linux-kernel, Geert Uytterhoeven
While the core resource handling code is safe, our global counter must
still be protected against concurrent modifications.
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
---
arch/m68k/amiga/chipram.c | 15 +++++++++------
1 files changed, 9 insertions(+), 6 deletions(-)
diff --git a/arch/m68k/amiga/chipram.c b/arch/m68k/amiga/chipram.c
index e5a8dbc..c3fe451 100644
--- a/arch/m68k/amiga/chipram.c
+++ b/arch/m68k/amiga/chipram.c
@@ -16,6 +16,7 @@
#include <linux/string.h>
#include <linux/module.h>
+#include <asm/atomic.h>
#include <asm/page.h>
#include <asm/amigahw.h>
@@ -25,7 +26,7 @@ EXPORT_SYMBOL(amiga_chip_size);
static struct resource chipram_res = {
.name = "Chip RAM", .start = CHIP_PHYSADDR
};
-static unsigned long chipavail;
+static atomic_t chipavail;
void __init amiga_chip_init(void)
@@ -36,7 +37,7 @@ void __init amiga_chip_init(void)
chipram_res.end = amiga_chip_size-1;
request_resource(&iomem_resource, &chipram_res);
- chipavail = amiga_chip_size;
+ atomic_set(&chipavail, amiga_chip_size);
}
@@ -84,7 +85,7 @@ void *amiga_chip_alloc_res(unsigned long size, struct resource *res)
return NULL;
}
- chipavail -= size;
+ atomic_sub(size, &chipavail);
pr_debug("amiga_chip_alloc_res: returning %pR\n", res);
return (void *)ZTWO_VADDR(res->start);
}
@@ -101,7 +102,7 @@ void amiga_chip_free(void *ptr)
*p = res->sibling;
size = res->end-start;
pr_debug("amiga_chip_free: free %lu bytes at %p\n", size, ptr);
- chipavail += size;
+ atomic_add(size, &chipavail);
kfree(res);
return;
}
@@ -113,8 +114,10 @@ EXPORT_SYMBOL(amiga_chip_free);
unsigned long amiga_chip_avail(void)
{
- pr_debug("amiga_chip_avail : %lu bytes\n", chipavail);
- return chipavail;
+ unsigned long n = atomic_read(&chipavail);
+
+ pr_debug("amiga_chip_avail : %lu bytes\n", n);
+ return n;
}
EXPORT_SYMBOL(amiga_chip_avail);
--
1.7.0.4
^ permalink raw reply related [flat|nested] 5+ messages in thread* [PATCH 5/5] m68k/amiga: Chip RAM - Use resource_size() to fix off-by-one error
2011-05-21 19:18 [PATCH 1/5] m68k/amiga: Chip RAM - Use tabs for indentation Geert Uytterhoeven
` (2 preceding siblings ...)
2011-05-21 19:18 ` [PATCH 4/5] m68k/amiga: Chip RAM - Change chipavail to an atomic_t Geert Uytterhoeven
@ 2011-05-21 19:18 ` Geert Uytterhoeven
3 siblings, 0 replies; 5+ messages in thread
From: Geert Uytterhoeven @ 2011-05-21 19:18 UTC (permalink / raw)
To: linux-m68k; +Cc: linux-kernel, Geert Uytterhoeven
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
---
arch/m68k/amiga/chipram.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/arch/m68k/amiga/chipram.c b/arch/m68k/amiga/chipram.c
index c3fe451..cfd3b7a 100644
--- a/arch/m68k/amiga/chipram.c
+++ b/arch/m68k/amiga/chipram.c
@@ -100,7 +100,7 @@ void amiga_chip_free(void *ptr)
if (res->start != start)
continue;
*p = res->sibling;
- size = res->end-start;
+ size = resource_size(res);
pr_debug("amiga_chip_free: free %lu bytes at %p\n", size, ptr);
atomic_add(size, &chipavail);
kfree(res);
--
1.7.0.4
^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2011-05-21 19:18 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-05-21 19:18 [PATCH 1/5] m68k/amiga: Chip RAM - Use tabs for indentation Geert Uytterhoeven
2011-05-21 19:18 ` [PATCH 2/5] m68k/amiga: Chip RAM - Convert from printk() to pr_*() Geert Uytterhoeven
2011-05-21 19:18 ` [PATCH 3/5] m68k/amiga: Chip RAM - Always allocate from the start of memory Geert Uytterhoeven
2011-05-21 19:18 ` [PATCH 4/5] m68k/amiga: Chip RAM - Change chipavail to an atomic_t Geert Uytterhoeven
2011-05-21 19:18 ` [PATCH 5/5] m68k/amiga: Chip RAM - Use resource_size() to fix off-by-one error Geert Uytterhoeven
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox