[PATCH] Introduce new filtering architecture

Nikolay Marchuk marchuk.nikolay.a at gmail.com
Mon Jun 19 13:37:32 UTC 2017


On 19.06.2017 11:08, Eugene Syromiatnikov wrote:
>> +		if (!strncmp(name, str, len)) {
> Not sure whether strncmp is better than strcmp here, since this function
> is not called with user-supplied str at all.
> 
> Or, do you expect that these will work with user-supplied strings in the
> future?
> 
> BTW, personally, I don't think that this needs to be string-keyed.
> Something as simple as
> 
>     enum filter_type_name {
>             FILTER_TYPE_syscall,
>             FILTER_TYPE_fd,
>     };
> 
>     #define FILTER_TYPE(name) \
>             [FILTER_TYPE_ ## name] = { \
>                     .parse_filter = parse_ ## name ## _filter, \
>                     .run_filter = run_ ## name ## _filter, \
>                     ._free_priv_data = free_ ## name ## _filter, \
>             }
> 
>     static const struct filter_type {
>             void* (*parse_filter)(const char *, const char *const);
>             bool (*run_filter)(struct tcb *, void *);
>             void (*_free_priv_data)(void *);
>     } filter_types[] = {
>             FILTER_TYPE(syscall),
>             FILTER_TYPE(fd),
>     };
> 
>     struct filter *
>     add_filter_to_array(struct filter **filters, unsigned int *nfilters,
>                         enum filter_type_name name)
>     {
>             *filters = xreallocarray(*filters, ++(*nfilters),
>                                      sizeof(struct filter));
>             struct filter *filter = &((*filters)[*nfilters - 1]);
>             filter->type = filters[name];
>             return filter;
>     }
> 
>     [...]
> 
>     #define create_filter(a, t) actual_create_filter(a, FILTER_TYPE_ ## t)
> 
>     [...]
> 
>     create_filter(action, fd);
> 
> should also suffice.
I am going to use string-keyed filters and actions for new filtering
language
parsing and enum is not sufficient.

>> +
>> +DECL_FILTER_ACTION(trace);
>> +DECL_FILTER_ACTION(inject);
>> +DECL_FILTER_ACTION(read);
>> +DECL_FILTER_ACTION(write);
>> +DECL_FILTER_ACTION(raw);
>> +DECL_FILTER_ACTION(abbrev);
>> +DECL_FILTER_ACTION(verbose);
>> +
>> +#undef DECL_FILTER_ACTION
> And the same confusion about declarations and definitions.
These declarations are necessary for extensibility of filtering mechanism.
New action can be declared in new file, but after adding a declaration
and a filter_action_type entry it can be used for filtering.

>> +	FILTER_ACTION_TYPE(read,	1,	null,	is_traced),
>> +	FILTER_ACTION_TYPE(write,	1,	null,	is_traced),
> This is actually an interesting question: do we want I/O being dumped for
> the calls which we do not trace? Current architecture doesn't allow that,
> but is there a possibility that there are circumstances where it may make
> sense?
This patch's goal is to make new implementation of old behavior.

>> +static void
>> +run_filter_action(struct tcb *tcp, struct filter_action *filt_action)
>> +{
>> +	if (filt_action->type->prefilter
>> +	    && !filt_action->type->prefilter(tcp))
> I'm not quite sure how it is guaranteed that the flag would be set (like,
> where the "trace filter runs first" order is implied).
Fixed with sorting actions by priority.

> Overall the most significant issue I see with the approach is the need
> to run all the filters even they are not needed for the evaluation of
> the boolean expression. Since I do not see the current action-to-filter
> relation as many-to-one, I see little advantage in running all
> the filters in advance and not during the expression evaluation (current
> implementation already can benefit of it, as it adds only the last
> filter to expression, effectively replacing previous one, so only the
> last filter has to be executed).
I fixed computing of all filters for current implementation. After full
implementation of new mechanism I will add optimizations of filter
expression and only necessary filters will be checked.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 213 bytes
Desc: OpenPGP digital signature
URL: <http://lists.strace.io/pipermail/strace-devel/attachments/20170619/86c39c50/attachment.bin>


More information about the Strace-devel mailing list