summaryrefslogtreecommitdiffstats
path: root/arm64-thunderx-crypto-zip-fixes.patch
diff options
context:
space:
mode:
authorPeter Robinson <pbrobinson@gmail.com>2018-06-17 12:40:44 +0100
committerPeter Robinson <pbrobinson@gmail.com>2018-06-17 12:40:44 +0100
commit6fcbd945bc574b93b64a087473420454f2dda0e5 (patch)
tree437e4150d96d6f32e715abade662db6cf74a8e5e /arm64-thunderx-crypto-zip-fixes.patch
parente07bf8f1cbe4d27a92b0a700bffd2e51afadd7db (diff)
downloadkernel-6fcbd945bc574b93b64a087473420454f2dda0e5.tar.gz
kernel-6fcbd945bc574b93b64a087473420454f2dda0e5.tar.xz
kernel-6fcbd945bc574b93b64a087473420454f2dda0e5.zip
4.17.2
Diffstat (limited to 'arm64-thunderx-crypto-zip-fixes.patch')
-rw-r--r--arm64-thunderx-crypto-zip-fixes.patch221
1 files changed, 0 insertions, 221 deletions
diff --git a/arm64-thunderx-crypto-zip-fixes.patch b/arm64-thunderx-crypto-zip-fixes.patch
index 7f970ee30..3f40b0871 100644
--- a/arm64-thunderx-crypto-zip-fixes.patch
+++ b/arm64-thunderx-crypto-zip-fixes.patch
@@ -1,224 +1,3 @@
-From patchwork Mon Apr 9 15:45:50 2018
-Content-Type: text/plain; charset="utf-8"
-MIME-Version: 1.0
-Content-Transfer-Encoding: 7bit
-Subject: [v2,1/5] crypto: thunderx_zip: Fix fallout from CONFIG_VMAP_STACK
-From: Jan Glauber <jglauber@cavium.com>
-X-Patchwork-Id: 10331719
-Message-Id: <20180409154554.7578-2-jglauber@cavium.com>
-To: Herbert Xu <herbert@gondor.apana.org.au>
-Cc: "David S . Miller" <davem@davemloft.net>,
- linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org,
- Mahipal Challa <Mahipal.Challa@cavium.com>,
- Robert Richter <rrichter@cavium.com>, Jan Glauber <jglauber@cavium.com>,
- stable <stable@vger.kernel.org>
-Date: Mon, 9 Apr 2018 17:45:50 +0200
-
-Enabling virtual mapped kernel stacks breaks the thunderx_zip
-driver. On compression or decompression the executing CPU hangs
-in an endless loop. The reason for this is the usage of __pa
-by the driver which does no longer work for an address that is
-not part of the 1:1 mapping.
-
-The zip driver allocates a result struct on the stack and needs
-to tell the hardware the physical address within this struct
-that is used to signal the completion of the request.
-
-As the hardware gets the wrong address after the broken __pa
-conversion it writes to an arbitrary address. The zip driver then
-waits forever for the completion byte to contain a non-zero value.
-
-Allocating the result struct from 1:1 mapped memory resolves this
-bug.
-
-Signed-off-by: Jan Glauber <jglauber@cavium.com>
-Reviewed-by: Robert Richter <rrichter@cavium.com>
-Cc: stable <stable@vger.kernel.org> # 4.14
----
- drivers/crypto/cavium/zip/zip_crypto.c | 22 ++++++++++++++--------
- 1 file changed, 14 insertions(+), 8 deletions(-)
-
-diff --git a/drivers/crypto/cavium/zip/zip_crypto.c b/drivers/crypto/cavium/zip/zip_crypto.c
-index 8df4d26cf9d4..b92b6e7e100f 100644
---- a/drivers/crypto/cavium/zip/zip_crypto.c
-+++ b/drivers/crypto/cavium/zip/zip_crypto.c
-@@ -124,7 +124,7 @@ int zip_compress(const u8 *src, unsigned int slen,
- struct zip_kernel_ctx *zip_ctx)
- {
- struct zip_operation *zip_ops = NULL;
-- struct zip_state zip_state;
-+ struct zip_state *zip_state;
- struct zip_device *zip = NULL;
- int ret;
-
-@@ -135,20 +135,23 @@ int zip_compress(const u8 *src, unsigned int slen,
- if (!zip)
- return -ENODEV;
-
-- memset(&zip_state, 0, sizeof(struct zip_state));
-+ zip_state = kzalloc(sizeof(*zip_state), GFP_ATOMIC);
-+ if (!zip_state)
-+ return -ENOMEM;
-+
- zip_ops = &zip_ctx->zip_comp;
-
- zip_ops->input_len = slen;
- zip_ops->output_len = *dlen;
- memcpy(zip_ops->input, src, slen);
-
-- ret = zip_deflate(zip_ops, &zip_state, zip);
-+ ret = zip_deflate(zip_ops, zip_state, zip);
-
- if (!ret) {
- *dlen = zip_ops->output_len;
- memcpy(dst, zip_ops->output, *dlen);
- }
--
-+ kfree(zip_state);
- return ret;
- }
-
-@@ -157,7 +160,7 @@ int zip_decompress(const u8 *src, unsigned int slen,
- struct zip_kernel_ctx *zip_ctx)
- {
- struct zip_operation *zip_ops = NULL;
-- struct zip_state zip_state;
-+ struct zip_state *zip_state;
- struct zip_device *zip = NULL;
- int ret;
-
-@@ -168,7 +171,10 @@ int zip_decompress(const u8 *src, unsigned int slen,
- if (!zip)
- return -ENODEV;
-
-- memset(&zip_state, 0, sizeof(struct zip_state));
-+ zip_state = kzalloc(sizeof(*zip_state), GFP_ATOMIC);
-+ if (!zip_state)
-+ return -ENOMEM;
-+
- zip_ops = &zip_ctx->zip_decomp;
- memcpy(zip_ops->input, src, slen);
-
-@@ -179,13 +185,13 @@ int zip_decompress(const u8 *src, unsigned int slen,
- zip_ops->input_len = slen;
- zip_ops->output_len = *dlen;
-
-- ret = zip_inflate(zip_ops, &zip_state, zip);
-+ ret = zip_inflate(zip_ops, zip_state, zip);
-
- if (!ret) {
- *dlen = zip_ops->output_len;
- memcpy(dst, zip_ops->output, *dlen);
- }
--
-+ kfree(zip_state);
- return ret;
- }
-
-From patchwork Mon Apr 9 15:45:51 2018
-Content-Type: text/plain; charset="utf-8"
-MIME-Version: 1.0
-Content-Transfer-Encoding: 7bit
-Subject: [v2,2/5] crypto: thunderx_zip: Limit result reading attempts
-From: Jan Glauber <jglauber@cavium.com>
-X-Patchwork-Id: 10331705
-Message-Id: <20180409154554.7578-3-jglauber@cavium.com>
-To: Herbert Xu <herbert@gondor.apana.org.au>
-Cc: "David S . Miller" <davem@davemloft.net>,
- linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org,
- Mahipal Challa <Mahipal.Challa@cavium.com>,
- Robert Richter <rrichter@cavium.com>, Jan Glauber <jglauber@cavium.com>,
- stable <stable@vger.kernel.org>
-Date: Mon, 9 Apr 2018 17:45:51 +0200
-
-After issuing a request an endless loop was used to read the
-completion state from memory which is asynchronously updated
-by the ZIP coprocessor.
-
-Add an upper bound to the retry attempts to prevent a CPU getting stuck
-forever in case of an error. Additionally, add a read memory barrier
-and a small delay between the reading attempts.
-
-Signed-off-by: Jan Glauber <jglauber@cavium.com>
-Reviewed-by: Robert Richter <rrichter@cavium.com>
-Cc: stable <stable@vger.kernel.org> # 4.14
----
- drivers/crypto/cavium/zip/common.h | 21 +++++++++++++++++++++
- drivers/crypto/cavium/zip/zip_deflate.c | 4 ++--
- drivers/crypto/cavium/zip/zip_inflate.c | 4 ++--
- 3 files changed, 25 insertions(+), 4 deletions(-)
-
-diff --git a/drivers/crypto/cavium/zip/common.h b/drivers/crypto/cavium/zip/common.h
-index dc451e0a43c5..58fb3ed6e644 100644
---- a/drivers/crypto/cavium/zip/common.h
-+++ b/drivers/crypto/cavium/zip/common.h
-@@ -46,8 +46,10 @@
- #ifndef __COMMON_H__
- #define __COMMON_H__
-
-+#include <linux/delay.h>
- #include <linux/init.h>
- #include <linux/interrupt.h>
-+#include <linux/io.h>
- #include <linux/kernel.h>
- #include <linux/module.h>
- #include <linux/pci.h>
-@@ -149,6 +151,25 @@ struct zip_operation {
- u32 sizeofzops;
- };
-
-+static inline int zip_poll_result(union zip_zres_s *result)
-+{
-+ int retries = 1000;
-+
-+ while (!result->s.compcode) {
-+ if (!--retries) {
-+ pr_err("ZIP ERR: request timed out");
-+ return -ETIMEDOUT;
-+ }
-+ udelay(10);
-+ /*
-+ * Force re-reading of compcode which is updated
-+ * by the ZIP coprocessor.
-+ */
-+ rmb();
-+ }
-+ return 0;
-+}
-+
- /* error messages */
- #define zip_err(fmt, args...) pr_err("ZIP ERR:%s():%d: " \
- fmt "\n", __func__, __LINE__, ## args)
-diff --git a/drivers/crypto/cavium/zip/zip_deflate.c b/drivers/crypto/cavium/zip/zip_deflate.c
-index 9a944b8c1e29..d7133f857d67 100644
---- a/drivers/crypto/cavium/zip/zip_deflate.c
-+++ b/drivers/crypto/cavium/zip/zip_deflate.c
-@@ -129,8 +129,8 @@ int zip_deflate(struct zip_operation *zip_ops, struct zip_state *s,
- /* Stats update for compression requests submitted */
- atomic64_inc(&zip_dev->stats.comp_req_submit);
-
-- while (!result_ptr->s.compcode)
-- continue;
-+ /* Wait for completion or error */
-+ zip_poll_result(result_ptr);
-
- /* Stats update for compression requests completed */
- atomic64_inc(&zip_dev->stats.comp_req_complete);
-diff --git a/drivers/crypto/cavium/zip/zip_inflate.c b/drivers/crypto/cavium/zip/zip_inflate.c
-index 50cbdd83dbf2..7e0d73e2f89e 100644
---- a/drivers/crypto/cavium/zip/zip_inflate.c
-+++ b/drivers/crypto/cavium/zip/zip_inflate.c
-@@ -143,8 +143,8 @@ int zip_inflate(struct zip_operation *zip_ops, struct zip_state *s,
- /* Decompression requests submitted stats update */
- atomic64_inc(&zip_dev->stats.decomp_req_submit);
-
-- while (!result_ptr->s.compcode)
-- continue;
-+ /* Wait for completion or error */
-+ zip_poll_result(result_ptr);
-
- /* Decompression requests completed stats update */
- atomic64_inc(&zip_dev->stats.decomp_req_complete);
From patchwork Mon Apr 9 15:45:52 2018
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0