]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
uio-hv-generic: store physical addresses instead of virtual
authorArnd Bergmann <arnd@arndb.de>
Fri, 9 Dec 2016 11:44:40 +0000 (12:44 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 10 Dec 2016 13:57:58 +0000 (14:57 +0100)
gcc warns about the newly added driver when phys_addr_t is wider than
a pointer:

drivers/uio/uio_hv_generic.c: In function 'hv_uio_mmap':
drivers/uio/uio_hv_generic.c:71:17: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]
    virt_to_phys((void *)info->mem[mi].addr) >> PAGE_SHIFT,
drivers/uio/uio_hv_generic.c: In function 'hv_uio_probe':
drivers/uio/uio_hv_generic.c:140:5: error: cast from pointer to integer of different size [-Werror=pointer-to-int-cast]
   = (phys_addr_t)dev->channel->ringbuffer_pages;
drivers/uio/uio_hv_generic.c:147:3: error: cast from pointer to integer of different size [-Werror=pointer-to-int-cast]
   (phys_addr_t)vmbus_connection.int_page;
drivers/uio/uio_hv_generic.c:153:3: error: cast from pointer to integer of different size [-Werror=pointer-to-int-cast]
   (phys_addr_t)vmbus_connection.monitor_pages[1];

I can't see why we store a virtual address in a phys_addr_t here,
as the only user of that variable converts it into a physical
address anyway, so this moves the conversion to where it logically
fits according to the types.

Fixes: 95096f2fbd10 ("uio-hv-generic: new userspace i/o driver for VMBus")
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Acked-by: Stephen Hemminger <sthemmin@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/uio/uio_hv_generic.c

index ad3ab5805ad81c11098660fe76268eeb9129be69..50958f167305317f3de1a361673cd3caf4f8f47b 100644 (file)
@@ -68,7 +68,7 @@ hv_uio_mmap(struct uio_info *info, struct vm_area_struct *vma)
        mi = (int)vma->vm_pgoff;
 
        return remap_pfn_range(vma, vma->vm_start,
-                       virt_to_phys((void *)info->mem[mi].addr) >> PAGE_SHIFT,
+                       info->mem[mi].addr >> PAGE_SHIFT,
                        vma->vm_end - vma->vm_start, vma->vm_page_prot);
 }
 
@@ -137,20 +137,20 @@ hv_uio_probe(struct hv_device *dev,
        /* mem resources */
        pdata->info.mem[TXRX_RING_MAP].name = "txrx_rings";
        pdata->info.mem[TXRX_RING_MAP].addr
-               = (phys_addr_t)dev->channel->ringbuffer_pages;
+               = virt_to_phys(dev->channel->ringbuffer_pages);
        pdata->info.mem[TXRX_RING_MAP].size
                = dev->channel->ringbuffer_pagecount * PAGE_SIZE;
        pdata->info.mem[TXRX_RING_MAP].memtype = UIO_MEM_LOGICAL;
 
        pdata->info.mem[INT_PAGE_MAP].name = "int_page";
        pdata->info.mem[INT_PAGE_MAP].addr =
-               (phys_addr_t)vmbus_connection.int_page;
+               virt_to_phys(vmbus_connection.int_page);
        pdata->info.mem[INT_PAGE_MAP].size = PAGE_SIZE;
        pdata->info.mem[INT_PAGE_MAP].memtype = UIO_MEM_LOGICAL;
 
        pdata->info.mem[MON_PAGE_MAP].name = "monitor_pages";
        pdata->info.mem[MON_PAGE_MAP].addr =
-               (phys_addr_t)vmbus_connection.monitor_pages[1];
+               virt_to_phys(vmbus_connection.monitor_pages[1]);
        pdata->info.mem[MON_PAGE_MAP].size = PAGE_SIZE;
        pdata->info.mem[MON_PAGE_MAP].memtype = UIO_MEM_LOGICAL;