<br><br><div class="gmail_quote">On Mon, Feb 13, 2012 at 3:34 PM, loody <span dir="ltr">&lt;<a href="mailto:miloody@gmail.com" target="_blank">miloody@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

hi all:<br>
I add below function in free_uid to get which task try to free user_struct<br>
<br>
struct task_struct *p;<br>
struct cred *c;<br>
c = container_of(up,struct cred, user);<br>
p = container_of(c,struct task_struct,real_cred);<br>
printk(&quot;%s user %p, cred-&gt;user = %p p-&gt;pid = %d\n&quot;,__func__,up, c-&gt;user,p-&gt;pid);<br>
<br>
but p-&gt;pid is always 0.<br>
I think it is wrong for me to get cred and task by using container_of.<br>
<br>
1. from kernel definition below, is it ok that member is pointer?<br>
#define container_of(ptr, type, member)<br>
<br></blockquote><div>it is just a macro, so member can be anything, and compiler will substitute the name during preprocessing time.    </div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


2. is there already exist macros or functions I can use for #1 above?<br>
<br>
3. what is user_struct used for? When and under what circumstances<br>
kernel will try to release it.<br></blockquote><div><br></div><div>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.</div>

<div><br></div><div>it is free in kernel/user.c:free_user(), which is called by free_uid().   So who called free_uid()?</div><div><br></div><div>Look into kernel/sys.c:getpriority() syscall implementation:</div><div><br>
</div>
<div><div>                      } while_each_thread(g, p);</div><div>                        if (who != cred-&gt;uid)</div><div>                                free_uid(user);         /* for find_user() */</div><div>                        break;</div>

<div><br></div></div><div>So those who called find_user() will call free_uid() (which then call free_user()....eh...convoluted logic!!!).</div><div><br></div><div>See the remark in kernel/user.c:find_user():</div>
<div><br></div><div><div>   107 /*</div><div>    108  * Locate the user_struct for the passed UID.  If found, take a ref on it.  The</div><div>    109  * caller must undo that ref with free_uid().</div><div>    110  *</div>

<div>    111  * If the user_struct could not be found, return NULL.</div><div>    112  */</div><div>    113 struct user_struct *find_user(uid_t uid)</div><div>    114 {</div></div><div><br></div><div>As indicated in remark above, that is the only situation I know when u have to free the user_struct (calling free_user()).   </div>
<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<br>
4. since user_struct is allocated by kmem_cache_zalloc, is there api<br>
or tool I can monitor it?<br>
<br>
Thanks for your help,<br>
<br>
_______________________________________________<br>
Kernelnewbies mailing list<br>
<a href="mailto:Kernelnewbies@kernelnewbies.org" target="_blank">Kernelnewbies@kernelnewbies.org</a><br>
<a href="http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies" target="_blank">http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br>Regards,<br>Peter Teoh<br>