[PATCH FOR REVIEW] interface description (revised)
Robert N. M. Watson
rwatson at freebsd.org
Wed Nov 18 15:35:40 UTC 2009
On 18 Nov 2009, at 15:12, John Baldwin wrote:
> However, this is a bit complicated, and to be honest, I don't think interface
> descriptions are a critical path. Robert has already said before that
> IF_AFDATA_RLOCK() isn't really the "correct" lock but is being abused for
> this. Given that, I would probably just add a single global sx lock. This
> has the added advantage that you can just use copyin/copyout directly and
> skip all the extra complication. I don't think we need the extra concurrency
> for interface descriptions to make this so complicated. If you used a global
> sx lock with a simple string for descriptions, the code would end up looking
> like this:
>
> static struct sx ifdescr_lock;
> SX_SYSINIT(&ifdescr_lock, "ifnet descr");
This strikes me as a good idea -- there won't be much real-world contention on the lock, I'd think, and this greatly simplifies the code. We might think about whether there's other, currently under-synchronized, ifnet meta-data that could be protected usefully with the same lock.
> case SIOCSIFDESCR:
> error = priv_check();
> if (error)
> break;
>
> if (ifr->ifr_buffer.length > ifdescr_maxlen)
> return (ENAMETOOLONG);
>
> buf = malloc(ifr->ifr_buffer.length, M_IFDESCR, M_WAITOK |
> M_ZERO);
> error = copyin(ifr->ifr_buffer.buffer, buf,
> ifr->ifr_buffer.length - 1);
> if (error) {
> free(buf, M_IFDESCR);
> break;
> }
> sx_xlock(&ifdescr_lock);
> ifp->if_description = buf;
> sx_xunlock(&ifdescr_lock);
> break;
>
> Note that this takes approach 1) from above, but it is also a moot point now
> since the 'get' ioctl doesn't allocate memory anymore.
This code seems pretty reasonable to me, but there's a race here if two threads try to use the set ioctl on the same interface at once. We should test whether ifp->if_description is already set after the sx_xlock() above, and swap pointers, freeing the old one after xunlock(), if so.
Robert
More information about the freebsd-net
mailing list