All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Kill some sparse warnings
@ 2005-02-15 22:45 Peter Hagervall
  2005-02-15 22:52 ` Linus Torvalds
  2005-02-15 22:56 ` Russell King
  0 siblings, 2 replies; 4+ messages in thread
From: Peter Hagervall @ 2005-02-15 22:45 UTC (permalink / raw)
  To: linux-kernel; +Cc: torvalds

Cleaned up some address space issues in:

arch/i386(kernel/pci-dma.c
drivers/base/dmapool.c
fs/proc/base.c
include/asm-generic/pci-dma-compat.h
include/linux/dmapool.h
kernel/stop_machine.c

Signed-off-by: Peter Hagervall <hager@cs.umu.se>



===== arch/i386/kernel/pci-dma.c 1.19 vs edited =====
--- 1.19/arch/i386/kernel/pci-dma.c	2005-02-12 02:33:28 +01:00
+++ edited/arch/i386/kernel/pci-dma.c	2005-02-15 18:24:02 +01:00
@@ -14,17 +14,17 @@
 #include <asm/io.h>
 
 struct dma_coherent_mem {
-	void		*virt_base;
+	void	__iomem *virt_base;
 	u32		device_base;
 	int		size;
 	int		flags;
 	unsigned long	*bitmap;
 };
 
-void *dma_alloc_coherent(struct device *dev, size_t size,
+void __iomem *dma_alloc_coherent(struct device *dev, size_t size,
 			   dma_addr_t *dma_handle, int gfp)
 {
-	void *ret;
+	void __iomem *ret;
 	struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL;
 	int order = get_order(size);
 	/* ignore region specifiers */
@@ -36,7 +36,7 @@
 		if (page >= 0) {
 			*dma_handle = mem->device_base + (page << PAGE_SHIFT);
 			ret = mem->virt_base + (page << PAGE_SHIFT);
-			memset(ret, 0, size);
+			memset((void __force *)ret, 0, size);
 			return ret;
 		}
 		if (mem->flags & DMA_MEMORY_EXCLUSIVE)
@@ -46,17 +46,17 @@
 	if (dev == NULL || (dev->coherent_dma_mask < 0xffffffff))
 		gfp |= GFP_DMA;
 
-	ret = (void *)__get_free_pages(gfp, order);
+	ret = (void __iomem *)__get_free_pages(gfp, order);
 
 	if (ret != NULL) {
-		memset(ret, 0, size);
-		*dma_handle = virt_to_phys(ret);
+		memset((void __force *)ret, 0, size);
+		*dma_handle = virt_to_phys((volatile void __force *)ret);
 	}
 	return ret;
 }
 
 void dma_free_coherent(struct device *dev, size_t size,
-			 void *vaddr, dma_addr_t dma_handle)
+			 void __iomem *vaddr, dma_addr_t dma_handle)
 {
 	struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL;
 	int order = get_order(size);
@@ -128,7 +128,7 @@
 }
 EXPORT_SYMBOL(dma_release_declared_memory);
 
-void *dma_mark_declared_memory_occupied(struct device *dev,
+void __iomem *dma_mark_declared_memory_occupied(struct device *dev,
 					dma_addr_t device_addr, size_t size)
 {
 	struct dma_coherent_mem *mem = dev->dma_mem;
@@ -136,12 +136,12 @@
 	int pos, err;
 
 	if (!mem)
-		return ERR_PTR(-EINVAL);
+		return (void __iomem *)ERR_PTR(-EINVAL);
 
 	pos = (device_addr - mem->device_base) >> PAGE_SHIFT;
 	err = bitmap_allocate_region(mem->bitmap, pos, get_order(pages));
 	if (err != 0)
-		return ERR_PTR(err);
+		return (void __iomem *)ERR_PTR(err);
 	return mem->virt_base + (pos << PAGE_SHIFT);
 }
 EXPORT_SYMBOL(dma_mark_declared_memory_occupied);
===== drivers/base/dmapool.c 1.22 vs edited =====
--- 1.22/drivers/base/dmapool.c	2004-06-30 17:57:24 +02:00
+++ edited/drivers/base/dmapool.c	2005-02-15 23:13:07 +01:00
@@ -28,7 +28,7 @@
 
 struct dma_page {	/* cacheable header for 'allocation' bytes */
 	struct list_head	page_list;
-	void			*vaddr;
+	void __iomem		*vaddr;
 	dma_addr_t		dma;
 	unsigned		in_use;
 	unsigned long		bitmap [0];
@@ -175,7 +175,7 @@
 	if (page->vaddr) {
 		memset (page->bitmap, 0xff, mapsize);	// bit set == free
 #ifdef	CONFIG_DEBUG_SLAB
-		memset (page->vaddr, POOL_POISON_FREED, pool->allocation);
+		memset ((void __force *)page->vaddr, POOL_POISON_FREED, pool->allocation);
 #endif
 		list_add (&page->page_list, &pool->page_list);
 		page->in_use = 0;
@@ -204,7 +204,7 @@
 	dma_addr_t	dma = page->dma;
 
 #ifdef	CONFIG_DEBUG_SLAB
-	memset (page->vaddr, POOL_POISON_FREED, pool->allocation);
+	memset ((void __force *)page->vaddr, POOL_POISON_FREED, pool->allocation);
 #endif
 	dma_free_coherent (pool->dev, pool->allocation, page->vaddr, dma);
 	list_del (&page->page_list);
@@ -261,14 +261,14 @@
  * and reports its dma address through the handle.
  * If such a memory block can't be allocated, null is returned.
  */
-void *
+void __iomem *
 dma_pool_alloc (struct dma_pool *pool, int mem_flags, dma_addr_t *handle)
 {
 	unsigned long		flags;
 	struct dma_page		*page;
 	int			map, block;
 	size_t			offset;
-	void			*retval;
+	void __iomem		*retval;
 
 restart:
 	spin_lock_irqsave (&pool->lock, flags);
@@ -313,7 +313,7 @@
 	retval = offset + page->vaddr;
 	*handle = offset + page->dma;
 #ifdef	CONFIG_DEBUG_SLAB
-	memset (retval, POOL_POISON_ALLOCATED, pool->size);
+	memset ((void __force *)retval, POOL_POISON_ALLOCATED, pool->size);
 #endif
 done:
 	spin_unlock_irqrestore (&pool->lock, flags);
@@ -351,7 +351,7 @@
  * unless it is first re-allocated.
  */
 void
-dma_pool_free (struct dma_pool *pool, void *vaddr, dma_addr_t dma)
+dma_pool_free (struct dma_pool *pool, void __iomem *vaddr, dma_addr_t dma)
 {
 	struct dma_page		*page;
 	unsigned long		flags;
@@ -373,7 +373,7 @@
 	block %= BITS_PER_LONG;
 
 #ifdef	CONFIG_DEBUG_SLAB
-	if (((dma - page->dma) + (void *)page->vaddr) != vaddr) {
+	if (((dma - page->dma) + page->vaddr) != vaddr) {
 		if (pool->dev)
 			dev_err(pool->dev, "dma_pool_free %s, %p (bad vaddr)/%Lx\n",
 				pool->name, vaddr, (unsigned long long) dma);
@@ -391,7 +391,7 @@
 				pool->name, (unsigned long long)dma);
 		return;
 	}
-	memset (vaddr, POOL_POISON_FREED, pool->size);
+	memset ((void __force *)vaddr, POOL_POISON_FREED, pool->size);
 #endif
 
 	spin_lock_irqsave (&pool->lock, flags);
===== fs/proc/base.c 1.88 vs edited =====
--- 1.88/fs/proc/base.c	2005-01-31 07:33:47 +01:00
+++ edited/fs/proc/base.c	2005-02-15 16:50:53 +01:00
@@ -689,7 +689,7 @@
 	.open		= mem_open,
 };
 
-static ssize_t oom_adjust_read(struct file *file, char *buf,
+static ssize_t oom_adjust_read(struct file *file, char __user *buf,
 				size_t count, loff_t *ppos)
 {
 	struct task_struct *task = proc_task(file->f_dentry->d_inode);
@@ -709,7 +709,7 @@
 	return count;
 }
 
-static ssize_t oom_adjust_write(struct file *file, const char *buf,
+static ssize_t oom_adjust_write(struct file *file, const char __user *buf,
 				size_t count, loff_t *ppos)
 {
 	struct task_struct *task = proc_task(file->f_dentry->d_inode);
@@ -735,8 +735,8 @@
 }
 
 static struct file_operations proc_oom_adjust_operations = {
-	read:		oom_adjust_read,
-	write:		oom_adjust_write,
+	.read		= oom_adjust_read,
+	.write		= oom_adjust_write,
 };
 
 static struct inode_operations proc_mem_inode_operations = {
===== include/asm-generic/pci-dma-compat.h 1.6 vs edited =====
--- 1.6/include/asm-generic/pci-dma-compat.h	2004-03-23 19:12:38 +01:00
+++ edited/include/asm-generic/pci-dma-compat.h	2005-02-15 19:22:15 +01:00
@@ -15,7 +15,7 @@
 	return dma_supported(hwdev == NULL ? NULL : &hwdev->dev, mask);
 }
 
-static inline void *
+static inline void __iomem *
 pci_alloc_consistent(struct pci_dev *hwdev, size_t size,
 		     dma_addr_t *dma_handle)
 {
@@ -24,7 +24,7 @@
 
 static inline void
 pci_free_consistent(struct pci_dev *hwdev, size_t size,
-		    void *vaddr, dma_addr_t dma_handle)
+		    void __iomem *vaddr, dma_addr_t dma_handle)
 {
 	dma_free_coherent(hwdev == NULL ? NULL : &hwdev->dev, size, vaddr, dma_handle);
 }
===== include/linux/dmapool.h 1.1 vs edited =====
--- 1.1/include/linux/dmapool.h	2004-01-30 13:20:30 +01:00
+++ edited/include/linux/dmapool.h	2005-02-15 23:11:33 +01:00
@@ -19,9 +19,9 @@
 
 void dma_pool_destroy(struct dma_pool *pool);
 
-void *dma_pool_alloc(struct dma_pool *pool, int mem_flags, dma_addr_t *handle);
+void __iomem *dma_pool_alloc(struct dma_pool *pool, int mem_flags, dma_addr_t *handle);
 
-void dma_pool_free(struct dma_pool *pool, void *vaddr, dma_addr_t addr);
+void dma_pool_free(struct dma_pool *pool, void __iomem *vaddr, dma_addr_t addr);
 
 #endif
 
===== kernel/stop_machine.c 1.6 vs edited =====
--- 1.6/kernel/stop_machine.c	2005-01-08 06:44:05 +01:00
+++ edited/kernel/stop_machine.c	2005-02-15 22:20:08 +01:00
@@ -85,7 +85,7 @@
 static int stop_machine(void)
 {
 	int i, ret = 0;
-	struct sched_param param = { .sched_priority = MAX_RT_PRIO-1 };
+	struct sched_param __user param = { .sched_priority = MAX_RT_PRIO-1 };
 
 	/* One high-prio thread per cpu.  We'll do this one. */
 	sys_sched_setscheduler(current->pid, SCHED_FIFO, &param);



-- 
Peter Hagervall <hager@cs.umu.se>

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] Kill some sparse warnings
  2005-02-15 22:45 [PATCH] Kill some sparse warnings Peter Hagervall
@ 2005-02-15 22:52 ` Linus Torvalds
  2005-02-15 22:56 ` Russell King
  1 sibling, 0 replies; 4+ messages in thread
From: Linus Torvalds @ 2005-02-15 22:52 UTC (permalink / raw)
  To: Peter Hagervall; +Cc: linux-kernel



On Tue, 15 Feb 2005, Peter Hagervall wrote:
>
> Cleaned up some address space issues in:

I'm holding off these for now, but you might check with Al Viro, since 
he's got a ton in store for a post-2.6.11 merge.

		Linus

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] Kill some sparse warnings
  2005-02-15 22:45 [PATCH] Kill some sparse warnings Peter Hagervall
  2005-02-15 22:52 ` Linus Torvalds
@ 2005-02-15 22:56 ` Russell King
  2005-02-15 23:33   ` Peter Hagervall
  1 sibling, 1 reply; 4+ messages in thread
From: Russell King @ 2005-02-15 22:56 UTC (permalink / raw)
  To: Peter Hagervall; +Cc: linux-kernel, torvalds

On Tue, Feb 15, 2005 at 11:45:53PM +0100, Peter Hagervall wrote:
> Cleaned up some address space issues in:

This is wrong, and highlights a problem with the "remote" dma pool API.
dma_alloc_coherent() normally returns CPU-local memory, unless you've
declared remote memory, in which case it's __iomem-type memory.

Therefore, I don't think we want to mark the return value of
dma_alloc_coherent with __iomem, because in the vast majority of
cases, it isn't.

-- 
Russell King
 Linux kernel    2.6 ARM Linux   - http://www.arm.linux.org.uk/
 maintainer of:  2.6 PCMCIA      - http://pcmcia.arm.linux.org.uk/
                 2.6 Serial core

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] Kill some sparse warnings
  2005-02-15 22:56 ` Russell King
@ 2005-02-15 23:33   ` Peter Hagervall
  0 siblings, 0 replies; 4+ messages in thread
From: Peter Hagervall @ 2005-02-15 23:33 UTC (permalink / raw)
  To: Russell King; +Cc: linux-kernel

On Tue, Feb 15, 2005 at 10:56:56PM +0000, Russell King wrote:
> On Tue, Feb 15, 2005 at 11:45:53PM +0100, Peter Hagervall wrote:
> > Cleaned up some address space issues in:
> 
> This is wrong, and highlights a problem with the "remote" dma pool API.
> dma_alloc_coherent() normally returns CPU-local memory, unless you've
> declared remote memory, in which case it's __iomem-type memory.
> 
> Therefore, I don't think we want to mark the return value of
> dma_alloc_coherent with __iomem, because in the vast majority of
> cases, it isn't.

Doh! My bad, I changed the attribute for the return value to get it on
par with the dma-mapping.h file, which as it turned out, was changed
by myself some time ago.

An aonther issue, what I'd like to see, is sort of a "don't care"
attribute which could be used to mark some of the library functions,
e.g. memset and family. AFAICS, many of them shouldn't need to care what
address space they're handling, and at the same time we could get rid of
a lot of the __force casts. Please correct me if this sounds completely
wrong or otherwise insane.

Any other comments welcome.

-- 
Peter Hagervall <hager@cs.umu.se>

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2005-02-15 23:33 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-02-15 22:45 [PATCH] Kill some sparse warnings Peter Hagervall
2005-02-15 22:52 ` Linus Torvalds
2005-02-15 22:56 ` Russell King
2005-02-15 23:33   ` Peter Hagervall

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.