diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-11-10 13:07:50 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-11-10 13:07:50 -0500 |
commit | 1eb196c3c01f364d6cd3e8c0e16dc4702fdaffd9 (patch) | |
tree | 1b6ef1cd28b0f172a05e79f0406ab4504f83671b | |
parent | 041c79514af9080c75197078283134f538f46b44 (diff) | |
parent | fdcb4b2e78220bde95ce4ba3213088e3a1f1cec6 (diff) |
Merge tag 'ntb-4.4' of git://github.com/jonmason/ntb
Pull NTB bugfixes from Jon Mason:
"NTB Bug fixes for potential NULL pointer accesses, accesses of a freed
pointer, invalid buffer pointer, and a compiler warning.
Also, unification of upstream/downstream addresses"
* tag 'ntb-4.4' of git://github.com/jonmason/ntb:
NTB: fix 32-bit compiler warning
NTB: unify translation addresses
NTB: invalid buf pointer in multi-MW setups
NTB: remove unused variable
NTB: fix access of free-ed pointer
NTB: Fix issue where we may be accessing NULL ptr
-rw-r--r-- | drivers/ntb/hw/intel/ntb_hw_intel.c | 16 | ||||
-rw-r--r-- | drivers/ntb/hw/intel/ntb_hw_intel.h | 15 | ||||
-rw-r--r-- | drivers/ntb/ntb_transport.c | 44 |
3 files changed, 33 insertions, 42 deletions
diff --git a/drivers/ntb/hw/intel/ntb_hw_intel.c b/drivers/ntb/hw/intel/ntb_hw_intel.c index 865a3e3cc581..a198f8298258 100644 --- a/drivers/ntb/hw/intel/ntb_hw_intel.c +++ b/drivers/ntb/hw/intel/ntb_hw_intel.c | |||
@@ -2204,17 +2204,17 @@ static const struct intel_ntb_xlat_reg xeon_sec_xlat = { | |||
2204 | }; | 2204 | }; |
2205 | 2205 | ||
2206 | static struct intel_b2b_addr xeon_b2b_usd_addr = { | 2206 | static struct intel_b2b_addr xeon_b2b_usd_addr = { |
2207 | .bar2_addr64 = XEON_B2B_BAR2_USD_ADDR64, | 2207 | .bar2_addr64 = XEON_B2B_BAR2_ADDR64, |
2208 | .bar4_addr64 = XEON_B2B_BAR4_USD_ADDR64, | 2208 | .bar4_addr64 = XEON_B2B_BAR4_ADDR64, |
2209 | .bar4_addr32 = XEON_B2B_BAR4_USD_ADDR32, | 2209 | .bar4_addr32 = XEON_B2B_BAR4_ADDR32, |
2210 | .bar5_addr32 = XEON_B2B_BAR5_USD_ADDR32, | 2210 | .bar5_addr32 = XEON_B2B_BAR5_ADDR32, |
2211 | }; | 2211 | }; |
2212 | 2212 | ||
2213 | static struct intel_b2b_addr xeon_b2b_dsd_addr = { | 2213 | static struct intel_b2b_addr xeon_b2b_dsd_addr = { |
2214 | .bar2_addr64 = XEON_B2B_BAR2_DSD_ADDR64, | 2214 | .bar2_addr64 = XEON_B2B_BAR2_ADDR64, |
2215 | .bar4_addr64 = XEON_B2B_BAR4_DSD_ADDR64, | 2215 | .bar4_addr64 = XEON_B2B_BAR4_ADDR64, |
2216 | .bar4_addr32 = XEON_B2B_BAR4_DSD_ADDR32, | 2216 | .bar4_addr32 = XEON_B2B_BAR4_ADDR32, |
2217 | .bar5_addr32 = XEON_B2B_BAR5_DSD_ADDR32, | 2217 | .bar5_addr32 = XEON_B2B_BAR5_ADDR32, |
2218 | }; | 2218 | }; |
2219 | 2219 | ||
2220 | /* operations for primary side of local ntb */ | 2220 | /* operations for primary side of local ntb */ |
diff --git a/drivers/ntb/hw/intel/ntb_hw_intel.h b/drivers/ntb/hw/intel/ntb_hw_intel.h index ea0612f797df..2eb4addd10d0 100644 --- a/drivers/ntb/hw/intel/ntb_hw_intel.h +++ b/drivers/ntb/hw/intel/ntb_hw_intel.h | |||
@@ -227,16 +227,11 @@ | |||
227 | 227 | ||
228 | /* Use the following addresses for translation between b2b ntb devices in case | 228 | /* Use the following addresses for translation between b2b ntb devices in case |
229 | * the hardware default values are not reliable. */ | 229 | * the hardware default values are not reliable. */ |
230 | #define XEON_B2B_BAR0_USD_ADDR 0x1000000000000000ull | 230 | #define XEON_B2B_BAR0_ADDR 0x1000000000000000ull |
231 | #define XEON_B2B_BAR2_USD_ADDR64 0x2000000000000000ull | 231 | #define XEON_B2B_BAR2_ADDR64 0x2000000000000000ull |
232 | #define XEON_B2B_BAR4_USD_ADDR64 0x4000000000000000ull | 232 | #define XEON_B2B_BAR4_ADDR64 0x4000000000000000ull |
233 | #define XEON_B2B_BAR4_USD_ADDR32 0x20000000u | 233 | #define XEON_B2B_BAR4_ADDR32 0x20000000u |
234 | #define XEON_B2B_BAR5_USD_ADDR32 0x40000000u | 234 | #define XEON_B2B_BAR5_ADDR32 0x40000000u |
235 | #define XEON_B2B_BAR0_DSD_ADDR 0x9000000000000000ull | ||
236 | #define XEON_B2B_BAR2_DSD_ADDR64 0xa000000000000000ull | ||
237 | #define XEON_B2B_BAR4_DSD_ADDR64 0xc000000000000000ull | ||
238 | #define XEON_B2B_BAR4_DSD_ADDR32 0xa0000000u | ||
239 | #define XEON_B2B_BAR5_DSD_ADDR32 0xc0000000u | ||
240 | 235 | ||
241 | /* The peer ntb secondary config space is 32KB fixed size */ | 236 | /* The peer ntb secondary config space is 32KB fixed size */ |
242 | #define XEON_B2B_MIN_SIZE 0x8000 | 237 | #define XEON_B2B_MIN_SIZE 0x8000 |
diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c index 6e3ee907d186..60654d524858 100644 --- a/drivers/ntb/ntb_transport.c +++ b/drivers/ntb/ntb_transport.c | |||
@@ -605,7 +605,7 @@ static int ntb_transport_setup_qp_mw(struct ntb_transport_ctx *nt, | |||
605 | num_qps_mw = qp_count / mw_count; | 605 | num_qps_mw = qp_count / mw_count; |
606 | 606 | ||
607 | rx_size = (unsigned int)mw->xlat_size / num_qps_mw; | 607 | rx_size = (unsigned int)mw->xlat_size / num_qps_mw; |
608 | qp->rx_buff = mw->virt_addr + rx_size * qp_num / mw_count; | 608 | qp->rx_buff = mw->virt_addr + rx_size * (qp_num / mw_count); |
609 | rx_size -= sizeof(struct ntb_rx_info); | 609 | rx_size -= sizeof(struct ntb_rx_info); |
610 | 610 | ||
611 | qp->remote_rx_info = qp->rx_buff + rx_size; | 611 | qp->remote_rx_info = qp->rx_buff + rx_size; |
@@ -825,10 +825,10 @@ static void ntb_transport_link_work(struct work_struct *work) | |||
825 | size = max_mw_size; | 825 | size = max_mw_size; |
826 | 826 | ||
827 | spad = MW0_SZ_HIGH + (i * 2); | 827 | spad = MW0_SZ_HIGH + (i * 2); |
828 | ntb_peer_spad_write(ndev, spad, (u32)(size >> 32)); | 828 | ntb_peer_spad_write(ndev, spad, upper_32_bits(size)); |
829 | 829 | ||
830 | spad = MW0_SZ_LOW + (i * 2); | 830 | spad = MW0_SZ_LOW + (i * 2); |
831 | ntb_peer_spad_write(ndev, spad, (u32)size); | 831 | ntb_peer_spad_write(ndev, spad, lower_32_bits(size)); |
832 | } | 832 | } |
833 | 833 | ||
834 | ntb_peer_spad_write(ndev, NUM_MWS, nt->mw_count); | 834 | ntb_peer_spad_write(ndev, NUM_MWS, nt->mw_count); |
@@ -928,7 +928,6 @@ static int ntb_transport_init_queue(struct ntb_transport_ctx *nt, | |||
928 | unsigned int qp_num) | 928 | unsigned int qp_num) |
929 | { | 929 | { |
930 | struct ntb_transport_qp *qp; | 930 | struct ntb_transport_qp *qp; |
931 | struct ntb_transport_mw *mw; | ||
932 | phys_addr_t mw_base; | 931 | phys_addr_t mw_base; |
933 | resource_size_t mw_size; | 932 | resource_size_t mw_size; |
934 | unsigned int num_qps_mw, tx_size; | 933 | unsigned int num_qps_mw, tx_size; |
@@ -939,7 +938,6 @@ static int ntb_transport_init_queue(struct ntb_transport_ctx *nt, | |||
939 | qp_count = nt->qp_count; | 938 | qp_count = nt->qp_count; |
940 | 939 | ||
941 | mw_num = QP_TO_MW(nt, qp_num); | 940 | mw_num = QP_TO_MW(nt, qp_num); |
942 | mw = &nt->mw_vec[mw_num]; | ||
943 | 941 | ||
944 | qp = &nt->qp_vec[qp_num]; | 942 | qp = &nt->qp_vec[qp_num]; |
945 | qp->qp_num = qp_num; | 943 | qp->qp_num = qp_num; |
@@ -958,7 +956,7 @@ static int ntb_transport_init_queue(struct ntb_transport_ctx *nt, | |||
958 | mw_size = nt->mw_vec[mw_num].phys_size; | 956 | mw_size = nt->mw_vec[mw_num].phys_size; |
959 | 957 | ||
960 | tx_size = (unsigned int)mw_size / num_qps_mw; | 958 | tx_size = (unsigned int)mw_size / num_qps_mw; |
961 | qp_offset = tx_size * qp_num / mw_count; | 959 | qp_offset = tx_size * (qp_num / mw_count); |
962 | 960 | ||
963 | qp->tx_mw = nt->mw_vec[mw_num].vbase + qp_offset; | 961 | qp->tx_mw = nt->mw_vec[mw_num].vbase + qp_offset; |
964 | if (!qp->tx_mw) | 962 | if (!qp->tx_mw) |
@@ -1080,7 +1078,7 @@ static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *ndev) | |||
1080 | GFP_KERNEL, node); | 1078 | GFP_KERNEL, node); |
1081 | if (!nt->qp_vec) { | 1079 | if (!nt->qp_vec) { |
1082 | rc = -ENOMEM; | 1080 | rc = -ENOMEM; |
1083 | goto err2; | 1081 | goto err1; |
1084 | } | 1082 | } |
1085 | 1083 | ||
1086 | if (nt_debugfs_dir) { | 1084 | if (nt_debugfs_dir) { |
@@ -1092,7 +1090,7 @@ static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *ndev) | |||
1092 | for (i = 0; i < qp_count; i++) { | 1090 | for (i = 0; i < qp_count; i++) { |
1093 | rc = ntb_transport_init_queue(nt, i); | 1091 | rc = ntb_transport_init_queue(nt, i); |
1094 | if (rc) | 1092 | if (rc) |
1095 | goto err3; | 1093 | goto err2; |
1096 | } | 1094 | } |
1097 | 1095 | ||
1098 | INIT_DELAYED_WORK(&nt->link_work, ntb_transport_link_work); | 1096 | INIT_DELAYED_WORK(&nt->link_work, ntb_transport_link_work); |
@@ -1100,12 +1098,12 @@ static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *ndev) | |||
1100 | 1098 | ||
1101 | rc = ntb_set_ctx(ndev, nt, &ntb_transport_ops); | 1099 | rc = ntb_set_ctx(ndev, nt, &ntb_transport_ops); |
1102 | if (rc) | 1100 | if (rc) |
1103 | goto err3; | 1101 | goto err2; |
1104 | 1102 | ||
1105 | INIT_LIST_HEAD(&nt->client_devs); | 1103 | INIT_LIST_HEAD(&nt->client_devs); |
1106 | rc = ntb_bus_init(nt); | 1104 | rc = ntb_bus_init(nt); |
1107 | if (rc) | 1105 | if (rc) |
1108 | goto err4; | 1106 | goto err3; |
1109 | 1107 | ||
1110 | nt->link_is_up = false; | 1108 | nt->link_is_up = false; |
1111 | ntb_link_enable(ndev, NTB_SPEED_AUTO, NTB_WIDTH_AUTO); | 1109 | ntb_link_enable(ndev, NTB_SPEED_AUTO, NTB_WIDTH_AUTO); |
@@ -1113,17 +1111,16 @@ static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *ndev) | |||
1113 | 1111 | ||
1114 | return 0; | 1112 | return 0; |
1115 | 1113 | ||
1116 | err4: | ||
1117 | ntb_clear_ctx(ndev); | ||
1118 | err3: | 1114 | err3: |
1119 | kfree(nt->qp_vec); | 1115 | ntb_clear_ctx(ndev); |
1120 | err2: | 1116 | err2: |
1121 | kfree(nt->mw_vec); | 1117 | kfree(nt->qp_vec); |
1122 | err1: | 1118 | err1: |
1123 | while (i--) { | 1119 | while (i--) { |
1124 | mw = &nt->mw_vec[i]; | 1120 | mw = &nt->mw_vec[i]; |
1125 | iounmap(mw->vbase); | 1121 | iounmap(mw->vbase); |
1126 | } | 1122 | } |
1123 | kfree(nt->mw_vec); | ||
1127 | err: | 1124 | err: |
1128 | kfree(nt); | 1125 | kfree(nt); |
1129 | return rc; | 1126 | return rc; |
@@ -1931,13 +1928,11 @@ EXPORT_SYMBOL_GPL(ntb_transport_link_up); | |||
1931 | */ | 1928 | */ |
1932 | void ntb_transport_link_down(struct ntb_transport_qp *qp) | 1929 | void ntb_transport_link_down(struct ntb_transport_qp *qp) |
1933 | { | 1930 | { |
1934 | struct pci_dev *pdev; | ||
1935 | int val; | 1931 | int val; |
1936 | 1932 | ||
1937 | if (!qp) | 1933 | if (!qp) |
1938 | return; | 1934 | return; |
1939 | 1935 | ||
1940 | pdev = qp->ndev->pdev; | ||
1941 | qp->client_ready = false; | 1936 | qp->client_ready = false; |
1942 | 1937 | ||
1943 | val = ntb_spad_read(qp->ndev, QP_LINKS); | 1938 | val = ntb_spad_read(qp->ndev, QP_LINKS); |
@@ -1996,23 +1991,24 @@ EXPORT_SYMBOL_GPL(ntb_transport_qp_num); | |||
1996 | */ | 1991 | */ |
1997 | unsigned int ntb_transport_max_size(struct ntb_transport_qp *qp) | 1992 | unsigned int ntb_transport_max_size(struct ntb_transport_qp *qp) |
1998 | { | 1993 | { |
1999 | unsigned int max; | 1994 | unsigned int max_size; |
2000 | unsigned int copy_align; | 1995 | unsigned int copy_align; |
1996 | struct dma_chan *rx_chan, *tx_chan; | ||
2001 | 1997 | ||
2002 | if (!qp) | 1998 | if (!qp) |
2003 | return 0; | 1999 | return 0; |
2004 | 2000 | ||
2005 | if (!qp->tx_dma_chan && !qp->rx_dma_chan) | 2001 | rx_chan = qp->rx_dma_chan; |
2006 | return qp->tx_max_frame - sizeof(struct ntb_payload_header); | 2002 | tx_chan = qp->tx_dma_chan; |
2007 | 2003 | ||
2008 | copy_align = max(qp->tx_dma_chan->device->copy_align, | 2004 | copy_align = max(rx_chan ? rx_chan->device->copy_align : 0, |
2009 | qp->rx_dma_chan->device->copy_align); | 2005 | tx_chan ? tx_chan->device->copy_align : 0); |
2010 | 2006 | ||
2011 | /* If DMA engine usage is possible, try to find the max size for that */ | 2007 | /* If DMA engine usage is possible, try to find the max size for that */ |
2012 | max = qp->tx_max_frame - sizeof(struct ntb_payload_header); | 2008 | max_size = qp->tx_max_frame - sizeof(struct ntb_payload_header); |
2013 | max -= max % (1 << copy_align); | 2009 | max_size = round_down(max_size, 1 << copy_align); |
2014 | 2010 | ||
2015 | return max; | 2011 | return max_size; |
2016 | } | 2012 | } |
2017 | EXPORT_SYMBOL_GPL(ntb_transport_max_size); | 2013 | EXPORT_SYMBOL_GPL(ntb_transport_max_size); |
2018 | 2014 | ||