Message ID | 54483FF7.4090208@cumulusnetworks.com |
---|---|
State | RFC, archived |
Delegated to: | David Miller |
Headers | show |
On 10/23/2014 02:38 AM, Jonathan Toppins wrote: > On 10/22/14, 2:55 PM, Crestez Dan Leonard wrote: >> sg_init_one does virt_addr on the pointer which assumes it is directly accessible. But the tcp_md5sig_pool pointer comes from alloc_percpu which can return memory from the vmalloc area after the pcpu_first_chunk is exhausted. This looks wrong to me. I'm am getting crashes on mips and I believe this to be the cause. > > Thinking about this more if the issue really is sg_init_one assumes a > directly accessible memory region, can we just modify the zone > allocation to GFP_DMA using alloc_percpu_gfp()? Does this satisfy the > assumptions made by sg_init_one? I don't think that alloc_percpu_gfp can be used that way. Looking at the code it only checks for GFP_KERNEL and behaves "atomically" if it is not present. This means that it fails rather than vmalloc a new percpu_chunk. The problem is not that the memory is not allocated with GFP_DMA but rather that the memory is allocated with vmalloc. Regards, Leonard -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 1bec4e7..6924320 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -2889,7 +2889,7 @@ static void __tcp_alloc_md5sig_pool(void) int cpu; struct tcp_md5sig_pool __percpu *pool; - pool = alloc_percpu(struct tcp_md5sig_pool); + pool = alloc_percpu_gfp(struct tcp_md5sig_pool, GFP_DMA); if (!pool) return;
On 10/22/14, 2:55 PM, Crestez Dan Leonard wrote: > sg_init_one does virt_addr on the pointer which assumes it is directly accessible. But the tcp_md5sig_pool pointer comes from alloc_percpu which can return memory from the vmalloc area after the pcpu_first_chunk is exhausted. This looks wrong to me. I'm am getting crashes on mips and I believe this to be the cause. Thinking about this more if the issue really is sg_init_one assumes a directly accessible memory region, can we just modify the zone allocation to GFP_DMA using alloc_percpu_gfp()? Does this satisfy the assumptions made by sg_init_one? -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html