Re: [PATCH v3 2/2] drivers: misc: adi-axi-tdd: Add TDD engine

From: Greg Kroah-Hartman
Date: Thu Oct 19 2023 - 13:57:09 EST


On Thu, Oct 19, 2023 at 03:56:46PM +0300, Eliza Balas wrote:
> +config ADI_AXI_TDD
> + tristate "Analog Devices TDD Engine support"
> + depends on HAS_IOMEM
> + select REGMAP_MMIO
> + help
> + The ADI AXI TDD core is the reworked and generic TDD engine which
> + was developed for general use in Analog Devices HDL projects. Unlike
> + the previous TDD engine, this core can only be used standalone mode,
> + and is not embedded into other devices.

What does "previous" mean here? That's not relevant for a kernel help
text, is it?

Also, what is the module name? Why would someone enable this? What
userspace tools use it?


> +
> config DUMMY_IRQ
> tristate "Dummy IRQ handler"
> help

Why put your entry in this specific location in the file?

> +static int adi_axi_tdd_parse_ms(struct adi_axi_tdd_state *st,
> + const char *buf,
> + u64 *res)
> +{
> + u64 clk_rate = READ_ONCE(st->clk.rate);
> + char *orig_str, *modf_str, *int_part, frac_part[7];
> + long ival, frac;
> + int ret;
> +
> + orig_str = kstrdup(buf, GFP_KERNEL);
> + int_part = strsep(&orig_str, ".");

Why are we parsing floating point in the kernel? Please just keep the
api simple so that we don't have to try to do any type of parsing other
than turning a single text number into a value.

> + ret = kstrtol(int_part, 10, &ival);
> + if (ret || ival < 0)
> + return -EINVAL;

You leaked memory :(

Use the new logic in completion.h to make this simpler?

> + modf_str = strsep(&orig_str, ".");
> + if (modf_str) {
> + snprintf(frac_part, 7, "%s00000", modf_str);
> + ret = kstrtol(frac_part, 10, &frac);
> + if (ret)
> + return -EINVAL;

You leaked memory :(

> + } else {
> + frac = 0;
> + }
> +
> + *res = DIV_ROUND_CLOSEST_ULL((u64)ival * clk_rate, 1000)
> + + DIV_ROUND_CLOSEST_ULL((u64)frac * clk_rate, 1000000000);

Why isn't userspace doing this calculation?

I stopped reviewing here, sorry.

greg k-h