diff options
author | Jakub Kicinski <jakub.kicinski@netronome.com> | 2016-04-07 14:39:38 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-04-08 15:26:04 -0400 |
commit | 73725d9dfd99c5bb1da4d25bbe980231aa48d251 (patch) | |
tree | 8cf252700bb4ce02d966b6c9b106265fb76273e9 | |
parent | d79737c25e4a170e7cd75866e45042de746934d8 (diff) |
nfp: allocate ring SW structs dynamically
To be able to switch rings more easily on config changes
allocate them dynamically, separately from nfp_net structure.
Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/netronome/nfp/nfp_net.h | 6 | ||||
-rw-r--r-- | drivers/net/ethernet/netronome/nfp/nfp_net_common.c | 28 | ||||
-rw-r--r-- | drivers/net/ethernet/netronome/nfp/nfp_net_debugfs.c | 20 |
3 files changed, 37 insertions, 17 deletions
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net.h b/drivers/net/ethernet/netronome/nfp/nfp_net.h index 75683fb26734..fc005c982b7d 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net.h +++ b/drivers/net/ethernet/netronome/nfp/nfp_net.h | |||
@@ -472,6 +472,9 @@ struct nfp_net { | |||
472 | 472 | ||
473 | u32 rx_offset; | 473 | u32 rx_offset; |
474 | 474 | ||
475 | struct nfp_net_tx_ring *tx_rings; | ||
476 | struct nfp_net_rx_ring *rx_rings; | ||
477 | |||
475 | #ifdef CONFIG_PCI_IOV | 478 | #ifdef CONFIG_PCI_IOV |
476 | unsigned int num_vfs; | 479 | unsigned int num_vfs; |
477 | struct vf_data_storage *vfinfo; | 480 | struct vf_data_storage *vfinfo; |
@@ -504,9 +507,6 @@ struct nfp_net { | |||
504 | int txd_cnt; | 507 | int txd_cnt; |
505 | int rxd_cnt; | 508 | int rxd_cnt; |
506 | 509 | ||
507 | struct nfp_net_tx_ring tx_rings[NFP_NET_MAX_TX_RINGS]; | ||
508 | struct nfp_net_rx_ring rx_rings[NFP_NET_MAX_RX_RINGS]; | ||
509 | |||
510 | u8 num_irqs; | 510 | u8 num_irqs; |
511 | u8 num_r_vecs; | 511 | u8 num_r_vecs; |
512 | struct nfp_net_r_vector r_vecs[NFP_NET_MAX_TX_RINGS]; | 512 | struct nfp_net_r_vector r_vecs[NFP_NET_MAX_TX_RINGS]; |
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c index 7cd20fcd631a..66fab7162b7c 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c | |||
@@ -413,12 +413,6 @@ static void nfp_net_irqs_assign(struct net_device *netdev) | |||
413 | r_vec->irq_idx = NFP_NET_NON_Q_VECTORS + r; | 413 | r_vec->irq_idx = NFP_NET_NON_Q_VECTORS + r; |
414 | 414 | ||
415 | cpumask_set_cpu(r, &r_vec->affinity_mask); | 415 | cpumask_set_cpu(r, &r_vec->affinity_mask); |
416 | |||
417 | r_vec->tx_ring = &nn->tx_rings[r]; | ||
418 | nfp_net_tx_ring_init(r_vec->tx_ring, r_vec, r); | ||
419 | |||
420 | r_vec->rx_ring = &nn->rx_rings[r]; | ||
421 | nfp_net_rx_ring_init(r_vec->rx_ring, r_vec, r); | ||
422 | } | 416 | } |
423 | } | 417 | } |
424 | 418 | ||
@@ -1503,6 +1497,12 @@ nfp_net_prepare_vector(struct nfp_net *nn, struct nfp_net_r_vector *r_vec, | |||
1503 | struct msix_entry *entry = &nn->irq_entries[r_vec->irq_idx]; | 1497 | struct msix_entry *entry = &nn->irq_entries[r_vec->irq_idx]; |
1504 | int err; | 1498 | int err; |
1505 | 1499 | ||
1500 | r_vec->tx_ring = &nn->tx_rings[idx]; | ||
1501 | nfp_net_tx_ring_init(r_vec->tx_ring, r_vec, idx); | ||
1502 | |||
1503 | r_vec->rx_ring = &nn->rx_rings[idx]; | ||
1504 | nfp_net_rx_ring_init(r_vec->rx_ring, r_vec, idx); | ||
1505 | |||
1506 | snprintf(r_vec->name, sizeof(r_vec->name), | 1506 | snprintf(r_vec->name, sizeof(r_vec->name), |
1507 | "%s-rxtx-%d", nn->netdev->name, idx); | 1507 | "%s-rxtx-%d", nn->netdev->name, idx); |
1508 | err = request_irq(entry->vector, r_vec->handler, 0, r_vec->name, r_vec); | 1508 | err = request_irq(entry->vector, r_vec->handler, 0, r_vec->name, r_vec); |
@@ -1693,6 +1693,15 @@ static int nfp_net_netdev_open(struct net_device *netdev) | |||
1693 | goto err_free_exn; | 1693 | goto err_free_exn; |
1694 | disable_irq(nn->irq_entries[NFP_NET_CFG_LSC].vector); | 1694 | disable_irq(nn->irq_entries[NFP_NET_CFG_LSC].vector); |
1695 | 1695 | ||
1696 | nn->rx_rings = kcalloc(nn->num_rx_rings, sizeof(*nn->rx_rings), | ||
1697 | GFP_KERNEL); | ||
1698 | if (!nn->rx_rings) | ||
1699 | goto err_free_lsc; | ||
1700 | nn->tx_rings = kcalloc(nn->num_tx_rings, sizeof(*nn->tx_rings), | ||
1701 | GFP_KERNEL); | ||
1702 | if (!nn->tx_rings) | ||
1703 | goto err_free_rx_rings; | ||
1704 | |||
1696 | for (r = 0; r < nn->num_r_vecs; r++) { | 1705 | for (r = 0; r < nn->num_r_vecs; r++) { |
1697 | err = nfp_net_prepare_vector(nn, &nn->r_vecs[r], r); | 1706 | err = nfp_net_prepare_vector(nn, &nn->r_vecs[r], r); |
1698 | if (err) | 1707 | if (err) |
@@ -1807,6 +1816,10 @@ err_free_tx_ring_p: | |||
1807 | err_cleanup_vec_p: | 1816 | err_cleanup_vec_p: |
1808 | nfp_net_cleanup_vector(nn, &nn->r_vecs[r]); | 1817 | nfp_net_cleanup_vector(nn, &nn->r_vecs[r]); |
1809 | } | 1818 | } |
1819 | kfree(nn->tx_rings); | ||
1820 | err_free_rx_rings: | ||
1821 | kfree(nn->rx_rings); | ||
1822 | err_free_lsc: | ||
1810 | nfp_net_aux_irq_free(nn, NFP_NET_CFG_LSC, NFP_NET_IRQ_LSC_IDX); | 1823 | nfp_net_aux_irq_free(nn, NFP_NET_CFG_LSC, NFP_NET_IRQ_LSC_IDX); |
1811 | err_free_exn: | 1824 | err_free_exn: |
1812 | nfp_net_aux_irq_free(nn, NFP_NET_CFG_EXN, NFP_NET_IRQ_EXN_IDX); | 1825 | nfp_net_aux_irq_free(nn, NFP_NET_CFG_EXN, NFP_NET_IRQ_EXN_IDX); |
@@ -1852,6 +1865,9 @@ static int nfp_net_netdev_close(struct net_device *netdev) | |||
1852 | nfp_net_cleanup_vector(nn, &nn->r_vecs[r]); | 1865 | nfp_net_cleanup_vector(nn, &nn->r_vecs[r]); |
1853 | } | 1866 | } |
1854 | 1867 | ||
1868 | kfree(nn->rx_rings); | ||
1869 | kfree(nn->tx_rings); | ||
1870 | |||
1855 | nfp_net_aux_irq_free(nn, NFP_NET_CFG_LSC, NFP_NET_IRQ_LSC_IDX); | 1871 | nfp_net_aux_irq_free(nn, NFP_NET_CFG_LSC, NFP_NET_IRQ_LSC_IDX); |
1856 | nfp_net_aux_irq_free(nn, NFP_NET_CFG_EXN, NFP_NET_IRQ_EXN_IDX); | 1872 | nfp_net_aux_irq_free(nn, NFP_NET_CFG_EXN, NFP_NET_IRQ_EXN_IDX); |
1857 | 1873 | ||
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_debugfs.c b/drivers/net/ethernet/netronome/nfp/nfp_net_debugfs.c index 4c97c713121c..f86a1f13d27b 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net_debugfs.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_debugfs.c | |||
@@ -40,8 +40,9 @@ static struct dentry *nfp_dir; | |||
40 | 40 | ||
41 | static int nfp_net_debugfs_rx_q_read(struct seq_file *file, void *data) | 41 | static int nfp_net_debugfs_rx_q_read(struct seq_file *file, void *data) |
42 | { | 42 | { |
43 | struct nfp_net_rx_ring *rx_ring = file->private; | ||
44 | int fl_rd_p, fl_wr_p, rx_rd_p, rx_wr_p, rxd_cnt; | 43 | int fl_rd_p, fl_wr_p, rx_rd_p, rx_wr_p, rxd_cnt; |
44 | struct nfp_net_r_vector *r_vec = file->private; | ||
45 | struct nfp_net_rx_ring *rx_ring; | ||
45 | struct nfp_net_rx_desc *rxd; | 46 | struct nfp_net_rx_desc *rxd; |
46 | struct sk_buff *skb; | 47 | struct sk_buff *skb; |
47 | struct nfp_net *nn; | 48 | struct nfp_net *nn; |
@@ -49,9 +50,10 @@ static int nfp_net_debugfs_rx_q_read(struct seq_file *file, void *data) | |||
49 | 50 | ||
50 | rtnl_lock(); | 51 | rtnl_lock(); |
51 | 52 | ||
52 | if (!rx_ring->r_vec || !rx_ring->r_vec->nfp_net) | 53 | if (!r_vec->nfp_net || !r_vec->rx_ring) |
53 | goto out; | 54 | goto out; |
54 | nn = rx_ring->r_vec->nfp_net; | 55 | nn = r_vec->nfp_net; |
56 | rx_ring = r_vec->rx_ring; | ||
55 | if (!netif_running(nn->netdev)) | 57 | if (!netif_running(nn->netdev)) |
56 | goto out; | 58 | goto out; |
57 | 59 | ||
@@ -115,7 +117,8 @@ static const struct file_operations nfp_rx_q_fops = { | |||
115 | 117 | ||
116 | static int nfp_net_debugfs_tx_q_read(struct seq_file *file, void *data) | 118 | static int nfp_net_debugfs_tx_q_read(struct seq_file *file, void *data) |
117 | { | 119 | { |
118 | struct nfp_net_tx_ring *tx_ring = file->private; | 120 | struct nfp_net_r_vector *r_vec = file->private; |
121 | struct nfp_net_tx_ring *tx_ring; | ||
119 | struct nfp_net_tx_desc *txd; | 122 | struct nfp_net_tx_desc *txd; |
120 | int d_rd_p, d_wr_p, txd_cnt; | 123 | int d_rd_p, d_wr_p, txd_cnt; |
121 | struct sk_buff *skb; | 124 | struct sk_buff *skb; |
@@ -124,9 +127,10 @@ static int nfp_net_debugfs_tx_q_read(struct seq_file *file, void *data) | |||
124 | 127 | ||
125 | rtnl_lock(); | 128 | rtnl_lock(); |
126 | 129 | ||
127 | if (!tx_ring->r_vec || !tx_ring->r_vec->nfp_net) | 130 | if (!r_vec->nfp_net || !r_vec->tx_ring) |
128 | goto out; | 131 | goto out; |
129 | nn = tx_ring->r_vec->nfp_net; | 132 | nn = r_vec->nfp_net; |
133 | tx_ring = r_vec->tx_ring; | ||
130 | if (!netif_running(nn->netdev)) | 134 | if (!netif_running(nn->netdev)) |
131 | goto out; | 135 | goto out; |
132 | 136 | ||
@@ -207,13 +211,13 @@ void nfp_net_debugfs_adapter_add(struct nfp_net *nn) | |||
207 | for (i = 0; i < nn->num_rx_rings; i++) { | 211 | for (i = 0; i < nn->num_rx_rings; i++) { |
208 | sprintf(int_name, "%d", i); | 212 | sprintf(int_name, "%d", i); |
209 | debugfs_create_file(int_name, S_IRUSR, rx, | 213 | debugfs_create_file(int_name, S_IRUSR, rx, |
210 | &nn->rx_rings[i], &nfp_rx_q_fops); | 214 | &nn->r_vecs[i], &nfp_rx_q_fops); |
211 | } | 215 | } |
212 | 216 | ||
213 | for (i = 0; i < nn->num_tx_rings; i++) { | 217 | for (i = 0; i < nn->num_tx_rings; i++) { |
214 | sprintf(int_name, "%d", i); | 218 | sprintf(int_name, "%d", i); |
215 | debugfs_create_file(int_name, S_IRUSR, tx, | 219 | debugfs_create_file(int_name, S_IRUSR, tx, |
216 | &nn->tx_rings[i], &nfp_tx_q_fops); | 220 | &nn->r_vecs[i], &nfp_tx_q_fops); |
217 | } | 221 | } |
218 | } | 222 | } |
219 | 223 | ||