summaryrefslogtreecommitdiffstats
path: root/lib/stackdepot.c
diff options
context:
space:
mode:
authorAlexander Potapenko <glider@google.com>2018-02-06 18:38:24 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2018-02-06 21:32:44 -0500
commita571b272ab0f82399e8b2ede8c95d153d76a3534 (patch)
tree49405f84b2e7787235f1ddd1e4b3e9ed5d8779a1 /lib/stackdepot.c
parent334cfa48d38f5416c125a71a57f72d6cf634d797 (diff)
lib/stackdepot.c: use a non-instrumented version of memcmp()
stackdepot used to call memcmp(), which compiler tools normally instrument, therefore every lookup used to unnecessarily call instrumented code. This is somewhat ok in the case of KASAN, but under KMSAN a lot of time was spent in the instrumentation. Link: http://lkml.kernel.org/r/20171117172149.69562-1-glider@google.com Signed-off-by: Alexander Potapenko <glider@google.com> Cc: Andrey Ryabinin <aryabinin@virtuozzo.com> Cc: Dmitry Vyukov <dvyukov@google.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'lib/stackdepot.c')
-rw-r--r--lib/stackdepot.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/lib/stackdepot.c b/lib/stackdepot.c
index f87d138e9672..e513459a5601 100644
--- a/lib/stackdepot.c
+++ b/lib/stackdepot.c
@@ -163,6 +163,21 @@ static inline u32 hash_stack(unsigned long *entries, unsigned int size)
163 STACK_HASH_SEED); 163 STACK_HASH_SEED);
164} 164}
165 165
166/* Use our own, non-instrumented version of memcmp().
167 *
168 * We actually don't care about the order, just the equality.
169 */
170static inline
171int stackdepot_memcmp(const unsigned long *u1, const unsigned long *u2,
172 unsigned int n)
173{
174 for ( ; n-- ; u1++, u2++) {
175 if (*u1 != *u2)
176 return 1;
177 }
178 return 0;
179}
180
166/* Find a stack that is equal to the one stored in entries in the hash */ 181/* Find a stack that is equal to the one stored in entries in the hash */
167static inline struct stack_record *find_stack(struct stack_record *bucket, 182static inline struct stack_record *find_stack(struct stack_record *bucket,
168 unsigned long *entries, int size, 183 unsigned long *entries, int size,
@@ -173,10 +188,8 @@ static inline struct stack_record *find_stack(struct stack_record *bucket,
173 for (found = bucket; found; found = found->next) { 188 for (found = bucket; found; found = found->next) {
174 if (found->hash == hash && 189 if (found->hash == hash &&
175 found->size == size && 190 found->size == size &&
176 !memcmp(entries, found->entries, 191 !stackdepot_memcmp(entries, found->entries, size))
177 size * sizeof(unsigned long))) {
178 return found; 192 return found;
179 }
180 } 193 }
181 return NULL; 194 return NULL;
182} 195}