Source-Changes-D archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: CVS commit: src/sys/net
On Tuesday 16 February 2016 13:37:28 you wrote:
> > Oh, I see. We shouldn't drop any events of link state changes.
>
> i don't see any point in keeping a huge series of link changes
> if they can be collapsed into an equivalent sequence. with VMs
> and other user-controlled systems it's possible to flood such a
> link state checking engine.
The queue can be kept quite short because we don't care about any prior
entries each time state changes to LINK_STATE_DOWN.
Also, we don't care about any prior entries (other than LINK_STATE_DOWN) when
setting LINK_STATE_UNKNOWN.
Finally we set LINK_STATE_UP.
So the queue should only ever hold a maximum of 3 items. Could even work it
like so
void
if_link_state_change(struct ifnet *ifp, int link_state)
{
int s, i;
s = splnet();
if (ifp->if_link_queue_len == 0 && ifp->link_state == link_state)
goto out;
for (i = 0; i < ifp->if_link_queue_len; i++) {
if (link_state <= ifp->if_link_queue[i]) {
ifp->if_link_queue[i] = link_state;
ifp->if_link_queue_len = i;
/* Because we are trimming the queue,
* there is no need to call softint_schedule again. */
goto out;
}
}
/* Add bounds check here for sanity */
ifp->if_link_queue[ifp->if_link_queue_len++] = link_state;
softint_schedule(ifp->if_link_state_softint);
out:
splx(s);
}
static void
if_link_state_change_si(void *arg)
{
int s, link_state, i;
s = splnet();
if (ifp->if_link_queue_len == 0)
goto out;
link_state = ifp->if_link_queue[0];
ifp->if_link_queue_len--;
for (i = 0; i < ifp->link_queue_len; i++)
ifp->if_link_queue[i] = ifp->if_link_queue[i + 1];
/* process state change as normal */
out:
splx(s);
}
Thoughts?
Roy
Home |
Main Index |
Thread Index |
Old Index