svn commit: r216950 - in projects/ofed/head/sys: conf
ofed/drivers/infiniband/core ofed/drivers/infiniband/hw/mlx4
ofed/include/linux
Jeff Roberson
jeff at FreeBSD.org
Tue Jan 4 05:35:44 UTC 2011
Author: jeff
Date: Tue Jan 4 05:35:44 2011
New Revision: 216950
URL: http://svn.freebsd.org/changeset/base/216950
Log:
- Enable write combining memory attribute support in mmap and ioremap.
- Add the write-combine source file for mlx4 back to the build.
- Set pages to dirty when releasing umem maps.
Sponsored by: Isilon Systems, iX Systems, and Panasas.
Modified:
projects/ofed/head/sys/conf/files
projects/ofed/head/sys/ofed/drivers/infiniband/core/umem.c
projects/ofed/head/sys/ofed/drivers/infiniband/hw/mlx4/main.c
projects/ofed/head/sys/ofed/drivers/infiniband/hw/mlx4/wc.h
projects/ofed/head/sys/ofed/include/linux/io-mapping.h
projects/ofed/head/sys/ofed/include/linux/io.h
projects/ofed/head/sys/ofed/include/linux/linux_compat.c
projects/ofed/head/sys/ofed/include/linux/page.h
Modified: projects/ofed/head/sys/conf/files
==============================================================================
--- projects/ofed/head/sys/conf/files Tue Jan 4 05:35:19 2011 (r216949)
+++ projects/ofed/head/sys/conf/files Tue Jan 4 05:35:44 2011 (r216950)
@@ -2893,9 +2893,9 @@ ofed/drivers/infiniband/hw/mlx4/qp.c op
ofed/drivers/infiniband/hw/mlx4/srq.c optional mlx4 \
no-depend obj-prefix "mlx4ib_" \
compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/infiniband/hw/mlx4/"
-#ofed/drivers/infiniband/hw/mlx4/wc.c optional mlx4 \
-# no-depend obj-prefix "mlx4ib_" \
-# compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/infiniband/hw/mlx4/"
+ofed/drivers/infiniband/hw/mlx4/wc.c optional mlx4 \
+ no-depend obj-prefix "mlx4ib_" \
+ compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/infiniband/hw/mlx4/"
ofed/drivers/net/mlx4/alloc.c optional mlx4 \
no-depend obj-prefix "mlx4_" \
compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/"
Modified: projects/ofed/head/sys/ofed/drivers/infiniband/core/umem.c
==============================================================================
--- projects/ofed/head/sys/ofed/drivers/infiniband/core/umem.c Tue Jan 4 05:35:19 2011 (r216949)
+++ projects/ofed/head/sys/ofed/drivers/infiniband/core/umem.c Tue Jan 4 05:35:44 2011 (r216950)
@@ -46,9 +46,9 @@
#include <vm/vm.h>
#include <vm/vm_map.h>
+#include <vm/vm_object.h>
#include <vm/vm_pageout.h>
-
#include "uverbs.h"
static int allow_weak_ordering;
@@ -112,6 +112,7 @@ static void dma_unmap_sg_ia64(struct ib_
static void __ib_umem_release(struct ib_device *dev, struct ib_umem *umem, int dirty)
{
+#ifdef __linux__
struct ib_umem_chunk *chunk, *tmp;
int i;
@@ -119,17 +120,40 @@ static void __ib_umem_release(struct ib_
ib_dma_unmap_sg_attrs(dev, chunk->page_list,
chunk->nents, DMA_BIDIRECTIONAL, &chunk->attrs);
for (i = 0; i < chunk->nents; ++i) {
-#ifdef __linux__
- /* XXX I need to set the proper page flags here too. */
struct page *page = sg_page(&chunk->page_list[i]);
if (umem->writable && dirty)
set_page_dirty_lock(page);
put_page(page);
-#endif
}
+ kfree(chunk);
+ }
+#else
+ struct ib_umem_chunk *chunk, *tmp;
+ vm_object_t object;
+ int i;
+ object = NULL;
+ list_for_each_entry_safe(chunk, tmp, &umem->chunk_list, list) {
+ ib_dma_unmap_sg_attrs(dev, chunk->page_list,
+ chunk->nents, DMA_BIDIRECTIONAL, &chunk->attrs);
+ for (i = 0; i < chunk->nents; ++i) {
+ struct page *page = sg_page(&chunk->page_list[i]);
+ if (umem->writable && dirty) {
+ if (object && object != page->object)
+ VM_OBJECT_UNLOCK(object);
+ if (object != page->object) {
+ object = page->object;
+ VM_OBJECT_LOCK(object);
+ }
+ vm_page_dirty(page);
+ }
+ }
kfree(chunk);
}
+ if (object)
+ VM_OBJECT_UNLOCK(object);
+
+#endif
}
/**
@@ -469,7 +493,6 @@ void ib_umem_release(struct ib_umem *ume
int error;
__ib_umem_release(umem->context->device, umem, 1);
-
if (umem->context->closing) {
kfree(umem);
return;
Modified: projects/ofed/head/sys/ofed/drivers/infiniband/hw/mlx4/main.c
==============================================================================
--- projects/ofed/head/sys/ofed/drivers/infiniband/hw/mlx4/main.c Tue Jan 4 05:35:19 2011 (r216949)
+++ projects/ofed/head/sys/ofed/drivers/infiniband/hw/mlx4/main.c Tue Jan 4 05:35:44 2011 (r216950)
@@ -522,7 +522,6 @@ static struct ib_ucontext *mlx4_ib_alloc
resp.qp_tab_size = dev->dev->caps.num_qps;
-#ifdef __linux__
if (mlx4_wc_enabled()) {
resp.bf_reg_size = dev->dev->caps.bf_reg_size;
resp.bf_regs_per_page = dev->dev->caps.bf_regs_per_page;
@@ -530,10 +529,6 @@ static struct ib_ucontext *mlx4_ib_alloc
resp.bf_reg_size = 0;
resp.bf_regs_per_page = 0;
}
-#else
- resp.bf_reg_size = 0;
- resp.bf_regs_per_page = 0;
-#endif
context = kzalloc(sizeof *context, GFP_KERNEL);
if (!context)
Modified: projects/ofed/head/sys/ofed/drivers/infiniband/hw/mlx4/wc.h
==============================================================================
--- projects/ofed/head/sys/ofed/drivers/infiniband/hw/mlx4/wc.h Tue Jan 4 05:35:19 2011 (r216949)
+++ projects/ofed/head/sys/ofed/drivers/infiniband/hw/mlx4/wc.h Tue Jan 4 05:35:44 2011 (r216950)
@@ -36,8 +36,6 @@
#include <asm/pgtable.h>
int mlx4_wc_enabled(void);
-#ifdef __linux__
pgprot_t pgprot_wc(pgprot_t _prot);
-#endif
#endif
Modified: projects/ofed/head/sys/ofed/include/linux/io-mapping.h
==============================================================================
--- projects/ofed/head/sys/ofed/include/linux/io-mapping.h Tue Jan 4 05:35:19 2011 (r216949)
+++ projects/ofed/head/sys/ofed/include/linux/io-mapping.h Tue Jan 4 05:35:44 2011 (r216950)
@@ -37,11 +37,8 @@ struct io_mapping;
static inline struct io_mapping *
io_mapping_create_wc(resource_size_t base, unsigned long size)
{
- struct io_mapping *map;
- map = ioremap(base, size);
- /* XXX Set write combine. */
- return (map);
+ return ioremap_wc(base, size);
}
static inline void
Modified: projects/ofed/head/sys/ofed/include/linux/io.h
==============================================================================
--- projects/ofed/head/sys/ofed/include/linux/io.h Tue Jan 4 05:35:19 2011 (r216949)
+++ projects/ofed/head/sys/ofed/include/linux/io.h Tue Jan 4 05:35:44 2011 (r216950)
@@ -29,6 +29,8 @@
#ifndef _LINUX_IO_H_
#define _LINUX_IO_H_
+#include <machine/vm.h>
+
static inline uint32_t
__raw_readl(const volatile void *addr)
{
@@ -86,7 +88,12 @@ writew(uint16_t b, void *addr)
*(volatile uint16_t *)addr = b;
}
-void *ioremap(vm_paddr_t phys_addr, unsigned long size);
+void *_ioremap_attr(vm_paddr_t phys_addr, unsigned long size, int attr);
+#define ioremap_nocache(addr, size) \
+ _ioremap_attr((addr), (size), VM_MEMATTR_UNCACHED)
+#define ioremap_wc(addr, size) \
+ _ioremap_attr((addr), (size), VM_MEMATTR_WRITE_COMBINING)
+#define ioremap ioremap_nocache
void iounmap(void *addr);
#define memset_io(a, b, c) memset((a), (b), (c))
Modified: projects/ofed/head/sys/ofed/include/linux/linux_compat.c
==============================================================================
--- projects/ofed/head/sys/ofed/include/linux/linux_compat.c Tue Jan 4 05:35:19 2011 (r216949)
+++ projects/ofed/head/sys/ofed/include/linux/linux_compat.c Tue Jan 4 05:35:44 2011 (r216950)
@@ -436,6 +436,8 @@ linux_dev_mmap_single(struct cdev *dev,
PAGE_SIZE, nprot, *offset, curthread->td_ucred);
if (*object == NULL)
return (EINVAL);
+ if (vma.vm_page_prot != VM_MEMATTR_DEFAULT)
+ pmap_page_set_memattr(m, vma.vm_page_prot);
}
} else
error = ENODEV;
@@ -578,12 +580,12 @@ static struct iomaphd iomaphead[IOMAP_HA
static struct mtx iomaplock;
void *
-ioremap(vm_paddr_t phys_addr, unsigned long size)
+_ioremap_attr(vm_paddr_t phys_addr, unsigned long size, int attr)
{
struct iomap *iomap;
void *addr;
- addr = pmap_mapdev(phys_addr, size);
+ addr = pmap_mapdev_attr(phys_addr, size, attr);
if (addr == NULL)
return (NULL);
iomap = kmalloc(sizeof(*iomap), GFP_KERNEL);
Modified: projects/ofed/head/sys/ofed/include/linux/page.h
==============================================================================
--- projects/ofed/head/sys/ofed/include/linux/page.h Tue Jan 4 05:35:19 2011 (r216949)
+++ projects/ofed/head/sys/ofed/include/linux/page.h Tue Jan 4 05:35:44 2011 (r216950)
@@ -39,9 +39,9 @@
#define virt_to_page(x) PHYS_TO_VM_PAGE(vtophys((x)))
-#define clear_page(page) memset((page), 0, PAGE_SIZE)
-#define pgprot_noncached(prot) VM_MEMATTR_UNCACHED
-#define pgprot_wc(prot) VM_MEMATTR_WRITE_COMBINING
+#define clear_page(page) memset((page), 0, PAGE_SIZE)
+#define pgprot_noncached(prot) VM_MEMATTR_UNCACHED
+#define pgprot_writecombine(prot) VM_MEMATTR_WRITE_COMBINING
#undef PAGE_MASK
#define PAGE_MASK (~(PAGE_SIZE-1))
More information about the svn-src-projects
mailing list