[lttng-dev] [PATCH lttng-tools 1/3] Fix: Filter bytecode alloc buffer size must be a power of 2
Mathieu Desnoyers
mathieu.desnoyers at efficios.com
Mon Aug 27 15:16:58 EDT 2012
* Christian Babeux (christian.babeux at efficios.com) wrote:
> The current allocation policy for the filter bytecode buffer is to double
> the size each time the underlying buffer can no longer contain the entire
> bytecode plus padding.
>
> In some cases, the initial allocation length is not a multiple of 2, thus
> possibly leading to odd-looking allocation size each time the buffer size
> is doubled.
>
> Signed-off-by: Christian Babeux <christian.babeux at efficios.com>
Acked-by: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
> ---
> .../filter/filter-visitor-generate-bytecode.c | 41 +++++++++++++++++++++-
> 1 file changed, 40 insertions(+), 1 deletion(-)
>
> diff --git a/src/lib/lttng-ctl/filter/filter-visitor-generate-bytecode.c b/src/lib/lttng-ctl/filter/filter-visitor-generate-bytecode.c
> index 36d35c5..71da21c 100644
> --- a/src/lib/lttng-ctl/filter/filter-visitor-generate-bytecode.c
> +++ b/src/lib/lttng-ctl/filter/filter-visitor-generate-bytecode.c
> @@ -38,6 +38,45 @@ static
> int recursive_visit_gen_bytecode(struct filter_parser_ctx *ctx,
> struct ir_op *node);
>
> +static inline int fls(unsigned int x)
> +{
> + int r = 32;
> +
> + if (!x)
> + return 0;
> + if (!(x & 0xFFFF0000U)) {
> + x <<= 16;
> + r -= 16;
> + }
> + if (!(x & 0xFF000000U)) {
> + x <<= 8;
> + r -= 8;
> + }
> + if (!(x & 0xF0000000U)) {
> + x <<= 4;
> + r -= 4;
> + }
> + if (!(x & 0xC0000000U)) {
> + x <<= 2;
> + r -= 2;
> + }
> + if (!(x & 0x80000000U)) {
> + x <<= 1;
> + r -= 1;
> + }
> + return r;
> +}
> +
> +static inline int get_count_order(unsigned int count)
> +{
> + int order;
> +
> + order = fls(count) - 1;
> + if (count & (count - 1))
> + order++;
> + return order;
> +}
> +
> static
> int bytecode_init(struct lttng_filter_bytecode_alloc **fb)
> {
> @@ -58,7 +97,7 @@ int32_t bytecode_reserve(struct lttng_filter_bytecode_alloc **fb, uint32_t align
>
> if ((*fb)->b.len + padding + len > (*fb)->alloc_len) {
> uint32_t new_len =
> - max_t(uint32_t, (*fb)->b.len + padding + len,
> + max_t(uint32_t, 1U << get_count_order((*fb)->b.len + padding + len),
> (*fb)->alloc_len << 1);
> uint32_t old_len = (*fb)->alloc_len;
>
> --
> 1.7.11.4
>
--
Mathieu Desnoyers
Operating System Efficiency R&D Consultant
EfficiOS Inc.
http://www.efficios.com
More information about the lttng-dev
mailing list