From: Brenden Blanco <bbla...@plumgrid.com> Date: Mon, 11 Jul 2016 14:29:49 -0700
> + if (fd >= 0) { > + prog = bpf_prog_get_type(fd, BPF_PROG_TYPE_XDP); > + if (IS_ERR(prog)) > + return PTR_ERR(prog); > + } > + > + xdp.command = XDP_SETUP_PROG; > + xdp.prog = prog; > + err = ops->ndo_xdp(dev, &xdp); > + if (err < 0 && prog) > + bpf_prog_put(prog); I don't understand the reference counting on 'prog' here. The enumeration documentation states that no matter what, the passed in prog doesn't need to be mangaged by the ->ndo_xdp() method. Therefore, if that is true, we must always put the 'prog' here if it is non-NULL. Regardless of the 'err' value.