Messages in this thread | | | Subject | Re: [patch] arca-vm-2.2.5 | From | (Eric W. Biederman) | Date | 09 Apr 1999 01:58:42 -0500 |
| |
>>>>> "AS" == Arvind Sankar <arvinds@MIT.EDU> writes:
AS> On Wed, Apr 07, 1999 at 05:59:04PM +0200, Gabriel Paubert wrote: >> >> >> On Tue, 6 Apr 1999, David Miller wrote: >> >> > Date: Wed, 7 Apr 1999 00:49:18 +0200 (CEST) >> > From: Ingo Molnar <mingo@chiara.csoma.elte.hu> >> > >> > It should be 'inode >> 8' (which is done by the log2 >> > solution). Unless i'm misunderstanding something. >> > >> > Consider that: >> > >> > (((unsigned long) inode) >> (sizeof(struct inode) & ~ (sizeof(struct inode) - 1))) >> > >> > sort of approximates this and avoids the funny looking log2 macro. :-) >> >> May I disagree ? Compute this expression in the case sizeof(struct inode) >> is a large power of 2. Say 0x100, the shift count becomes (0x100 & ~0xff), >> or 0x100. Shifts by amounts larger than or equal to the word size are >> undefined in C AFAIR (and in practice on most architectures which take >> the shift count modulo some power of 2). >>
AS> typo there, I guess. the >> should be an integer division. Since the divisor is AS> a constant power of 2, the compiler will optimize it into a shift.
Actually I believe: #define DIVISOR(x) (x & ~((x >> 1) | ~(x >> 1)))
(((unsigned long) inode) / DIVISOR(sizeof(struct inode)))
Is the magic formula.
A smart compiler can figure out the shift, and the DIVISOR macro makes x into a power of two.
Eric
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.rutgers.edu Please read the FAQ at http://www.tux.org/lkml/
| |