On Fri, 2016-11-18 at 11:00 -0800, John Fastabend wrote:
> static void free_receive_bufs(struct virtnet_info *vi) > { > + struct bpf_prog *old_prog; > int i; > > for (i = 0; i < vi->max_queue_pairs; i++) { > while (vi->rq[i].pages) > __free_pages(get_a_page(&vi->rq[i], GFP_KERNEL), 0); > + > + old_prog = rcu_dereference(vi->rq[i].xdp_prog); Seems wrong to me. Are you sure lockdep (with CONFIG_PROVE_RCU=y) was happy with this ? > + RCU_INIT_POINTER(vi->rq[i].xdp_prog, NULL); > + if (old_prog) > + bpf_prog_put(old_prog); > } > } > >