Good evening, i read the article about the container_of function: http://www.kroah.com/log/linux/container_of.html I understand what it does and how it works. I thought, it could be simplified by replacing it through this: #define container_of(ptr, type, member) ({ \ (type *)( (char *)ptr - offsetof(type,member) );}) Original: #define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__mptr = (ptr); (type *)( (char *)__mptr - offsetof(type,member) );}) ptr has the type of a pointer to the member, which should be the same as __mptr? The value should although be the same. First I tried it in a self written script, then replaced it in include/linux/kernel.h and compiled it as usermode linux -> working well. Then I compiled it and run it in a VM, but it is not working. Can you please explain to me, why the original version is always working and "mine" is not? Thank you for your time! Regards, Simon
on Sat, Jan 17, 2015 at 8:32 AM, Simon Brand <simon.brand@postadigitale.de> wrote:
Good evening,
i read the article about the container_of function: http://www.kroah.com/log/linux/container_of.html
I understand what it does and how it works.
I thought, it could be simplified by replacing it through this:
#define container_of(ptr, type, member) ({ \ (type *)( (char *)ptr - offsetof(type,member) );})
Original: #define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__mptr = (ptr); (type *)( (char *)__mptr - offsetof(type,member) );})
ptr has the type of a pointer to the member, which should be the same as __mptr? The value should although be the same.
First I tried it in a self written script, then replaced it in include/linux/kernel.h and compiled it as usermode linux -> working well.
Then I compiled it and run it in a VM, but it is not working.
Can you please explain to me, why the original version is always working and "mine" is not?
Have you searched through archives. Exactly 7 years ago, I had the same question. http://comments.gmane.org/gmane.linux.kernel.kernelnewbies/24141 Thanks - Manish
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
Am Sat, 17 Jan 2015 08:58:13 -0800 schrieb Manish Katiyar <mkatiyar@gmail.com>:
Have you searched through archives. Exactly 7 years ago, I had the same question.
http://comments.gmane.org/gmane.linux.kernel.kernelnewbies/24141
No, sorry, I missed that :-x Thank you. To get this straight: it is only to produce a warning at compile time, when it is misused? I compiled the kernel two times, one time with the original code and one time with #define container_of(ptr, type, member) ({ \ (type *)( (char *)ptr - offsetof(type,member) );}) The secound kernel does not work proberly. First there is a kernel BUG at include/drm/drm_mm.h:145 at every boot: http://sprunge.us/MdDa Secound the kernel hangs on reboot and poweroff: reboot: http://picpaste.de/pics/8a041c11f3f5e24faebc1abb41b1db3f.1421523345.png poweroff: http://picpaste.de/pics/b1ab5225f37572a31b43e2fb8526e890.1421523472.png Third for example startx only produces the output: waiting for X server to begin accepting connections There is no further output in dmesg. The X server starts correctly with the first/original kernel. I compiled both kernels with following config: https://projects.archlinux.org/svntogit/packages.git/plain/trunk/config.x86_... and following patches: https://projects.archlinux.org/svntogit/packages.git/plain/trunk/0001-drm-i9... https://projects.archlinux.org/svntogit/packages.git/plain/trunk/change-defa... I compiled a little c code with both defines and gcc is producing another binary, but both are working as they should. Thank you for your reply. Simon
Hi, Simon
I compiled the kernel two times, one time with the original code and one time with #define container_of(ptr, type, member) ({ \ (type *)( (char *)ptr - offsetof(type,member) );})
try with following version: #define container_of(ptr, type, member) ({ \ (type *)((char *)(ptr) - offsetof(type, member));})
Am Sat, 17 Jan 2015 22:53:10 +0300 schrieb Mike Krinkin <krinkin.m.u@gmail.com>:
#define container_of(ptr, type, member) ({ \ (type *)((char *)(ptr) - offsetof(type, member));})
Thank you Mike, this is working! ptr is not evaluated before the text is replaced -.- I should know this... Thank you very much!
On Jan 17, 2015, at 8:32 AM, Simon Brand <simon.brand@postadigitale.de> wrote:
Good evening,
i read the article about the container_of function: http://www.kroah.com/log/linux/container_of.html
I understand what it does and how it works.
I thought, it could be simplified by replacing it through this:
#define container_of(ptr, type, member) ({ \ (type *)( (char *)ptr - offsetof(type,member) );})
Original: #define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__mptr = (ptr); (type *)( (char *)__mptr - offsetof(type,member) );})
ptr has the type of a pointer to the member, which should be the same as __mptr? The value should although be the same.
First I tried it in a self written script, then replaced it in include/linux/kernel.h and compiled it as usermode linux -> working well.
Then I compiled it and run it in a VM, but it is not working. What do you mean by that? What is not working?
Can you please explain to me, why the original version is always working and "mine" is not?
Thank you for your time!
Regards, Simon
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
participants (4)
-
Anish Kumar -
Manish Katiyar -
Mike Krinkin -
Simon Brand