public inbox for linux-mtd@lists.infradead.org
 help / color / mirror / Atom feed
From: Zhihao Cheng <chengzhihao1@huawei.com>
To: Rickard Andersson <rickard.andersson@axis.com>, <richard@nod.at>,
	<linux-mtd@lists.infradead.org>, <rickard314.andersson@gmail.com>
Cc: <kernel@axis.com>
Subject: Re: [PATCH v4 2/2] ubi: Implement ioctl for detailed erase counters
Date: Mon, 9 Dec 2024 21:54:57 +0800	[thread overview]
Message-ID: <d8a04b33-3369-3b4e-26c8-012a41080341@huawei.com> (raw)
In-Reply-To: <20241209114843.2484141-2-rickard.andersson@axis.com>

在 2024/12/9 19:48, Rickard Andersson 写道:
> Currently, "max_ec" can be read from sysfs, which provides a limited
> view of the flash device’s wear. In certain cases, such as bugs in
> the wear-leveling algorithm, specific blocks can be worn down more
> than others, resulting in uneven wear distribution. Also some use cases
> can wear the erase blocks of the fastmap area more heavily than other
> parts of flash.
> Providing detailed erase counter values give a better understanding of
> the overall flash wear and is needed to be able to calculate for example
> expected life time.
> There exists more detailed info in debugfs, but this information is
> only available for debug builds.
> 
> Signed-off-by: Rickard Andersson <rickard.andersson@axis.com>
> ---
>   drivers/mtd/ubi/cdev.c | 69 ++++++++++++++++++++++++++++++++++++++++++
>   1 file changed, 69 insertions(+)
> 

It works, feel free to add
Tested-by: Zhihao Cheng <chengzhihao1@huawei.com>
Reviewed-by: Zhihao Cheng <chengzhihao1@huawei.com>

> diff --git a/drivers/mtd/ubi/cdev.c b/drivers/mtd/ubi/cdev.c
> index 0d8f04cf03c5..e2f2581e9f09 100644
> --- a/drivers/mtd/ubi/cdev.c
> +++ b/drivers/mtd/ubi/cdev.c
> @@ -828,6 +828,69 @@ static int rename_volumes(struct ubi_device *ubi,
>   	return err;
>   }
>   
> +static int ubi_get_ec_info(struct ubi_device *ubi, struct ubi_ecinfo_req __user *ureq)
> +{
> +	struct ubi_ecinfo_req req;
> +	struct ubi_wl_entry *wl;
> +	int read_cnt;
> +	int peb;
> +	int end_peb;
> +
> +	/* Copy the input arguments */
> +	if (copy_from_user(&req, ureq, sizeof(struct ubi_ecinfo_req)))
> +		return -EFAULT;
> +
> +	/* Check input arguments */
> +	if (req.length <= 0 || req.start < 0 || req.start >= ubi->peb_count)
> +		return -EINVAL;
> +
> +	if (check_add_overflow(req.start, req.length, &end_peb))
> +		return -EINVAL;
> +
> +	if (end_peb > ubi->peb_count)
> +		end_peb = ubi->peb_count;
> +
> +	/* Check access rights before filling erase_counters array */
> +	if (!access_ok(ureq->erase_counters, (end_peb-req.start) * sizeof(int32_t)))
> +		return -EFAULT;
> +
> +	/* Fill erase counter array */
> +	read_cnt = 0;
> +	for (peb = req.start; peb < end_peb; read_cnt++, peb++) {
> +		int ec;
> +
> +		if (ubi_io_is_bad(ubi, peb)) {
> +			if (__put_user(UBI_UNKNOWN, ureq->erase_counters+read_cnt))
> +				return -EFAULT;
> +
> +			continue;
> +		}
> +
> +		spin_lock(&ubi->wl_lock);
> +
> +		wl = ubi->lookuptbl[peb];
> +		if (wl)
> +			ec = wl->ec;
> +		else
> +			ec = UBI_UNKNOWN;
> +
> +		spin_unlock(&ubi->wl_lock);
> +
> +		if (__put_user(ec, ureq->erase_counters+read_cnt))
> +			return -EFAULT;
> +
> +	}
> +
> +	/* Return actual read length */
> +	req.read_length = read_cnt;
> +
> +	/* Copy everything except erase counter array */
> +	if (copy_to_user(ureq, &req, sizeof(struct ubi_ecinfo_req)))
> +		return -EFAULT;
> +
> +	return 0;
> +}
> +
>   static long ubi_cdev_ioctl(struct file *file, unsigned int cmd,
>   			   unsigned long arg)
>   {
> @@ -991,6 +1054,12 @@ static long ubi_cdev_ioctl(struct file *file, unsigned int cmd,
>   		break;
>   	}
>   
> +	case UBI_IOCECNFO:
> +	{
> +		err = ubi_get_ec_info(ubi, argp);
> +		break;
> +	}
> +
>   	default:
>   		err = -ENOTTY;
>   		break;
> 


______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

      reply	other threads:[~2024-12-09 13:59 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-12-09 11:48 [PATCH v4 1/2] ubi: Expose interface for detailed erase counters Rickard Andersson
2024-12-09 11:48 ` [PATCH v4 2/2] ubi: Implement ioctl " Rickard Andersson
2024-12-09 13:54   ` Zhihao Cheng [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=d8a04b33-3369-3b4e-26c8-012a41080341@huawei.com \
    --to=chengzhihao1@huawei.com \
    --cc=kernel@axis.com \
    --cc=linux-mtd@lists.infradead.org \
    --cc=richard@nod.at \
    --cc=rickard.andersson@axis.com \
    --cc=rickard314.andersson@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox