diff options
author | Jesse Gross <jesse@nicira.com> | 2011-05-26 16:25:02 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-05-26 17:12:33 -0700 |
commit | 704f15ddb5fc2a7f25a12eb0913302d8ad9ffab3 (patch) | |
tree | ef17a945288c333c345643325783f374e10a4020 /include/linux/flex_array.h | |
parent | 5bf54a9758c230d9e957e7b4f3a41c226660dd49 (diff) | |
download | lwn-704f15ddb5fc2a7f25a12eb0913302d8ad9ffab3.tar.gz lwn-704f15ddb5fc2a7f25a12eb0913302d8ad9ffab3.zip |
flex_array: avoid divisions when accessing elements
On most architectures division is an expensive operation and accessing an
element currently requires four of them. This performance penalty
effectively precludes flex arrays from being used on any kind of fast
path. However, two of these divisions can be handled at creation time and
the others can be replaced by a reciprocal divide, completely avoiding
real divisions on access.
[eparis@redhat.com: rebase on top of changes to support 0 len elements]
[eparis@redhat.com: initialize part_nr when array fits entirely in base]
Signed-off-by: Jesse Gross <jesse@nicira.com>
Signed-off-by: Eric Paris <eparis@redhat.com>
Cc: Dave Hansen <dave@linux.vnet.ibm.com>
Cc: David Rientjes <rientjes@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/linux/flex_array.h')
-rw-r--r-- | include/linux/flex_array.h | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/include/linux/flex_array.h b/include/linux/flex_array.h index ebeb2f3ad068..6843cf193a44 100644 --- a/include/linux/flex_array.h +++ b/include/linux/flex_array.h @@ -21,6 +21,8 @@ struct flex_array { struct { int element_size; int total_nr_elements; + int elems_per_part; + u32 reciprocal_elems; struct flex_array_part *parts[]; }; /* |