Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 9 Sep 2010 09:36:19 -0400
From:      John Baldwin <jhb@freebsd.org>
To:        freebsd-current@freebsd.org, Weongyo Jeong <weongyo@freebsd.org>
Cc:        current@freebsd.org
Subject:   Re: about in_multi_mtx @ netinet/in_mcast.c:1095
Message-ID:  <201009090936.19412.jhb@freebsd.org>
In-Reply-To: <20100908201419.GF1328@weongyo>
References:  <20100908201419.GF1328@weongyo>

next in thread | previous in thread | raw e-mail | index | archive | help
On Wednesday, September 08, 2010 4:14:19 pm Weongyo Jeong wrote:
> Hello,
> 
> I have a question about IN_MULTI_LOCK() because it uses MTX_DEF flag
> when it's initialized so I always encounters the following LOR
> 
> lock order reversal: (sleepable after non-sleepable)
>  1st 0xffffffff80d0b560 in_multi_mtx (in_multi_mtx) @ 
netinet/in_mcast.c:1095
>  2nd 0xffffff00014e3850 USB device SX lock (USB device SX lock) @ 
/usr/home/freebsd_usb/sys/modules/usb/usb/../../../dev/usb/usb_request.c:441
> KDB: stack backtrace:
> db_trace_self_wrapper() at db_trace_self_wrapper+0x2a
> _witness_debugger() at _witness_debugger+0x2e
> witness_checkorder() at witness_checkorder+0x807
> _sx_xlock() at _sx_xlock+0x55
> usbd_do_request_flags() at usbd_do_request_flags+0xe5
> axe_cmd() at axe_cmd+0xc7
> axe_setmulti_locked() at axe_setmulti_locked+0x70
> axe_setmulti() at axe_setmulti+0x3e
> axe_ioctl() at axe_ioctl+0x132
> if_addmulti() at if_addmulti+0x19b
> in_joingroup_locked() at in_joingroup_locked+0x1bc
> in_joingroup() at in_joingroup+0x52
> in_control() at in_control+0x1144
> ifioctl() at ifioctl+0x1118
> kern_ioctl() at kern_ioctl+0xbe
> ioctl() at ioctl+0xfd
> syscallenter() at syscallenter+0x1aa
> syscall() at syscall+0x4c
> Xfast_syscall() at Xfast_syscall+0xe2
> 
> when I uses the following code at driver's ioctl routine:
> 
> 	case SIOCADDMULTI:
> 	case SIOCDELMULTI:
> 		axe_setmulti(sc, 0);
> 		break;
> 
> It means that USB driver always should defer SIOCADDMULTI /
> SIOCDELMULTI handling to the other process context to avoid LOR.
> 
> My question is that is it safe if the multicasting operations for USB
> device happens without IN_MULTI_LOCK?  Or is there any race cases if the
> task is deferred?

Why is USB using an sx lock instead of a mutex?

-- 
John Baldwin



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201009090936.19412.jhb>