Re: [PATCH 3/4] string: introduce memchr_inv
From: Eric Dumazet <hidden>
Date: 2011-08-22 21:56:58
Also in:
linux-arch, lkml
Le lundi 22 aoA>>t 2011 A 13:52 -0700, Andrew Morton a A(C)crit :
On Tue, 23 Aug 2011 01:29:07 +0900 Akinobu Mita [off-list ref] wrote:quoted
memchr_inv() is mainly used to check whether the whole buffer is filled with just a specified byte. The function name and prototype are stolen from logfs and the implementation is from SLUB. ... +/** + * memchr_inv - Find a character in an area of memory. + * @s: The memory area + * @c: The byte to search for + * @n: The size of the area.This text seems to be stolen from memchr(). I guess it's close enough.quoted
+ * returns the address of the first character other than @c, or %NULL + * if the whole buffer contains just @c. + */ +void *memchr_inv(const void *start, int c, size_t bytes) +{ + u8 value = c; + u64 value64; + unsigned int words, prefix; + + if (bytes <= 16) + return check_bytes8(start, value, bytes); + + value64 = value | value << 8 | value << 16 | value << 24; + value64 = (value64 & 0xffffffff) | value64 << 32; + prefix = 8 - ((unsigned long)start) % 8; +
<snip>
quoted
+ if (prefix) { + u8 *r = check_bytes8(start, value, prefix); + if (r) + return r; + start += prefix; + bytes -= prefix; + }
</snip>
Please note Andrew the previous code just make sure 'start' is aligned
on 8 bytes boundary. (It is suboptimal because if 'start' was already
aligned, we call the slow check_bytes(start, value, 8))
Code should probably do
prefix = (unsigned long)start % 8;
if (prefix) {
prefix = 8 - prefix;
r = check_bytes8(start, value, prefix);
...
quoted
+ + words = bytes / 8; + + while (words) { + if (*(u64 *)start != value64)
-- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/ Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>