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.
Acked-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Signed-off-by: Christian Babeux <christian.babeux@efficios.com>
Signed-off-by: David Goulet <dgoulet@efficios.com>
int recursive_visit_gen_bytecode(struct filter_parser_ctx *ctx,
struct ir_op *node);
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)
{
static
int bytecode_init(struct lttng_filter_bytecode_alloc **fb)
{
if ((*fb)->b.len + padding + len > (*fb)->alloc_len) {
uint32_t new_len =
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;
(*fb)->alloc_len << 1);
uint32_t old_len = (*fb)->alloc_len;