vxge: Align the memory only if it is misaligned.
authorSreenivasa Honnur <Sreenivasa.Honnur@neterion.com>
Sun, 28 Mar 2010 22:09:47 +0000 (22:09 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 29 Mar 2010 23:57:21 +0000 (16:57 -0700)
- Align the memory only if it is misaligned.

Signed-off-by: Sreenivasa Honnur <sreenivasa.honnur@neterion.com>
Signed-off-by: Ramkrishna Vepa <ram.vepa@neterion.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/vxge/vxge-config.h

index e7877df..0159524 100644 (file)
@@ -1914,20 +1914,32 @@ static inline void *vxge_os_dma_malloc(struct pci_dev *pdev,
        gfp_t flags;
        void *vaddr;
        unsigned long misaligned = 0;
+       int realloc_flag = 0;
        *p_dma_acch = *p_dmah = NULL;
 
        if (in_interrupt())
                flags = GFP_ATOMIC | GFP_DMA;
        else
                flags = GFP_KERNEL | GFP_DMA;
-
-       size += VXGE_CACHE_LINE_SIZE;
-
+realloc:
        vaddr = kmalloc((size), flags);
        if (vaddr == NULL)
                return vaddr;
-       misaligned = (unsigned long)VXGE_ALIGN(*((u64 *)&vaddr),
+       misaligned = (unsigned long)VXGE_ALIGN((unsigned long)vaddr,
                                VXGE_CACHE_LINE_SIZE);
+       if (realloc_flag)
+               goto out;
+
+       if (misaligned) {
+               /* misaligned, free current one and try allocating
+                * size + VXGE_CACHE_LINE_SIZE memory
+                */
+               kfree((void *) vaddr);
+               size += VXGE_CACHE_LINE_SIZE;
+               realloc_flag = 1;
+               goto realloc;
+       }
+out:
        *(unsigned long *)p_dma_acch = misaligned;
        vaddr = (void *)((u8 *)vaddr + misaligned);
        return vaddr;