RE: [PATCH v22 3/4] scsi: ufs: Prepare HPB read for cached sub-region

From: Avri Altman
Date: Tue Feb 23 2021 - 08:50:49 EST



> +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;
> +}