Re: container_of

2015-01-19 Thread Simon Brand
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

2015-01-17 Thread Mike Krinkin
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

2015-01-17 Thread Simon Brand
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

2015-01-17 Thread Anish Kumar




> 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

2015-01-17 Thread Manish Katiyar
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

2015-01-17 Thread Simon Brand
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

2012-02-19 Thread Peter Teoh
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

2012-02-12 Thread loody
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