--- a/sub-projects/compression/lzo-kmod/lzo1x_compress.c
+++ b/sub-projects/compression/lzo-kmod/lzo1x_compress.c
@@ -62,8 +62,12 @@ _lzo1x_1_do_compress(const unsigned char
 		goto literal;
 
 try_match:
+#ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
 		if (get_unaligned((const unsigned short *)m_pos)
 				== get_unaligned((const unsigned short *)ip)) {
+#else
+		if (m_pos[0] == ip[0] && m_pos[1] == ip[1]) {
+#endif
 			if (likely(m_pos[2] == ip[2]))
 					goto match;
 		}
@@ -94,9 +98,14 @@ match:
 				}
 				*op++ = tt;
 			}
-			do {
-				*op++ = *ii++;
-			} while (--t > 0);
+			if (t >= 2 * 4) {
+				memcpy(op, ii, t);
+				op += t;
+				ii += t;
+			} else
+				do {
+					*op++ = *ii++;
+				} while (--t > 0);
 		}
 
 		ip += 3;
@@ -208,9 +217,14 @@ int lzo1x_1_compress(const unsigned char
 
 			*op++ = tt;
 		}
-		do {
-			*op++ = *ii++;
-		} while (--t > 0);
+		if (t >= 2 * 4) {
+			memcpy(op, ii, t);
+			op += t;
+			ii += t;
+		} else
+			do {
+				*op++ = *ii++;
+			} while (--t > 0);
 	}
 
 	*op++ = M4_MARKER | 1;
@@ -224,4 +238,3 @@ EXPORT_SYMBOL_GPL(lzo1x_1_compress);
 
 MODULE_LICENSE("GPL");
 MODULE_DESCRIPTION("LZO1X-1 Compressor");
-
--- a/sub-projects/compression/lzo-kmod/lzo1x_decompress.c
+++ b/sub-projects/compression/lzo-kmod/lzo1x_decompress.c
@@ -45,10 +45,7 @@ int lzo1x_decompress_safe(const unsigned
 			goto output_overrun;
 		if (HAVE_IP(t + 1, ip_end, ip))
 			goto input_overrun;
-		do {
-			*op++ = *ip++;
-		} while (--t > 0);
-		goto first_literal_run;
+		goto prep_first_literal_run;
 	}
 
 	while ((ip < ip_end)) {
@@ -71,30 +68,27 @@ int lzo1x_decompress_safe(const unsigned
 		if (HAVE_IP(t + 4, ip_end, ip))
 			goto input_overrun;
 
-		COPY4(op, ip);
-		op += 4;
-		ip += 4;
-		if (--t > 0) {
-			if (t >= 4) {
-				do {
-					COPY4(op, ip);
-					op += 4;
-					ip += 4;
-					t -= 4;
-				} while (t >= 4);
-				if (t > 0) {
-					do {
-						*op++ = *ip++;
-					} while (--t > 0);
-				}
-			} else {
+		t += (4 - 1);
+		if (t >= 2 * 4) {
+			memcpy(op, ip, t);
+			op += t;
+			ip += t;
+		} else {
+			do {
+				COPY4(op, ip);
+				op += 4;
+				ip += 4;
+				t -= 4;
+			} while (t >= 4);
+			if (t > 0) {
+prep_first_literal_run:
 				do {
 					*op++ = *ip++;
 				} while (--t > 0);
 			}
 		}
 
-first_literal_run:
+//first_literal_run:
 		t = *ip++;
 		if (t >= 16)
 			goto match;
@@ -139,8 +133,7 @@ match:
 					t += 31 + *ip++;
 				}
 				m_pos = op - 1;
-				m_pos -= le16_to_cpu(get_unaligned(
-					(const unsigned short *)ip)) >> 2;
+				m_pos -= get_unaligned_le16(ip) >> 2;
 				ip += 2;
 			} else if (t >= 16) {
 				m_pos = op;
@@ -158,8 +151,7 @@ match:
 					}
 					t += 7 + *ip++;
 				}
-				m_pos -= le16_to_cpu(get_unaligned(
-					(const unsigned short *)ip)) >> 2;
+				m_pos -= get_unaligned_le16(ip) >> 2;
 				ip += 2;
 				if (m_pos == op)
 					goto eof_found;
@@ -184,21 +176,33 @@ match:
 			if (HAVE_OP(t + 3 - 1, op_end, op))
 				goto output_overrun;
 
-			if (t >= 2 * 4 - (3 - 1) && (op - m_pos) >= 4) {
-				COPY4(op, m_pos);
-				op += 4;
-				m_pos += 4;
-				t -= 4 - (3 - 1);
-				do {
+			if (t >= 2 * 4 - (3 - 1)) {
+				/*
+				 *  Assume memcpy don't copy
+				 *  more than 32 bytes at once
+				 */
+				if ((op - m_pos) >= 32) {
+					t += (3 - 1);
+					memcpy(op, m_pos, t);
+					op += t;
+					m_pos += t;
+				} else if ((op - m_pos) >= 4) {
 					COPY4(op, m_pos);
 					op += 4;
 					m_pos += 4;
-					t -= 4;
-				} while (t >= 4);
-				if (t > 0)
+					t -= 4 - (3 - 1);
 					do {
-						*op++ = *m_pos++;
-					} while (--t > 0);
+						COPY4(op, m_pos);
+						op += 4;
+						m_pos += 4;
+						t -= 4;
+					} while (t >= 4);
+					if (t > 0)
+						do {
+							*op++ = *m_pos++;
+						} while (--t > 0);
+				} else
+					goto copy_match;
 			} else {
 copy_match:
 				*op++ = *m_pos++;
