summaryrefslogtreecommitdiff
path: root/arch/ia64/sn/pci/pci_dma.c
diff options
context:
space:
mode:
authorJeff Garzik <jgarzik@pobox.com>2005-07-31 02:14:50 +0400
committerJeff Garzik <jgarzik@pobox.com>2005-07-31 02:14:50 +0400
commitde745fb27983770ebfdeaa70f8a36f791fb33786 (patch)
tree701555a1a7a2a5ff9a6c67896cf1ea089597750e /arch/ia64/sn/pci/pci_dma.c
parent08cd84c81f27d5bd22ba958b7cae6d566c509280 (diff)
parenta670fcb43f01a67ef56176afc76e5d43d128b25c (diff)
downloadlinux-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.c16
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);