-/*
+/* SPDX-License-Identifier: MIT
+ *
* lttng-filter.c
*
* LTTng modules filter code.
*
* Copyright (C) 2010-2016 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
*/
#include <linux/list.h>
[ FILTER_OP_LOAD_FIELD_DOUBLE ] = "LOAD_FIELD_DOUBLE",
[ FILTER_OP_UNARY_BIT_NOT ] = "UNARY_BIT_NOT",
+
+ [ FILTER_OP_RETURN_S64 ] = "RETURN_S64",
};
const char *lttng_filter_print_op(enum filter_op op)
return -EINVAL;
nr_fields = desc->nr_fields;
for (i = 0; i < nr_fields; i++) {
+ if (fields[i].nofilter)
+ continue;
if (!strcmp(fields[i].name, field_name)) {
field = &fields[i];
break;
/* compute field offset */
switch (fields[i].type.atype) {
case atype_integer:
- case atype_enum:
+ case atype_enum_nestable:
field_offset += sizeof(int64_t);
break;
- case atype_array:
- case atype_sequence:
- case atype_array_bitfield:
- case atype_sequence_bitfield:
+ case atype_array_nestable:
+ if (!lttng_is_bytewise_integer(fields[i].type.u.array_nestable.elem_type))
+ return -EINVAL;
+ field_offset += sizeof(unsigned long);
+ field_offset += sizeof(void *);
+ break;
+ case atype_sequence_nestable:
+ if (!lttng_is_bytewise_integer(fields[i].type.u.sequence_nestable.elem_type))
+ return -EINVAL;
field_offset += sizeof(unsigned long);
field_offset += sizeof(void *);
break;
case atype_string:
field_offset += sizeof(void *);
break;
- case atype_struct: /* Unsupported. */
- case atype_array_compound: /* Unsupported. */
- case atype_sequence_compound: /* Unsupported. */
- case atype_variant: /* Unsupported. */
+ case atype_struct_nestable: /* Unsupported. */
+ case atype_variant_nestable: /* Unsupported. */
default:
return -EINVAL;
}
field_ref = (struct field_ref *) op->data;
switch (field->type.atype) {
case atype_integer:
- case atype_enum:
+ case atype_enum_nestable:
op->op = FILTER_OP_LOAD_FIELD_REF_S64;
break;
- case atype_array:
- case atype_sequence:
+ case atype_array_nestable:
+ case atype_sequence_nestable:
if (field->user)
op->op = FILTER_OP_LOAD_FIELD_REF_USER_SEQUENCE;
else
else
op->op = FILTER_OP_LOAD_FIELD_REF_STRING;
break;
- case atype_struct: /* Unsupported. */
- case atype_array_compound: /* Unsupported. */
- case atype_sequence_compound: /* Unsupported. */
- case atype_variant: /* Unsupported. */
- case atype_array_bitfield: /* Unsupported. */
- case atype_sequence_bitfield: /* Unsupported. */
+ case atype_struct_nestable: /* Unsupported. */
+ case atype_variant_nestable: /* Unsupported. */
default:
return -EINVAL;
}
field_ref = (struct field_ref *) op->data;
switch (ctx_field->event_field.type.atype) {
case atype_integer:
- case atype_enum:
+ case atype_enum_nestable:
op->op = FILTER_OP_GET_CONTEXT_REF_S64;
break;
/* Sequence and array supported as string */
case atype_string:
- case atype_array:
- case atype_sequence:
BUG_ON(ctx_field->event_field.user);
op->op = FILTER_OP_GET_CONTEXT_REF_STRING;
break;
- case atype_struct: /* Unsupported. */
- case atype_array_compound: /* Unsupported. */
- case atype_sequence_compound: /* Unsupported. */
- case atype_variant: /* Unsupported. */
- case atype_array_bitfield: /* Unsupported. */
- case atype_sequence_bitfield: /* Unsupported. */
+ case atype_array_nestable:
+ if (!lttng_is_bytewise_integer(ctx_field->event_field.type.u.array_nestable.elem_type))
+ return -EINVAL;
+ BUG_ON(ctx_field->event_field.user);
+ op->op = FILTER_OP_GET_CONTEXT_REF_STRING;
+ break;
+ case atype_sequence_nestable:
+ if (!lttng_is_bytewise_integer(ctx_field->event_field.type.u.sequence_nestable.elem_type))
+ return -EINVAL;
+ BUG_ON(ctx_field->event_field.user);
+ op->op = FILTER_OP_GET_CONTEXT_REF_STRING;
+ break;
+ case atype_struct_nestable: /* Unsupported. */
+ case atype_variant_nestable: /* Unsupported. */
default:
return -EINVAL;
}
/*
* Insert at specified priority (seqnum) in increasing
- * order.
+ * order. If there already is a bytecode of the same priority,
+ * insert the new bytecode right after it.
*/
list_for_each_entry_reverse(runtime,
&event->bytecode_runtime_head, node) {
- if (runtime->bc->bc.seqnum < bc->bc.seqnum) {
+ if (runtime->bc->bc.seqnum <= bc->bc.seqnum) {
/* insert here */
insert_loc = &runtime->node;
goto add_within;