diff options
| author | Eugenia Emantayev <eugenia@mellanox.com> | 2013-11-07 05:19:53 -0500 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2013-11-07 19:22:48 -0500 |
| commit | 6e7136ed7793fa4948b0192dcd6862d12a50d67c (patch) | |
| tree | fe23b4a06d76512b39a97010324f0a7bce489059 | |
| parent | 41d942d56cfd21058fba465804e14ba349541442 (diff) | |
net/mlx4_core: ICM pages are allocated on device NUMA node
This is done to optimize FW/HW access to host memory.
Signed-off-by: Yevgeny Petrilin <yevgenyp@mellanox.com>
Signed-off-by: Eugenia Emantayev <eugenia@mellanox.com>
Reviewed-by: Hadar Hen Zion <hadarh@mellanox.com>
Signed-off-by: Amir Vadai <amirv@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
| -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]; |
