Re: [PATCH net-next-2.6 v2] filter: optimize sk_run_filter

Tetsuo Handa
2010-11-19T14:17:24Z

Just my thought again...

Eric Dumazet wrote:
> @@ -167,34 +168,36 @@ unsigned int sk_run_filter(struct sk_buff *skb, struct sock_filter *filter, int
> unsigned long memvalid = 0;
> u32 tmp;
> int k;

Is this 'k' useful?

> - int pc;
>
> BUILD_BUG_ON(BPF_MEMWORDS > BITS_PER_LONG);
> /*
> * Process array of filter instructions.
> */
> - for (pc = 0; pc < flen; pc++) {
> - const struct sock_filter *fentry = &filter[pc];
> - u32 f_k = fentry->k;
> + for (;; fentry++) {
> +#if defined(CONFIG_X86_32)
> +#define K (fentry->k)
> +#else
> + const u32 K = fentry->k;

What happens if we use

u32 f_k = fentry->k;

and

> case BPF_S_LD_W_ABS:
> - k = f_k;
> + k = K;

remove this assignment and

> load_w:
> ptr = load_pointer(skb, k, 4, &tmp);

change to

ptr = load_pointer(skb, (int) f_k, 4, &tmp);

and

> case BPF_S_LD_W_IND:
> - k = X + f_k;
> + k = X + K;

change to

f_k += X;

?
> goto load_w;