Hi Dave, thanks for your reply. On Wed, Feb 23, 2011 at 1:22 AM, Dave Hylands <dhylands@gmail.com> wrote:
Hi Murali,
On Tue, Feb 22, 2011 at 9:27 PM, Murali N <nalajala.murali@gmail.com> wrote:
Hi, can somebody explain me what "__get_cpu_var()" macro does? I try to understand this macro but i couldn't, its representation is weired!!!
get_cpu_var returns the contents of a per-cpu variable.
__get_cpu_var contains the actual machine-dependant implementation. It looks like all of the architectures use the one in asm-generic/percpu.h
In general, all of the per-cpu data is gathered together into a section. Multiple sections are allocated (one per CPU). I think that the address of the variable is really the offset within the section, and each allocated section is cache-line aligned. This offset is then added to the "offset for my cpu" to come up with the final address of the variable, which is dereferenced as a pointer dereference. There are lots of extra doo-dads to get around warnings, and to prevent the linker from producing relocation references for for the variable access (since it looks like an access of a global variable, but it's really just doing a game of using the offset of the variable within the section).
So you could think of it as a very fancy offsetof macro.
There are several other macros involved, perhaps you could be a bit more specific about your request?
Dave Hylands
I have one more basic question. Why would we need to maintain structures like this? Is there any advantage we get here? I saw one of the architectures specifics timer code, through out the code they are using this macro. -- Regards, Murali N