rewrite of rt_check() (now rt_check_fib())
Julian Elischer
julian at elischer.org
Fri Sep 5 22:52:39 UTC 2008
Julian Elischer wrote:
> Julian Elischer wrote:
>> In tryin gto understand rt_check_fib() (wsa rt_check()) I ended up
>> rewriting it to do what I thought it was trying to do..
>> this stops the panics some people have seen, but allows the system to
>> stay up long enough to see some other problem..
>> anyhow this si the patch:
>>
>> comments?
>>
>
> I was thinking about this a bit.
>
> rt_check_fib() drops the lock on the given rtentry in order to be able
> to get a lock on another rtentry that MIGHT be the same rtentry.
>
> while it is doing this, another processor could free the original
> rtentry. The only safw way to get around this is to hold an additional
> reference on the first rtentry (we don't already have one) while it is
> unlocked so that we can be sure that it is not actually freed if this
> happens.
>
> to do this safely I'd have to add a couple of new items into route.h:
>
> #define RT_TEMP_UNLOCK(_rt) do { \
> RT_ADDREF(_rt); \
> RT_UNLOCK(_rt); \
> } while (0)
>
> #define RT_RELOCK(_rt) do { \
> RT_LOCK(_rt) \
> if ((_rt)->rt_refcnt <= 1) \
> rtfree(_rt); \
> _rt = 0; /* signal that it went away */ \
> else { \
> RT_REMREF(_rt); \
> RT_UNLOCK(_rt);
duh remove that line!
\
> /* note that _rt is still valid */ \
> } \
> } while (0)
>
>
> the new version of rt_check is attached.....
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> freebsd-net at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-net
> To unsubscribe, send any mail to "freebsd-net-unsubscribe at freebsd.org"
More information about the freebsd-net
mailing list