Hello!
> However I'm confused about a couple of things, and there are only two
> uses of netif_rx_reschedule() in the kernel, so I'm a little stuck.
First, do not believe to even single bit of code or docs about
netif_rx_reschedule(). It was used once in the first version of NAPI
for 3com driver (which did not go to mainstream) and was left to rot. :-)
> 1. What is the intent of the second, 'undo' parameter? For example,
> ibmveth.c does
>
> if(ibmveth_rxq_pending_buffer(adapter) && netif_rx_reschedule(netdev,
> frames_processed))
> {
> lpar_rc = h_vio_signal(adapter->vdev->unit_address,
> VIO_IRQ_DISABLE);
> ibmveth_assert(lpar_rc == H_SUCCESS);
> more_work = 1;
> goto restart_poll;
> }
>
> but it only does
>
> netdev->quota -= frames_processed;
>
> _after_ that block (and the jump back to restart_poll). So the
> whole things seems fishy: netdev->quota goes up by the number of
> frames processed??
It is broken. netdev->quota MUST not be touched after netif_rx_complete().
Authors improved coding style, moving it closer to update of *budget
and it is wrong. First, because it is changed in an absolutely unserialized
context, second... you noticed.
> It's not clear to me why the driver would want to do something
> different depending on whether the NAPI poll was already scheduled
> or not.
netif_rx_complete() released control. ->poll can be reentered on another
CPU after this.
If netif_rx_reschedule() fails, it means that ->poll must exit, because
poll was already rescheduled.
If it succeds, it means current thread got control back. Changes made
before netif_rx_complete(), becuase we were going to exit, (netdev->quota etc)
are undone and loop can be restarted.
To be honest, I do not recollect everything. F.e. scheduling softirq
in netif_rx_reschedule() looks like a cut-n-paste bug.
Alexey
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html