--- 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++;