Giant-free polling [PATCH]

Pawel Jakub Dawidek pjd at FreeBSD.org
Thu Mar 3 23:25:01 GMT 2005


On Tue, Mar 01, 2005 at 04:29:49PM -0800, Luigi Rizzo wrote:
+> [cc-ing net at freebsd.org to get more opinions]
+> 
+> On Tue, Mar 01, 2005 at 04:42:48PM -0500, John Baldwin wrote:
+> > On Thursday 17 February 2005 07:10 pm, Luigi Rizzo wrote:
+> > > i am no expert about the locking but i see places where
+> > > you grab polling_lock followed by ifnet_lock, and others where
+> > > you use the opposite order. This seems prone to deadlock...
+> > 
+> > Yes, it basically seems that the polling_lock should be removed and just the 
+> > ifnet_lock used because the the ifnet_lock is already always held when the 
+> > polling_lock is locked.

Yeah, but we cannot grap ifnet_lock in polling code, because this is
internal mutex, not visible from outside.
I was thinking about moving ifnet_lock into ifnet structure...

+> this said, if the lock requests are blocking, you basically end
+> up with the polling loops always contending for the locks, with only one
+> doing actual work and the other one always busy-waiting.
+> 
+> Assuming the primitive exists, I think the correct way to implement
+> SMP polling is to use non-blocking locks, something like this
+> (in pseudocode)
+> 
+>     poll_loop() {
+> 	have_polling_lock = try_get_lock(polling_lock)
+> 	foreach(ifp in polled_interfaces) {
+> 	    if (have_polling_lock)
+> 		have_ifp_lock = get_lock(ifp) // returns true
+> 	    else
+> 		have_ifp_lock = try_get_lock(ifp)
+> 	    if (have_ifp_lock) {
+> 		ifp->poll();
+> 		release_lock(ifp)
+> 	    }
+> 	}
+> 	if (have_polling_lock)
+> 	    release_lock(polling_lock);
+>     }
+> 
+> so additional polling processes after the first one will not
+> block on busy interfaces and move forward instead.
+> This should remove a bit of contention, and let separate processes actually
+> work on different interfaces.

I think we should just implement per-interface idlepoll threads, so we can
run polling code on many CPUs for many interfaces.

-- 
Pawel Jakub Dawidek                       http://www.wheel.pl
pjd at FreeBSD.org                           http://www.FreeBSD.org
FreeBSD committer                         Am I Evil? Yes, I Am!
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 187 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-net/attachments/20050304/e540503f/attachment.bin


More information about the freebsd-net mailing list