On Fri, Aug 31, 2012 at 01:09:56AM +0900, Takuya Yoshikawa wrote: > On Thu, 30 Aug 2012 16:21:31 +0300 > "Michael S. Tsirkin" <mst@xxxxxxxxxx> wrote: > > > > +static u32 apic_read_reg(int reg_off, void *bitmap) > > > +{ > > > + return *((u32 *)(bitmap + reg_off)); > > > +} > > > + > > > > Contrast with apic_set_reg which gets apic, > > add fact that all callers invoke REG_POS and you will > > see this is a bad API. > > > > I played with some APIs but in the end it's > > probably better to just open-code this. > > I don't mind open-coding this. > > > As a bonus, open-coding will avoid the need > > for cast above, which is good: casts make code more > > fragile. > > But I still don't understand why we can eliminate casting: > > u32 reg_val; > > reg_val = *((u32 *)(bitmap + REG_POS(vec))); > if (reg_val) > return __fls(reg_val) + vec; > > (I'm not sure compilers are allowed to push out the value and > do multiple references for this code as explained in > https://lwn.net/Articles/508991/ So you *were* talking about concurrency? And you expect to solve it somehow without barriers explicit or implicit? > ) > > > If you mean > > u32 *reg; > > reg = bitmap + REG_POS(vec); > if (*reg) > return __fls(*reg) + vec; yes > I'm still not confident if this is a good style. > I rarely see code doing > > if (*p) > __fls(*p); > > This looks like explicite multiple references: I'm not saying > this will actually be compiled to do multiple references. > > Thanks, > Takuya It's just weird. Both versions are exactly equivalent in C. Adding a temporary changes *nothing* so the best readability wins. And IMHO, a version that does not cast wins hands down. I did a small test just to give you an example: [mst@robin ~]$ cat a.c int foo(void *bitmap) { unsigned *reg; reg = bitmap + 4; if (*reg) return *reg + 1; return -1; } [mst@robin ~]$ cat b.c int foo(void *bitmap) { unsigned reg; reg = *((unsigned *)(bitmap + 4)); if (reg) return reg + 1; return -1; } [mst@robin ~]$ gcc -O2 -c a.c [mst@robin ~]$ gcc -O2 -c b.c [mst@robin ~]$ objdump -ld a.o a.o: file format elf32-i386 Disassembly of section .text: 00000000 <foo>: foo(): 0: 8b 44 24 04 mov 0x4(%esp),%eax 4: 8b 50 04 mov 0x4(%eax),%edx 7: b8 ff ff ff ff mov $0xffffffff,%eax c: 8d 4a 01 lea 0x1(%edx),%ecx f: 85 d2 test %edx,%edx 11: 0f 45 c1 cmovne %ecx,%eax 14: c3 ret [mst@robin ~]$ objdump -ld b.o b.o: file format elf32-i386 Disassembly of section .text: 00000000 <foo>: foo(): 0: 8b 44 24 04 mov 0x4(%esp),%eax 4: 8b 50 04 mov 0x4(%eax),%edx 7: b8 ff ff ff ff mov $0xffffffff,%eax c: 8d 4a 01 lea 0x1(%edx),%ecx f: 85 d2 test %edx,%edx 11: 0f 45 c1 cmovne %ecx,%eax 14: c3 ret -- MST -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html