aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/icm.c42
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/main.c1
-rw-r--r--include/linux/mlx4/device.h1
3 files changed, 32 insertions, 12 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/icm.c b/drivers/net/ethernet/mellanox/mlx4/icm.c
index 31d02649be41..5fbf4924c272 100644
--- a/drivers/net/ethernet/mellanox/mlx4/icm.c
+++ b/drivers/net/ethernet/mellanox/mlx4/icm.c
@@ -93,13 +93,17 @@ void mlx4_free_icm(struct mlx4_dev *dev, struct mlx4_icm *icm, int coherent)
93 kfree(icm); 93 kfree(icm);
94} 94}
95 95
96static int mlx4_alloc_icm_pages(struct scatterlist *mem, int order, gfp_t gfp_mask) 96static int mlx4_alloc_icm_pages(struct scatterlist *mem, int order,
97 gfp_t gfp_mask, int node)
97{ 98{
98 struct page *page; 99 struct page *page;
99 100
100 page = alloc_pages(gfp_mask, order); 101 page = alloc_pages_node(node, gfp_mask, order);
101 if (!page) 102 if (!page) {
102 return -ENOMEM; 103 page = alloc_pages(gfp_mask, order);
104 if (!page)
105 return -ENOMEM;
106 }
103 107
104 sg_set_page(mem, page, PAGE_SIZE << order, 0); 108 sg_set_page(mem, page, PAGE_SIZE << order, 0);
105 return 0; 109 return 0;
@@ -130,9 +134,15 @@ struct mlx4_icm *mlx4_alloc_icm(struct mlx4_dev *dev, int npages,
130 /* We use sg_set_buf for coherent allocs, which assumes low memory */ 134 /* We use sg_set_buf for coherent allocs, which assumes low memory */
131 BUG_ON(coherent && (gfp_mask & __GFP_HIGHMEM)); 135 BUG_ON(coherent && (gfp_mask & __GFP_HIGHMEM));
132 136
133 icm = kmalloc(sizeof *icm, gfp_mask & ~(__GFP_HIGHMEM | __GFP_NOWARN)); 137 icm = kmalloc_node(sizeof(*icm),
134 if (!icm) 138 gfp_mask & ~(__GFP_HIGHMEM | __GFP_NOWARN),
135 return NULL; 139 dev->numa_node);
140 if (!icm) {
141 icm = kmalloc(sizeof(*icm),
142 gfp_mask & ~(__GFP_HIGHMEM | __GFP_NOWARN));
143 if (!icm)
144 return NULL;
145 }
136 146
137 icm->refcount = 0; 147 icm->refcount = 0;
138 INIT_LIST_HEAD(&icm->chunk_list); 148 INIT_LIST_HEAD(&icm->chunk_list);
@@ -141,10 +151,17 @@ struct mlx4_icm *mlx4_alloc_icm(struct mlx4_dev *dev, int npages,
141 151
142 while (npages > 0) { 152 while (npages > 0) {
143 if (!chunk) { 153 if (!chunk) {
144 chunk = kmalloc(sizeof *chunk, 154 chunk = kmalloc_node(sizeof(*chunk),
145 gfp_mask & ~(__GFP_HIGHMEM | __GFP_NOWARN)); 155 gfp_mask & ~(__GFP_HIGHMEM |
146 if (!chunk) 156 __GFP_NOWARN),
147 goto fail; 157 dev->numa_node);
158 if (!chunk) {
159 chunk = kmalloc(sizeof(*chunk),
160 gfp_mask & ~(__GFP_HIGHMEM |
161 __GFP_NOWARN));
162 if (!chunk)
163 goto fail;
164 }
148 165
149 sg_init_table(chunk->mem, MLX4_ICM_CHUNK_LEN); 166 sg_init_table(chunk->mem, MLX4_ICM_CHUNK_LEN);
150 chunk->npages = 0; 167 chunk->npages = 0;
@@ -161,7 +178,8 @@ struct mlx4_icm *mlx4_alloc_icm(struct mlx4_dev *dev, int npages,
161 cur_order, gfp_mask); 178 cur_order, gfp_mask);
162 else 179 else
163 ret = mlx4_alloc_icm_pages(&chunk->mem[chunk->npages], 180 ret = mlx4_alloc_icm_pages(&chunk->mem[chunk->npages],
164 cur_order, gfp_mask); 181 cur_order, gfp_mask,
182 dev->numa_node);
165 183
166 if (ret) { 184 if (ret) {
167 if (--cur_order < 0) 185 if (--cur_order < 0)
diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c
index 7d2628dfdc29..5789ea2c934d 100644
--- a/drivers/net/ethernet/mellanox/mlx4/main.c
+++ b/drivers/net/ethernet/mellanox/mlx4/main.c
@@ -2191,6 +2191,7 @@ static int __mlx4_init_one(struct pci_dev *pdev, int pci_dev_data)
2191 mutex_init(&priv->bf_mutex); 2191 mutex_init(&priv->bf_mutex);
2192 2192
2193 dev->rev_id = pdev->revision; 2193 dev->rev_id = pdev->revision;
2194 dev->numa_node = dev_to_node(&pdev->dev);
2194 /* Detect if this device is a virtual function */ 2195 /* Detect if this device is a virtual function */
2195 if (pci_dev_data & MLX4_PCI_DEV_IS_VF) { 2196 if (pci_dev_data & MLX4_PCI_DEV_IS_VF) {
2196 /* When acting as pf, we normally skip vfs unless explicitly 2197 /* When acting as pf, we normally skip vfs unless explicitly
diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h
index f6f59271f857..4cf0b0153639 100644
--- a/include/linux/mlx4/device.h
+++ b/include/linux/mlx4/device.h
@@ -662,6 +662,7 @@ struct mlx4_dev {
662 u8 rev_id; 662 u8 rev_id;
663 char board_id[MLX4_BOARD_ID_LEN]; 663 char board_id[MLX4_BOARD_ID_LEN];
664 int num_vfs; 664 int num_vfs;
665 int numa_node;
665 int oper_log_mgm_entry_size; 666 int oper_log_mgm_entry_size;
666 u64 regid_promisc_array[MLX4_MAX_PORTS + 1]; 667 u64 regid_promisc_array[MLX4_MAX_PORTS + 1];
667 u64 regid_allmulti_array[MLX4_MAX_PORTS + 1]; 668 u64 regid_allmulti_array[MLX4_MAX_PORTS + 1];