From 7b0579df170f90b2d6b704116dea65739f9442cd Mon Sep 17 00:00:00 2001 From: Ben Walker Date: Thu, 4 Apr 2019 11:14:49 -0700 Subject: [PATCH] nvme: Use a non-temporal move instruction when copying NVMe cmd When copying the NVMe command from the request to the actual submission queue slot, use a non-temporal move instruction. The submission queue slots are never read by software - only written to. So don't pollute the CPU cache with their contents. Change-Id: I112f721abfac03bd7b33ec9ddf783d4bf2952b42 Signed-off-by: Ben Walker Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/450193 Tested-by: SPDK CI Jenkins Reviewed-by: Changpeng Liu Reviewed-by: Xiaodong Liu Reviewed-by: Jim Harris Reviewed-by: Shuhei Matsumoto --- lib/nvme/nvme_pcie.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/nvme/nvme_pcie.c b/lib/nvme/nvme_pcie.c index b391291af..8aad3fc7d 100644 --- a/lib/nvme/nvme_pcie.c +++ b/lib/nvme/nvme_pcie.c @@ -1079,16 +1079,16 @@ nvme_pcie_copy_command(struct spdk_nvme_cmd *dst, const struct spdk_nvme_cmd *sr __m256i *d256 = (__m256i *)dst; const __m256i *s256 = (const __m256i *)src; - _mm256_store_si256(&d256[0], _mm256_load_si256(&s256[0])); - _mm256_store_si256(&d256[1], _mm256_load_si256(&s256[1])); + _mm256_stream_si256(&d256[0], _mm256_load_si256(&s256[0])); + _mm256_stream_si256(&d256[1], _mm256_load_si256(&s256[1])); #elif defined(__SSE2__) __m128i *d128 = (__m128i *)dst; const __m128i *s128 = (const __m128i *)src; - _mm_store_si128(&d128[0], _mm_load_si128(&s128[0])); - _mm_store_si128(&d128[1], _mm_load_si128(&s128[1])); - _mm_store_si128(&d128[2], _mm_load_si128(&s128[2])); - _mm_store_si128(&d128[3], _mm_load_si128(&s128[3])); + _mm_stream_si128(&d128[0], _mm_load_si128(&s128[0])); + _mm_stream_si128(&d128[1], _mm_load_si128(&s128[1])); + _mm_stream_si128(&d128[2], _mm_load_si128(&s128[2])); + _mm_stream_si128(&d128[3], _mm_load_si128(&s128[3])); #else *dst = *src; #endif