On 12/3/20 6:53 PM, Qiaowei Ren wrote: > This patch implements the nvm_alloc_pages() of the buddy. > > Signed-off-by: Jianpeng Ma <jianpeng.ma@xxxxxxxxx> > Signed-off-by: Qiaowei Ren <qiaowei.ren@xxxxxxxxx> > --- > drivers/md/bcache/nvm-pages.c | 136 ++++++++++++++++++++++++++++++++++ > drivers/md/bcache/nvm-pages.h | 4 + > 2 files changed, 140 insertions(+) > > diff --git a/drivers/md/bcache/nvm-pages.c b/drivers/md/bcache/nvm-pages.c > index 7ffbfbacaf3f..2cde62081c4f 100644 > --- a/drivers/md/bcache/nvm-pages.c > +++ b/drivers/md/bcache/nvm-pages.c > @@ -95,6 +95,142 @@ static inline void remove_owner_space(struct nvm_namespace *ns, > bitmap_set(ns->pages_bitmap, pgoff, nr); > } [snipped] > + > +void *nvm_alloc_pages(int order, const char *owner_uuid) > +{ > + void *kaddr = NULL; > + struct owner_list *owner_list; > + struct nvm_alloced_recs *alloced_recs; > + int i, j; > + > + mutex_lock(&only_set->lock); > + owner_list = find_owner_list(owner_uuid, true); > + > + for (j = 0; j < only_set->total_namespaces_nr; j++) { > + struct nvm_namespace *ns = only_set->nss[j]; > + > + if (!ns || (ns->free < (1 << order))) > + continue; > + > + for (i = order; i < MAX_ORDER; i++) { > + struct list_head *list; > + struct page *page, *buddy_page; > + > + if (list_empty(&ns->free_area[i])) > + continue; > + > + list = ns->free_area[i].next; > + page = container_of((void *)list, struct page, zone_device_data); > + > + list_del(list); > + > + while (i != order) { > + buddy_page = nvm_vaddr_to_page(ns, > + nvm_pgoff_to_vaddr(ns, page->index + (1 << (i - 1)))); > + buddy_page->private = i - 1; > + buddy_page->index = page->index + (1 << (i - 1)); > + __SetPageBuddy(buddy_page); > + list_add((struct list_head *)&buddy_page->zone_device_data, > + &ns->free_area[i - 1]); > + i--; > + } > + > + page->private = order; > + __ClearPageBuddy(page); > + ns->free -= 1 << order; > + kaddr = nvm_pgoff_to_vaddr(ns, page->index); > + break; > + } > + > + if (i != MAX_ORDER) { > + alloced_recs = find_nvm_alloced_recs(owner_list, ns, true); > + add_extent(alloced_recs, kaddr, order); > + break; > + } > + } > + > + mutex_unlock(&only_set->lock); > + return kaddr; > +} > +EXPORT_SYMBOL_GPL(nvm_alloc_pages); It is better to name it as bch_nvmd_alloc_pages() now. > + > static void init_owner_info(struct nvm_namespace *ns) > { > struct owner_list_head *owner_list_head; > diff --git a/drivers/md/bcache/nvm-pages.h b/drivers/md/bcache/nvm-pages.h > index d91352496af1..95b7fa4b7dd0 100644 > --- a/drivers/md/bcache/nvm-pages.h > +++ b/drivers/md/bcache/nvm-pages.h > @@ -77,6 +77,8 @@ extern struct nvm_namespace *register_namespace(const char *dev_path); > extern int bch_nvm_init(void); > extern void bch_nvm_exit(void); > > +extern void *nvm_alloc_pages(int order, const char *owner_uuid); > + Maybe we don't need "extern" here. > #else > > static inline struct nvm_namespace *register_namespace(const char *dev_path) > @@ -89,6 +91,8 @@ static inline int bch_nvm_init(void) > } > static inline void bch_nvm_exit(void) { } > > +static inline void *nvm_alloc_pages(int order, const char *owner_uuid) { } The above should be, static inline void *nvm_alloc_pages(int order, const char *owner_uuid) {return NULL;} > + > #endif /* CONFIG_BCACHE_NVM_PAGES */ > > #endif /* _BCACHE_NVM_PAGES_H */ > Thanks. Coly Li