Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S964788AbcJQJZ3 (ORCPT ); Mon, 17 Oct 2016 05:25:29 -0400 Received: from szxga01-in.huawei.com ([58.251.152.64]:37713 "EHLO szxga01-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932949AbcJQJZU (ORCPT ); Mon, 17 Oct 2016 05:25:20 -0400 Message-ID: <58049832.6000007@huawei.com> Date: Mon, 17 Oct 2016 17:21:54 +0800 From: Xishi Qiu User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20120428 Thunderbird/12.0.1 MIME-Version: 1.0 To: CC: Andrew Morton , Johannes Weiner , Vlastimil Babka , Mel Gorman , , , Joonsoo Kim Subject: Re: [RFC PATCH 1/5] mm/page_alloc: always add freeing page at the tail of the buddy list References: <1476346102-26928-1-git-send-email-iamjoonsoo.kim@lge.com> <1476346102-26928-2-git-send-email-iamjoonsoo.kim@lge.com> In-Reply-To: <1476346102-26928-2-git-send-email-iamjoonsoo.kim@lge.com> Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit X-Originating-IP: [10.177.25.179] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2340 Lines: 60 On 2016/10/13 16:08, js1304@gmail.com wrote: > From: Joonsoo Kim > > Currently, freeing page can stay longer in the buddy list if next higher > order page is in the buddy list in order to help coalescence. However, > it doesn't work for the simplest sequential free case. For example, think > about the situation that 8 consecutive pages are freed in sequential > order. > > page 0: attached at the head of order 0 list > page 1: merged with page 0, attached at the head of order 1 list > page 2: attached at the tail of order 0 list > page 3: merged with page 2 and then merged with page 0, attached at > the head of order 2 list > page 4: attached at the head of order 0 list > page 5: merged with page 4, attached at the tail of order 1 list > page 6: attached at the tail of order 0 list > page 7: merged with page 6 and then merged with page 4. Lastly, merged > with page 0 and we get order 3 freepage. > > With excluding page 0 case, there are three cases that freeing page is > attached at the head of buddy list in this example and if just one > corresponding ordered allocation request comes at that moment, this page > in being a high order page will be allocated and we would fail to make > order-3 freepage. > > Allocation usually happens in sequential order and free also does. So, it > would be important to detect such a situation and to give some chance > to be coalesced. > > I think that simple and effective heuristic about this case is just > attaching freeing page at the tail of the buddy list unconditionally. > If freeing isn't merged during one rotation, it would be actual > fragmentation and we don't need to care about it for coalescence. > Hi Joonsoo, I find another two places to reduce fragmentation. 1) __rmqueue_fallback steal_suitable_fallback move_freepages_block move_freepages list_move If we steal some free pages, we will add these page at the head of start_migratetype list, this will cause more fixed migratetype, because this pages will be allocated more easily. So how about use list_move_tail instead of list_move? 2) __rmqueue_fallback expand list_add How about use list_add_tail instead of list_add? If add the tail, then the rest of pages will be hard to be allocated and we can merge them again as soon as the page freed. Thanks, Xishi Qiu