public inbox for linux-m68k@lists.linux-m68k.org
 help / color / mirror / Atom feed
* [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