Message ID | 20150302213610.GA31974@dhcp22.suse.cz |
---|---|
State | Not Applicable, archived |
Delegated to: | David Miller |
Headers | show |
From: Michal Hocko <mhocko@suse.cz> Date: Mon, 2 Mar 2015 22:36:10 +0100 > 920c3ed74134 ([SPARC64]: Add basic infrastructure for MD add/remove > notification.) has added __GFP_NOFAIL for the allocation request but > it hasn't mentioned why is this strict requirement really needed. > The code was handling an allocation failure and propagated it properly > up the callchain so it is not clear why it is needed. > > Dave has clarified the intention when I tried to remove the flag as not > being necessary: > " > It is a serious failure. > > If we miss an MDESC update due to this allocation failure, the update > is not an event which gets retransmitted so we will lose the updated > machine description forever. > > We really need this allocation to succeed. > " > > So add a comment to clarify the nofail flag and get rid of the failure > check because __GFP_NOFAIL allocation doesn't fail. > > Signed-off-by: Michal Hocko <mhocko@suse.cz> Acked-by: David S. Miller <davem@davemloft.net> -- 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/arch/sparc/kernel/mdesc.c b/arch/sparc/kernel/mdesc.c index 99632a87e697..26c80e18d7b1 100644 --- a/arch/sparc/kernel/mdesc.c +++ b/arch/sparc/kernel/mdesc.c @@ -130,26 +130,26 @@ static struct mdesc_mem_ops memblock_mdesc_ops = { static struct mdesc_handle *mdesc_kmalloc(unsigned int mdesc_size) { unsigned int handle_size; + struct mdesc_handle *hp; + unsigned long addr; void *base; handle_size = (sizeof(struct mdesc_handle) - sizeof(struct mdesc_hdr) + mdesc_size); + /* + * Allocation has to succeed because mdesc update would be missed + * and such events are not retransmitted. + */ base = kmalloc(handle_size + 15, GFP_KERNEL | __GFP_NOFAIL); - if (base) { - struct mdesc_handle *hp; - unsigned long addr; - - addr = (unsigned long)base; - addr = (addr + 15UL) & ~15UL; - hp = (struct mdesc_handle *) addr; + addr = (unsigned long)base; + addr = (addr + 15UL) & ~15UL; + hp = (struct mdesc_handle *) addr; - mdesc_handle_init(hp, handle_size, base); - return hp; - } + mdesc_handle_init(hp, handle_size, base); - return NULL; + return hp; } static void mdesc_kfree(struct mdesc_handle *hp)