diff options
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/icm.c | 42 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/main.c | 1 | ||||
-rw-r--r-- | include/linux/mlx4/device.h | 1 |
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 | ||
96 | static int mlx4_alloc_icm_pages(struct scatterlist *mem, int order, gfp_t gfp_mask) | 96 | static 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]; |