simple memory malloc and free in ip_output.c
Hi, I am doing a very simple operation at the method of ip_queue_xmit in ip_output.c. The code is very simple. char *p = kmalloc(48, GFP_KERNEL); kfree(p); This will be called every time this method is called. But the result is that the whole system is not responsive at all. This is a very simple, not sure what I am doing wrong. Can anybody help? Thanks
I tried it, still the same thing. Also, there is another side effect that if I call the two lines of code above, the internet connection seems to break except to localhost. On Thu, Dec 26, 2013 at 10:24 PM, bill4carson <bill4carson@gmail.com> wrote:
On 2013年12月27日 11:16, Guibin(Bill) Tian wrote:
Hi, I am doing a very simple operation at the method of ip_queue_xmit in ip_output.c. The code is very simple.
char *p = kmalloc(48, GFP_KERNEL);
^^^^^^^^ GFP_ATOMIC ? -- 八百里秦川尘土飞扬,三千万老陕齐吼秦腔。
--bill
It does work in your way, thanks Carson On Thursday, December 26, 2013, Guibin(Bill) Tian wrote:
I tried it, still the same thing. Also, there is another side effect that if I call the two lines of code above, the internet connection seems to break except to localhost.
On Thu, Dec 26, 2013 at 10:24 PM, bill4carson <bill4carson@gmail.com<javascript:_e({}, 'cvml', 'bill4carson@gmail.com');>
wrote:
On 2013年12月27日 11:16, Guibin(Bill) Tian wrote:
Hi, I am doing a very simple operation at the method of ip_queue_xmit in ip_output.c. The code is very simple.
char *p = kmalloc(48, GFP_KERNEL);
^^^^^^^^ GFP_ATOMIC ? -- 八百里秦川尘土飞扬,三千万老陕齐吼秦腔。
--bill
Hi, ip_queue_xmit will get called for every packet send, so frequent allocation and free of memory can be a problem for slab allocator. If you need only 48 bytes of memory in a function you can chose to use array. -Anand Moon -----BEGIN PGP MESSAGE----- Version: GnuPG v1.4.14 (GNU/Linux) jA0EAwMCYq3dHqTzwcVgyRxC1j+oLxS8Yw92EIeKln+x3eAWzd7mM/pUluRo =0RYk -----END PGP MESSAGE----- On Friday, December 27, 2013 11:11 AM, Guibin(Bill) Tian <gbtian@gmail.com> wrote: It does work in your way, thanks Carson On Thursday, December 26, 2013, Guibin(Bill) Tian wrote: I tried it, still the same thing.
Also, there is another side effect that if I call the two lines of code above, the internet connection seems to break except to localhost.
On Thu, Dec 26, 2013 at 10:24 PM, bill4carson <bill4carson@gmail.com> wrote:
On 2013年12月27日 11:16, Guibin(Bill) Tian wrote:
Hi,
I am doing a very simple operation at the method of ip_queue_xmit in ip_output.c. The code is very simple.
char *p = kmalloc(48, GFP_KERNEL);
^^^^^^^^
GFP_ATOMIC ? -- 八百里秦川尘土飞扬,三千万老陕齐吼秦腔。
--bill
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
On Fri, Dec 27, 2013 at 10:16 AM, Guibin(Bill) Tian <gbtian@gmail.com> wrote:
Hi, I am doing a very simple operation at the method of ip_queue_xmit in ip_output.c. The code is very simple.
char *p = kmalloc(48, GFP_KERNEL); kfree(p);
This will be called every time this method is called.
But the result is that the whole system is not responsive at all. This is a very simple, not sure what I am doing wrong. Can anybody help?
Other than what others have said, IMHO it is better to avoid such rapid alloc/free, assuming your code fragment is running on every packet reception/sending. Instead, I suggest to allocate the memory before the ip_queue_xmit and use-reuse it inside ip_queue_xmit. -- regards, Mulyadi Santosa Freelance Linux trainer and consultant blog: the-hydra.blogspot.com training: mulyaditraining.blogspot.com
On Thu, 02 Jan 2014 12:12:49 +0700, Mulyadi Santosa said:
Other than what others have said, IMHO it is better to avoid such rapid alloc/free, assuming your code fragment is running on every packet reception/sending.
Instead, I suggest to allocate the memory before the ip_queue_xmit and use-reuse it inside ip_queue_xmit.
Be careful with re-entrancy issues - you'll want a separate instance of memory for all possible concurrent callers of ip_queue_xmit (you may need one per active interface, because you can e transmitting packets on multiple interfaces at the same time).
On Thu, Jan 2, 2014 at 12:41 PM, <Valdis.Kletnieks@vt.edu> wrote:
On Thu, 02 Jan 2014 12:12:49 +0700, Mulyadi Santosa said:
Other than what others have said, IMHO it is better to avoid such rapid alloc/free, assuming your code fragment is running on every packet reception/sending.
Instead, I suggest to allocate the memory before the ip_queue_xmit and use-reuse it inside ip_queue_xmit.
Be careful with re-entrancy issues - you'll want a separate instance of memory for all possible concurrent callers of ip_queue_xmit (you may need one per active interface, because you can e transmitting packets on multiple interfaces at the same time).
Ah yes, you're correct Valdis. Thanks for note. -- regards, Mulyadi Santosa Freelance Linux trainer and consultant blog: the-hydra.blogspot.com training: mulyaditraining.blogspot.com
Thank you sirs. But in fact, I don't alloc/free for every packet. I did exactly as what you said---reuse. I am a little confused why GFP_ATOMIC can work but GFP_KERNEL will cause the system to panic. Does it because that GFP_KERNEL can sleep in kmalloc, then ip_xmit_queue will be held or something? But anyway, GFP_ATOMIC works perfectly. On Thu, Jan 2, 2014 at 1:15 AM, Mulyadi Santosa <mulyadi.santosa@gmail.com>wrote:
On Thu, Jan 2, 2014 at 12:41 PM, <Valdis.Kletnieks@vt.edu> wrote:
On Thu, 02 Jan 2014 12:12:49 +0700, Mulyadi Santosa said:
Other than what others have said, IMHO it is better to avoid such rapid alloc/free, assuming your code fragment is running on every packet reception/sending.
Instead, I suggest to allocate the memory before the ip_queue_xmit and use-reuse it inside ip_queue_xmit.
Be careful with re-entrancy issues - you'll want a separate instance of memory for all possible concurrent callers of ip_queue_xmit (you may need one per active interface, because you can e transmitting packets on multiple interfaces at the same time).
Ah yes, you're correct Valdis. Thanks for note.
-- regards,
Mulyadi Santosa Freelance Linux trainer and consultant
blog: the-hydra.blogspot.com training: mulyaditraining.blogspot.com
On Fri, Jan 3, 2014 at 12:42 AM, Guibin(Bill) Tian <gbtian@gmail.com> wrote:
Thank you sirs. But in fact, I don't alloc/free for every packet. I did exactly as what you said---reuse.
I am a little confused why GFP_ATOMIC can work but GFP_KERNEL will cause the system to panic. Does it because that GFP_KERNEL can sleep in kmalloc, then ip_xmit_queue will be held or something? But anyway, GFP_ATOMIC works perfectly.
yup, you nailed it. gfp_kernel sleeps, while ip_xmit_queue is in interrupt context. -- regards, Mulyadi Santosa Freelance Linux trainer and consultant blog: the-hydra.blogspot.com training: mulyaditraining.blogspot.com
participants (5)
-
Anand Moon -
bill4carson -
Guibin(Bill) Tian -
Mulyadi Santosa -
Valdis.Kletnieks@vt.edu