Re: container_of
Am Sat, 17 Jan 2015 22:53:10 +0300 schrieb Mike Krinkin : > > #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! ___ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
Re: container_of
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));}) ___ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
Re: container_of
Am Sat, 17 Jan 2015 08:58:13 -0800 schrieb Manish Katiyar : > 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_64?h=packages/linux and following patches: https://projects.archlinux.org/svntogit/packages.git/plain/trunk/0001-drm-i915-Disallow-pin-ioctl-completely-for-kms-drive.patch?h=packages/linux https://projects.archlinux.org/svntogit/packages.git/plain/trunk/change-default-console-loglevel.patch?h=packages/linux 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 ___ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
Re: container_of
> On Jan 17, 2015, at 8:32 AM, Simon Brand 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 ___ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
Re: container_of
on Sat, Jan 17, 2015 at 8:32 AM, Simon Brand 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 > ___ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
container_of
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 ___ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
Re: some questions about container_of and user_struct
On Mon, Feb 13, 2012 at 3:34 PM, loody wrote: > hi all: > I add below function in free_uid to get which task try to free user_struct > > struct task_struct *p; > struct cred *c; > c = container_of(up,struct cred, user); > p = container_of(c,struct task_struct,real_cred); > printk("%s user %p, cred->user = %p p->pid = %d\n",__func__,up, > c->user,p->pid); > > but p->pid is always 0. > I think it is wrong for me to get cred and task by using container_of. > > 1. from kernel definition below, is it ok that member is pointer? > #define container_of(ptr, type, member) > > it is just a macro, so member can be anything, and compiler will substitute the name during preprocessing time. > 2. is there already exist macros or functions I can use for #1 above? > > 3. what is user_struct used for? When and under what circumstances > kernel will try to release it. > look into kernel/signal.c:__sigqueue_alloc() for example: user_struct is pointer to a user structure for identifying the user running in a particular process context mode, not necessarily itself. it is free in kernel/user.c:free_user(), which is called by free_uid(). So who called free_uid()? Look into kernel/sys.c:getpriority() syscall implementation: } while_each_thread(g, p); if (who != cred->uid) free_uid(user); /* for find_user() */ break; So those who called find_user() will call free_uid() (which then call free_user()eh...convoluted logic!!!). See the remark in kernel/user.c:find_user(): 107 /* 108 * Locate the user_struct for the passed UID. If found, take a ref on it. The 109 * caller must undo that ref with free_uid(). 110 * 111 * If the user_struct could not be found, return NULL. 112 */ 113 struct user_struct *find_user(uid_t uid) 114 { As indicated in remark above, that is the only situation I know when u have to free the user_struct (calling free_user()). > 4. since user_struct is allocated by kmem_cache_zalloc, is there api > or tool I can monitor it? > > Thanks for your help, > > ___ > Kernelnewbies mailing list > Kernelnewbies@kernelnewbies.org > http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies > -- Regards, Peter Teoh ___ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
some questions about container_of and user_struct
hi all: I add below function in free_uid to get which task try to free user_struct struct task_struct *p; struct cred *c; c = container_of(up,struct cred, user); p = container_of(c,struct task_struct,real_cred); printk("%s user %p, cred->user = %p p->pid = %d\n",__func__,up, c->user,p->pid); but p->pid is always 0. I think it is wrong for me to get cred and task by using container_of. 1. from kernel definition below, is it ok that member is pointer? #define container_of(ptr, type, member) 2. is there already exist macros or functions I can use for #1 above? 3. what is user_struct used for? When and under what circumstances kernel will try to release it. 4. since user_struct is allocated by kmem_cache_zalloc, is there api or tool I can monitor it? Thanks for your help, ___ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies