diff options
author | Jeff Garzik <jgarzik@pobox.com> | 2005-07-31 02:14:50 +0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@pobox.com> | 2005-07-31 02:14:50 +0400 |
commit | de745fb27983770ebfdeaa70f8a36f791fb33786 (patch) | |
tree | 701555a1a7a2a5ff9a6c67896cf1ea089597750e /arch/ia64/sn/pci/pci_dma.c | |
parent | 08cd84c81f27d5bd22ba958b7cae6d566c509280 (diff) | |
parent | a670fcb43f01a67ef56176afc76e5d43d128b25c (diff) | |
download | linux-de745fb27983770ebfdeaa70f8a36f791fb33786.tar.xz |
/spare/repo/netdev-2.6 branch 'ieee80211'
Diffstat (limited to 'arch/ia64/sn/pci/pci_dma.c')
-rw-r--r-- | arch/ia64/sn/pci/pci_dma.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/arch/ia64/sn/pci/pci_dma.c b/arch/ia64/sn/pci/pci_dma.c index a2f7a88aefbb..0e4b9ad9ef02 100644 --- a/arch/ia64/sn/pci/pci_dma.c +++ b/arch/ia64/sn/pci/pci_dma.c @@ -79,6 +79,7 @@ void *sn_dma_alloc_coherent(struct device *dev, size_t size, { void *cpuaddr; unsigned long phys_addr; + int node; struct pci_dev *pdev = to_pci_dev(dev); struct sn_pcibus_provider *provider = SN_PCIDEV_BUSPROVIDER(pdev); @@ -86,10 +87,19 @@ void *sn_dma_alloc_coherent(struct device *dev, size_t size, /* * Allocate the memory. - * FIXME: We should be doing alloc_pages_node for the node closest - * to the PCI device. */ - if (!(cpuaddr = (void *)__get_free_pages(GFP_ATOMIC, get_order(size)))) + node = pcibus_to_node(pdev->bus); + if (likely(node >=0)) { + struct page *p = alloc_pages_node(node, GFP_ATOMIC, get_order(size)); + + if (likely(p)) + cpuaddr = page_address(p); + else + return NULL; + } else + cpuaddr = (void *)__get_free_pages(GFP_ATOMIC, get_order(size)); + + if (unlikely(!cpuaddr)) return NULL; memset(cpuaddr, 0x0, size); |