>I think it is actually 2 extra pointer deferences, You're right, my apologies.
>but the important bit >is that one of the pointers is fetched from memory you might not need to >read from at all with a CIRCLEQ. On modern processors one cache miss is >worth a whole big pile of extra instructions, so doing reads from memory >you don't strictly need to touch is about the easiest way to make things >go slower. I can understand that all, but still ... are people really using this in ways it would be noticable? If it was a serious issue, we could add the extra previous element pointer you're talking about to the TAILQ macros and it seems like that would do everything you want. In a more practical sense ... it seems the only users of CIRCLEQ_PREV are in sys/kern/subr_vmem.c and sys/kern/vfs_mount.c. In a lot of the ones in subr_vmem.c look like the relevant pointers would already be in the cache (and they're only going back one element, not traversing the whole list). vfs_mount.c uses in vfs_unmountall1(). CIRCLEQ_LAST is only used by libform and also in vfs_mount.c. --Ken