- /* establish pfn range for lookup, and switch to direct map */
- q = pmem->pmem_queue;
- memcpy(&res, &nsio->res, sizeof(res));
- res.start += start_pad;
- res.end -= end_trunc;
- devm_remove_action(dev, pmem_release_queue, q);
- devm_memunmap(dev, (void __force *) pmem->virt_addr);
- pmem->virt_addr = (void __pmem *) devm_memremap_pages(dev, &res,
- &q->q_usage_counter, altmap);
- pmem->pfn_flags |= PFN_MAP;
-
- /*
- * At release time the queue must be dead before
- * devm_memremap_pages is unwound
- */
- if (devm_add_action(dev, pmem_release_queue, q)) {
- blk_cleanup_queue(q);
- return -ENOMEM;
- }
- if (IS_ERR(pmem->virt_addr))
- return PTR_ERR(pmem->virt_addr);
-
- /* attach pmem disk in "pfn-mode" */
- return pmem_attach_disk(dev, ndns, pmem);