Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S935859AbcCQMKW (ORCPT ); Thu, 17 Mar 2016 08:10:22 -0400 Received: from szxga01-in.huawei.com ([58.251.152.64]:52672 "EHLO szxga01-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932879AbcCQMKT (ORCPT ); Thu, 17 Mar 2016 08:10:19 -0400 Subject: Re: [PATCH v1 11/19] zsmalloc: squeeze freelist into page->mapping To: Minchan Kim , Sergey Senozhatsky References: <1457681423-26664-1-git-send-email-minchan@kernel.org> <1457681423-26664-12-git-send-email-minchan@kernel.org> <20160315064053.GF1464@swordfish> <20160315065126.GA3039@bbox> CC: Andrew Morton , , , , , Vlastimil Babka , Joonsoo Kim , , , , Mel Gorman , Hugh Dickins , Sergey Senozhatsky , , Rik van Riel , Gioh Kim From: YiPing Xu Message-ID: <56EA9E8E.5040206@hisilicon.com> Date: Thu, 17 Mar 2016 20:09:50 +0800 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Thunderbird/38.5.1 MIME-Version: 1.0 In-Reply-To: <20160315065126.GA3039@bbox> Content-Type: text/plain; charset="windows-1252"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [10.184.213.22] X-CFilter-Loop: Reflected X-Mirapoint-Virus-RAPID-Raw: score=unknown(0), refid=str=0001.0A020204.56EA9E99.02A4,ss=1,re=0.000,recu=0.000,reip=0.000,cl=1,cld=1,fgs=0, ip=0.0.0.0, so=2013-06-18 04:22:30, dmn=2013-03-21 17:37:32 X-Mirapoint-Loop-Id: 2c530ad21b95c2354ff7604c358c59f5 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3153 Lines: 124 On 2016/3/15 14:51, Minchan Kim wrote: > On Tue, Mar 15, 2016 at 03:40:53PM +0900, Sergey Senozhatsky wrote: >> On (03/11/16 16:30), Minchan Kim wrote: >>> -static void *location_to_obj(struct page *page, unsigned long obj_idx) >>> +static void objidx_to_page_and_ofs(struct size_class *class, >>> + struct page *first_page, >>> + unsigned long obj_idx, >>> + struct page **obj_page, >>> + unsigned long *ofs_in_page) >> >> this looks big; 5 params, function "returning" both page and offset... >> any chance to split it in two steps, perhaps? > > Yes, it's rather ugly but I don't have a good idea. > Feel free to suggest if you have a better idea. > >> >> besides, it is more intuitive (at least to me) when 'offset' >> shortened to 'offt', not 'ofs'. the purpose to get 'obj_page' and 'ofs_in_page' is to map the page and get the meta-data pointer in the page, so, we can finish this in a single function. just like this, and maybe we could have a better function name static unsigned long *map_handle(struct size_class *class, struct page *first_page, unsigned long obj_idx) { struct page *cursor = first_page; unsigned long offset = obj_idx * class->size; int nr_page = offset >> PAGE_SHIFT; unsigned long offset_in_page = offset & ~PAGE_MASK; void *addr; int i; if (class->huge) { VM_BUG_ON_PAGE(!is_first_page(page), page); return &page_private(page); } for (i = 0; i < nr_page; i++) cursor = get_next_page(cursor); addr = kmap_atomic(cursor); return addr + offset_in_page; } static void unmap_handle(unsigned long *addr) { if (class->huge) { return; } kunmap_atomic(addr & ~PAGE_MASK); } all functions called "objidx_to_page_and_ofs" could use it like this, for example: static unsigned long handle_from_obj(struct size_class *class, struct page *first_page, int obj_idx) { unsigned long *head = map_handle(class, first_page, obj_idx); if (*head & OBJ_ALLOCATED_TAG) handle = *head & ~OBJ_ALLOCATED_TAG; unmap_handle(*head); return handle; } 'freeze_zspage', u'nfreeze_zspage' use it in the same way. but in 'obj_malloc', we still have to get the page to get obj. obj = location_to_obj(m_page, obj); > Indeed. I will change it to get_page_and_offset instead of > abbreviation if we cannot refactor it more. > >> >> -ss >> >>> { >>> - unsigned long obj; >>> + int i; >>> + unsigned long ofs; >>> + struct page *cursor; >>> + int nr_page; >>> >>> - if (!page) { >>> - VM_BUG_ON(obj_idx); >>> - return NULL; >>> - } >>> + ofs = obj_idx * class->size; >>> + cursor = first_page; >>> + nr_page = ofs >> PAGE_SHIFT; >>> >>> - obj = page_to_pfn(page) << OBJ_INDEX_BITS; >>> - obj |= ((obj_idx) & OBJ_INDEX_MASK); >>> - obj <<= OBJ_TAG_BITS; >>> + *ofs_in_page = ofs & ~PAGE_MASK; >>> + >>> + for (i = 0; i < nr_page; i++) >>> + cursor = get_next_page(cursor); >>> >>> - return (void *)obj; >>> + *obj_page = cursor; >>> } > > -- > To unsubscribe, send a message with 'unsubscribe linux-mm' in > the body to majordomo@kvack.org. For more info on Linux MM, > see: http://www.linux-mm.org/ . > Don't email: email@kvack.org > > . >