Anton Blanchard wrote:
>Hi,
>
>>No. const == never changes.
>>get_TR changes if a task calls schedule, and return on another cpu.
>>
>
>Yes, I found this exact problem on ppc64 where we would cache the
>processor data area across a schedule(). What was interesting was that
>__attribute__ ((pure)) was not enough to fix this.
>
>static inline struct Paca *get_paca(void) __attribute__ ((pure));
>static inline struct Paca *get_paca(void)
>{
> struct Paca *rval;
> __asm__ ("mfspr %0,0x113" : "=r" (rval));
> return rval;
>}
>
>Alan Modra came to the rescue and found that gcc was optimising too much
>and since the function did not touch any global variables, it would
>upgrade the pure to const. This was on gcc 3.0.X.
>
But the function called schedule - mustn't gcc assume that schedule
writes into global variables?
As far as I can see that sounds like a gcc bug.
Could you try how many get_cpu calls are generated by the attached testapp?
the i386 RH compilers generate correct code:
gcc-2.96-98: 4 calls.
gcc3-3.0.1-3: 2 calls.
--
Manfred
--------------030102060809000108000403
Content-Type: application/msword;
name="test.c"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
filename="test.c"
I2luY2x1ZGUgPHN0ZGlvLmg+CgpzdGF0aWMgaW50IGNwdSA9IDE7CgpzdGF0aWMgdm9pZCBz
Y2hlZHVsZSh2b2lkKTsKCnN0YXRpYyBpbnQgZ2V0X2NwdSh2b2lkKSBfX2F0dHJpYnV0ZV9f
KChwdXJlKSk7CgppbnQgbWFpbih2b2lkKQp7CglpbnQgY3B1MSwgY3B1MiwgY3B1MywgY3B1
NDsKCWNwdTEgPSBnZXRfY3B1KCk7CgljcHUyID0gZ2V0X2NwdSgpOwoJc2NoZWR1bGUoKTsK
CWNwdTMgPSBnZXRfY3B1KCk7CgljcHU0ID0gZ2V0X2NwdSgpOwoJcHJpbnRmKCJ0aGUgY3B1
IHZhbHVlcyB3ZXJlICVkICVkICVkICVkLlxuIiwKCQljcHUxLCBjcHUyLCBjcHUzLCBjcHU0
KTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGdldF9jcHUodm9pZCkKewoJcHJpbnRmKCJn
ZXRfY3B1IGNhbGxlZC5cbiIpOwoJcmV0dXJuIGNwdTsKfQoKc3RhdGljIHZvaWQgc2NoZWR1
bGUodm9pZCkKewoJY3B1ID0gMjsKCXByaW50Zigic2NoZWR1bGUgY2FsbGVkIC5cbiIpOwp9
Cg==
--------------030102060809000108000403--
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/