> +static int ufshpb_fill_ppn_from_page(struct ufshpb_lu *hpb,
> +                                    struct ufshpb_map_ctx *mctx, int pos,
> +                                    int len, u64 *ppn_buf)
> +{
> +       struct page *page;
> +       int index, offset;
> +       int copied;
> +
> +       index = pos / (PAGE_SIZE / HPB_ENTRY_SIZE);
> +       offset = pos % (PAGE_SIZE / HPB_ENTRY_SIZE);
Maybe cache hpb->entries_per_page in ufshpb_lu_parameter_init as well?

> +
> +       if ((offset + len) <= (PAGE_SIZE / HPB_ENTRY_SIZE))
> +               copied = len;
> +       else
> +               copied = (PAGE_SIZE / HPB_ENTRY_SIZE) - offset;
> +
> +       page = mctx->m_page[index];
> +       if (unlikely(!page)) {
> +               dev_err(&hpb->sdev_ufs_lu->sdev_dev,
> +                       "error. cannot find page in mctx\n");
> +               return -ENOMEM;
> +       }
> +
> +       memcpy(ppn_buf, page_address(page) + (offset * HPB_ENTRY_SIZE),
> +              copied * HPB_ENTRY_SIZE);
> +
> +       return copied;
> +}

Reply via email to