Skip to contentSkip to conversation

mtd: rawnand: Fix return value check of wait_for_completion_timeout

PATCH New Miaoqian Lin 3 participants 10 messages Apr 12, 2022 – Apr 21, 2022

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 mtd: rawnand: Fix return value check of wait_for_completion_timeout

wait_for_completion_timeout() returns unsigned long not int. It returns 0 if timed out, and positive if completed. The check for <= 0 is ambiguous and should be == 0 here indicating timeout which is the only error case.

Fixes 83738d87e3a0 ("mtd: sh_flctl: Add DMA capabilty")
---
 drivers/mtd/nand/raw/sh_flctl.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/mtd/nand/raw/sh_flctl.c +4 -2
index b85b9c6fcc42..4f326a2dd170 100644
@@ -385,6 +385,7 @@ static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf,
 	dma_cookie_t cookie;
 	uint32_t reg;
 	int ret;
+	unsigned long time_left;
 
 	if (dir == DMA_FROM_DEVICE) {
 		chan = flctl->chan_fifo0_rx;
@@ -425,13 +426,14 @@ static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf,
 		goto out;
 	}
 
-	ret =
+	time_left =
 	wait_for_completion_timeout(&flctl->dma_complete,
 				msecs_to_jiffies(3000));
 
-	if (ret <= 0) {
+	if (time_left == 0) {
 		dmaengine_terminate_all(chan);
 		dev_err(&flctl->pdev->dev, "wait_for_completion_timeout\n");
+		ret = -ETIMEDOUT;
 	}
 
 out:
Signature · 1 line
2.17.1
#1 lore raw
Thank you for the patch! Perhaps something to improve:

Hi Miaoqian,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on mtd/nand/next]
[also build test WARNING on linus/master linux/master v5.18-rc2 next-20220411] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/intel-lab-lkp/linux/commits/Miaoqian-Lin/mtd-rawnand-Fix-return-value-check-of-wait_for_completion_timeout/20220412-101006
base:   https://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux.git nand/next
config: hexagon-randconfig-r045-20220411 (https://download.01.org/0day-ci/archive/20220412/[email protected]/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project fe2478d44e4f7f191c43fef629ac7a23d0251e72)

reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/intel-lab-lkp/linux/commit/3de25b46a3f73a3e0031e5186eb4e2afa9098b46
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Miaoqian-Lin/mtd-rawnand-Fix-return-value-check-of-wait_for_completion_timeout/20220412-101006 git checkout 3de25b46a3f73a3e0031e5186eb4e2afa9098b46
# save the config file to linux build tree
mkdir build_dir
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=hexagon SHELL=/bin/bash drivers/mtd/nand/raw/

If you fix the issue, kindly add following tag as appropriate

All warnings (new ones prefixed by >>):

>> drivers/mtd/nand/raw/sh_flctl.c:433:6: warning: variable 'ret' is used uninitialized whenever 'if' condition is false [-Wsometimes-uninitialized]
           if (time_left == 0) {
               ^~~~~~~~~~~~~~
   drivers/mtd/nand/raw/sh_flctl.c:447:9: note: uninitialized use occurs here
           return ret;
                  ^~~
   drivers/mtd/nand/raw/sh_flctl.c:433:2: note: remove the 'if' if its condition is always true
           if (time_left == 0) {
           ^~~~~~~~~~~~~~~~~~~~
   drivers/mtd/nand/raw/sh_flctl.c:387:9: note: initialize the variable 'ret' to silence this warning
           int ret;
                  ^
                   = 0

1 warning generated.

vim +433 drivers/mtd/nand/raw/sh_flctl.c

377
378 static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf,
379 int len, enum dma_data_direction dir)
380 {
381 struct dma_async_tx_descriptor *desc = NULL;
382 struct dma_chan *chan;
383 enum dma_transfer_direction tr_dir;
384 dma_addr_t dma_addr;
385 dma_cookie_t cookie;
386 uint32_t reg;
387 int ret;
388 unsigned long time_left;
389
390 if (dir == DMA_FROM_DEVICE) {
391 chan = flctl->chan_fifo0_rx;
392 tr_dir = DMA_DEV_TO_MEM;
393 } else {
394 chan = flctl->chan_fifo0_tx;
395 tr_dir = DMA_MEM_TO_DEV;
396 }
397
398 dma_addr = dma_map_single(chan->device->dev, buf, len, dir);
399
400 if (!dma_mapping_error(chan->device->dev, dma_addr))
401 desc = dmaengine_prep_slave_single(chan, dma_addr, len,
402 tr_dir, DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
403
404 if (desc) {
405 reg = readl(FLINTDMACR(flctl));
406 reg |= DREQ0EN;
407 writel(reg, FLINTDMACR(flctl));
408
409 desc->callback = flctl_dma_complete;
410 desc->callback_param = flctl;
411 cookie = dmaengine_submit(desc);
412 if (dma_submit_error(cookie)) {
413 ret = dma_submit_error(cookie);
414 dev_warn(&flctl->pdev->dev,
415 "DMA submit failed, falling back to PIO\n");
416 goto out;
417 }
418
419 dma_async_issue_pending(chan);
420 } else {
421 /* DMA failed, fall back to PIO */
422 flctl_release_dma(flctl);
423 dev_warn(&flctl->pdev->dev,
424 "DMA failed, falling back to PIO\n");
425 ret = -EIO;
426 goto out;
427 }
428
429 time_left =
430 wait_for_completion_timeout(&flctl->dma_complete,
431 msecs_to_jiffies(3000));
432

 > 433		if (time_left == 0) {

434 dmaengine_terminate_all(chan);
435 dev_err(&flctl->pdev->dev, "wait_for_completion_timeout\n");
436 ret = -ETIMEDOUT;
437 }
438
439 out:
440 reg = readl(FLINTDMACR(flctl));
441 reg &= ~DREQ0EN;
442 writel(reg, FLINTDMACR(flctl));
443
444 dma_unmap_single(chan->device->dev, dma_addr, len, dir);
445
446 /* ret > 0 is success */
447 return ret;
448 }
449

Signature · 2 lines
0-DAY CI Kernel Test Service
https://01.org/lkp
#2 lore raw

PATCH v2 1/1 mtd: rawnand: Fix return value check of wait_for_completion_timeout

wait_for_completion_timeout() returns unsigned long not int. It returns 0 if timed out, and positive if completed. The check for <= 0 is ambiguous and should be == 0 here indicating timeout which is the only error case.

Fixes 83738d87e3a0 ("mtd: sh_flctl: Add DMA capabilty")

---
change in v2:
- initialize ret to 1.

---
 drivers/mtd/nand/raw/sh_flctl.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)
drivers/mtd/nand/raw/sh_flctl.c +5 -3
index b85b9c6fcc42..2373251f585b 100644
@@ -384,7 +384,8 @@ static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf,
 	dma_addr_t dma_addr;
 	dma_cookie_t cookie;
 	uint32_t reg;
-	int ret;
+	int ret = 1;
+	unsigned long time_left;
 
 	if (dir == DMA_FROM_DEVICE) {
 		chan = flctl->chan_fifo0_rx;
@@ -425,13 +426,14 @@ static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf,
 		goto out;
 	}
 
-	ret =
+	time_left =
 	wait_for_completion_timeout(&flctl->dma_complete,
 				msecs_to_jiffies(3000));
 
-	if (ret <= 0) {
+	if (time_left == 0) {
 		dmaengine_terminate_all(chan);
 		dev_err(&flctl->pdev->dev, "wait_for_completion_timeout\n");
+		ret = -ETIMEDOUT;
 	}
 
 out:
Signature · 6 lines
2.17.1


______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
maintainer
#3 lore raw

Hi Miaoqian,

[email protected] wrote on Tue, 12 Apr 2022 06:36:52 +0000:

Quoted 19 lines

wait_for_completion_timeout() returns unsigned long not int. It returns 0 if timed out, and positive if completed. The check for <= 0 is ambiguous and should be == 0 here indicating timeout which is the only error case.

Fixes 83738d87e3a0 ("mtd: sh_flctl: Add DMA capabilty")

---
change in v2:
- initialize ret to 1.

---
 drivers/mtd/nand/raw/sh_flctl.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)
drivers/mtd/nand/raw/sh_flctl.c +0 -0
index b85b9c6fcc42..2373251f585b 100644

drivers/mtd/nand/raw/sh_flctl.c static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf, · line 387

Quoted 5 lines
drivers/mtd/nand/raw/sh_flctl.c +1 -1
@@ -384,7 +384,8 @@ static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf,
 	dma_addr_t dma_addr;
 	dma_cookie_t cookie;
 	uint32_t reg;
-	int ret;
+	int ret = 1;

Does not look right. I know this function returns > 0 on positive outcomes but this does not make any sense in the first place.

This function is static and only called twice, please turn it into something like:

if (dma_fifo_transfer())
error
else
ok

Quoted 11 lines
drivers/mtd/nand/raw/sh_flctl.c +2 -1
+	unsigned long time_left;
 
 	if (dir == DMA_FROM_DEVICE) {
 		chan = flctl->chan_fifo0_rx;
@@ -425,13 +426,14 @@ static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf,
 		goto out;
 	}
 
-	ret =
+	time_left =
 	wait_for_completion_timeout(&flctl->dma_complete,

drivers/mtd/nand/raw/sh_flctl.c static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf, · line 439

Quoted 10 lines
drivers/mtd/nand/raw/sh_flctl.c +2 -1
 				msecs_to_jiffies(3000));
 
-	if (ret <= 0) {
+	if (time_left == 0) {
 		dmaengine_terminate_all(chan);
 		dev_err(&flctl->pdev->dev, "wait_for_completion_timeout\n");
+		ret = -ETIMEDOUT;
 	}
 
 out:

Thanks,
Miquèl

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

#4 lore raw

Hi Miquel,

Thanks for your reply.

Quoted 18 lines · Miquel Raynal

Hi Miaoqian,

[email protected] wrote on Tue, 12 Apr 2022 06:36:52 +0000:

Quoted 14 lines

wait_for_completion_timeout() returns unsigned long not int. It returns 0 if timed out, and positive if completed. The check for <= 0 is ambiguous and should be == 0 here indicating timeout which is the only error case.

Fixes 83738d87e3a0 ("mtd: sh_flctl: Add DMA capabilty")

---
change in v2:
- initialize ret to 1.

---
 drivers/mtd/nand/raw/sh_flctl.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)
Quoted 12 lines

drivers/mtd/nand/raw/sh_flctl.c static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf, · line 387

Quoted 10 lines
drivers/mtd/nand/raw/sh_flctl.c +1 -1
index b85b9c6fcc42..2373251f585b 100644
@@ -384,7 +384,8 @@ static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf,
 	dma_addr_t dma_addr;
 	dma_cookie_t cookie;
 	uint32_t reg;
-	int ret;
+	int ret = 1;

Does not look right. I know this function returns > 0 on positive outcomes but this does not make any sense in the first place.

Yes, I made a mistake, Now I realize that in v2, it will return 1 in error path

when DMA submit failed.

And for patch v1, it will return 0  if calls wait_for_completion_timeout succeeds.

Quoted 7 lines

This function is static and only called twice, please turn it into something like:

if (dma_fifo_transfer())
error
else
ok

So I want to keep ret>0 means success.

Or could I set ret > 0 after in wait_for_completion_timeout() success path?

like:

    if(time_left == 0)

            ret = -ETIMEDOUT;

    else

            ret = 1;

What do you think?

Thanks,

Quoted 20 lines
Quoted 20 lines
drivers/mtd/nand/raw/sh_flctl.c +4 -2
+	unsigned long time_left;
 
 	if (dir == DMA_FROM_DEVICE) {
 		chan = flctl->chan_fifo0_rx;
@@ -425,13 +426,14 @@ static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf,
 		goto out;
 	}
 
-	ret =
+	time_left =
 	wait_for_completion_timeout(&flctl->dma_complete,
 				msecs_to_jiffies(3000));
 
-	if (ret <= 0) {
+	if (time_left == 0) {
 		dmaengine_terminate_all(chan);
 		dev_err(&flctl->pdev->dev, "wait_for_completion_timeout\n");
+		ret = -ETIMEDOUT;
 	}
 
Quoted 4 lines

drivers/mtd/nand/raw/sh_flctl.c static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf, · line 439

Quoted 1 line
drivers/mtd/nand/raw/sh_flctl.c +0 -0
 out:

Thanks,
Miquèl

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

maintainer
#5 lore raw

Hi Miaoqian,

[email protected] wrote on Tue, 12 Apr 2022 15:42:02 +0800:

Quoted 36 lines

Hi Miquel,

Thanks for your reply.

Quoted 18 lines · Miquel Raynal

Hi Miaoqian,

[email protected] wrote on Tue, 12 Apr 2022 06:36:52 +0000:

Quoted 14 lines

wait_for_completion_timeout() returns unsigned long not int. It returns 0 if timed out, and positive if completed. The check for <= 0 is ambiguous and should be == 0 here indicating timeout which is the only error case.

Fixes 83738d87e3a0 ("mtd: sh_flctl: Add DMA capabilty")

---
change in v2:
- initialize ret to 1.

---
 drivers/mtd/nand/raw/sh_flctl.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)
Quoted 12 lines

drivers/mtd/nand/raw/sh_flctl.c static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf, · line 387

Quoted 10 lines
drivers/mtd/nand/raw/sh_flctl.c +1 -1
index b85b9c6fcc42..2373251f585b 100644
@@ -384,7 +384,8 @@ static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf,
 	dma_addr_t dma_addr;
 	dma_cookie_t cookie;
 	uint32_t reg;
-	int ret;
+	int ret = 1;  

Does not look right. I know this function returns > 0 on positive outcomes but this does not make any sense in the first place.

Quoted 3 lines

Yes, I made a mistake, Now I realize that in v2, it will return 1 in error path

when DMA submit failed.

Not 1, but a proper error code please (-ETIMEDOUT, -EINVAL, whatever)

Quoted 17 lines

And for patch v1, it will return 0  if calls wait_for_completion_timeout succeeds.

Quoted 7 lines

This function is static and only called twice, please turn it into something like:

if (dma_fifo_transfer())
error
else
ok

So I want to keep ret>0 means success.

Or could I set ret > 0 after in wait_for_completion_timeout() success path?

like:

Quoted 7 lines

    if(time_left == 0)

            ret = -ETIMEDOUT;

    else

            ret = 1;

You can initialize ret to zero at to top. So that anything != 0 is an error (like a lot of functions in the kernel). And use:

	if (dma_fifo_transfer())
		error();
Quoted 30 lines

What do you think?

Thanks,

Quoted 24 lines
Quoted 11 lines
drivers/mtd/nand/raw/sh_flctl.c +2 -1
+	unsigned long time_left;
 
 	if (dir == DMA_FROM_DEVICE) {
 		chan = flctl->chan_fifo0_rx;
@@ -425,13 +426,14 @@ static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf,
 		goto out;
 	}
 
-	ret =
+	time_left =
 	wait_for_completion_timeout(&flctl->dma_complete,

drivers/mtd/nand/raw/sh_flctl.c static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf, · line 439

Quoted 10 lines
drivers/mtd/nand/raw/sh_flctl.c +2 -1
 				msecs_to_jiffies(3000));
 
-	if (ret <= 0) {
+	if (time_left == 0) {
 		dmaengine_terminate_all(chan);
 		dev_err(&flctl->pdev->dev, "wait_for_completion_timeout\n");
+		ret = -ETIMEDOUT;
 	}
 
 out:  

Thanks,
Miquèl

Thanks,
Miquèl

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

#6 lore raw

Hi Miquel,

Quoted 53 lines · Miquel Raynal
Quoted 31 lines
Quoted 19 lines

Hi Miaoqian,

[email protected] wrote on Tue, 12 Apr 2022 06:36:52 +0000:

Quoted 14 lines

wait_for_completion_timeout() returns unsigned long not int. It returns 0 if timed out, and positive if completed. The check for <= 0 is ambiguous and should be == 0 here indicating timeout which is the only error case.

Fixes 83738d87e3a0 ("mtd: sh_flctl: Add DMA capabilty")

---
change in v2:
- initialize ret to 1.

---
 drivers/mtd/nand/raw/sh_flctl.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)
Quoted 12 lines

drivers/mtd/nand/raw/sh_flctl.c static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf, · line 387

Quoted 10 lines
drivers/mtd/nand/raw/sh_flctl.c +1 -1
index b85b9c6fcc42..2373251f585b 100644
@@ -384,7 +384,8 @@ static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf,
 	dma_addr_t dma_addr;
 	dma_cookie_t cookie;
 	uint32_t reg;
-	int ret;
+	int ret = 1;  

Does not look right. I know this function returns > 0 on positive outcomes but this does not make any sense in the first place.

Quoted 3 lines

Yes, I made a mistake, Now I realize that in v2, it will return 1 in error path

when DMA submit failed.

Not 1, but a proper error code please (-ETIMEDOUT, -EINVAL, whatever)

Quoted 17 lines

And for patch v1, it will return 0  if calls wait_for_completion_timeout succeeds.

Quoted 7 lines

This function is static and only called twice, please turn it into something like:

if (dma_fifo_transfer())
error
else
ok

So I want to keep ret>0 means success.

Or could I set ret > 0 after in wait_for_completion_timeout() success path?

like:

    if(time_left == 0)

Quoted 7 lines
Quoted 5 lines

            ret = -ETIMEDOUT;

    else

            ret = 1;

You can initialize ret to zero at to top. So that anything != 0 is an error (like a lot of functions in the kernel).

Thanks for your advice, I will do this.

Quoted 4 lines

And use:

	if (dma_fifo_transfer())
		error();

I think keeping the original condition structure is better, something like:

if (dma_fifo_transfer()==0)

	succeed();

In this way, only minor changes is needed——only need to update the symbol in condition. Otherwise It needs to restructure the code and be more complicated.

Thanks,

Quoted 25 lines
Quoted 25 lines

What do you think?

Thanks,

Quoted 20 lines
Quoted 20 lines
drivers/mtd/nand/raw/sh_flctl.c +4 -2
+	unsigned long time_left;
 
 	if (dir == DMA_FROM_DEVICE) {
 		chan = flctl->chan_fifo0_rx;
@@ -425,13 +426,14 @@ static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf,
 		goto out;
 	}
 
-	ret =
+	time_left =
 	wait_for_completion_timeout(&flctl->dma_complete,
 				msecs_to_jiffies(3000));
 
-	if (ret <= 0) {
+	if (time_left == 0) {
 		dmaengine_terminate_all(chan);
 		dev_err(&flctl->pdev->dev, "wait_for_completion_timeout\n");
+		ret = -ETIMEDOUT;
 	}
 
Quoted 6 lines
Quoted 3 lines
Quoted 3 lines

drivers/mtd/nand/raw/sh_flctl.c static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf, · line 439

Quoted 1 line
drivers/mtd/nand/raw/sh_flctl.c +0 -0
 out:  

Thanks,
Miquèl

Thanks,
Miquèl

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

maintainer
#7 lore raw

Hi Miaoqian,

[email protected] wrote on Tue, 12 Apr 2022 16:23:24 +0800:

Quoted 65 lines

Hi Miquel,

Quoted 53 lines · Miquel Raynal
Quoted 31 lines
Quoted 19 lines

Hi Miaoqian,

[email protected] wrote on Tue, 12 Apr 2022 06:36:52 +0000:

Quoted 14 lines

wait_for_completion_timeout() returns unsigned long not int. It returns 0 if timed out, and positive if completed. The check for <= 0 is ambiguous and should be == 0 here indicating timeout which is the only error case.

Fixes 83738d87e3a0 ("mtd: sh_flctl: Add DMA capabilty")

---
change in v2:
- initialize ret to 1.

---
 drivers/mtd/nand/raw/sh_flctl.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)
Quoted 12 lines

drivers/mtd/nand/raw/sh_flctl.c static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf, · line 387

Quoted 10 lines
drivers/mtd/nand/raw/sh_flctl.c +1 -1
index b85b9c6fcc42..2373251f585b 100644
@@ -384,7 +384,8 @@ static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf,
 	dma_addr_t dma_addr;
 	dma_cookie_t cookie;
 	uint32_t reg;
-	int ret;
+	int ret = 1;    

Does not look right. I know this function returns > 0 on positive outcomes but this does not make any sense in the first place.

Quoted 3 lines

Yes, I made a mistake, Now I realize that in v2, it will return 1 in error path

when DMA submit failed.

Not 1, but a proper error code please (-ETIMEDOUT, -EINVAL, whatever)

Quoted 17 lines

And for patch v1, it will return 0  if calls wait_for_completion_timeout succeeds.

Quoted 7 lines

This function is static and only called twice, please turn it into something like:

if (dma_fifo_transfer())
error
else
ok

So I want to keep ret>0 means success.

Or could I set ret > 0 after in wait_for_completion_timeout() success path?

like:

    if(time_left == 0)

Quoted 7 lines
Quoted 5 lines

            ret = -ETIMEDOUT;

    else

            ret = 1;

You can initialize ret to zero at to top. So that anything != 0 is an error (like a lot of functions in the kernel).

Thanks for your advice, I will do this.

Quoted 8 lines
Quoted 4 lines

And use:

	if (dma_fifo_transfer())
		error();  

I think keeping the original condition structure is better, something like:

if (dma_fifo_transfer()==0)

  if (cond && cond && !dma_fifo_transfer())
Quoted 39 lines
	succeed();

In this way, only minor changes is needed——only need to update the symbol in condition. Otherwise It needs to restructure the code and be more complicated.

Thanks,

Quoted 31 lines
Quoted 28 lines

What do you think?

Thanks,

Quoted 23 lines
Quoted 11 lines
drivers/mtd/nand/raw/sh_flctl.c +2 -1
+	unsigned long time_left;
 
 	if (dir == DMA_FROM_DEVICE) {
 		chan = flctl->chan_fifo0_rx;
@@ -425,13 +426,14 @@ static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf,
 		goto out;
 	}
 
-	ret =
+	time_left =
 	wait_for_completion_timeout(&flctl->dma_complete,

drivers/mtd/nand/raw/sh_flctl.c static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf, · line 439

Quoted 10 lines
drivers/mtd/nand/raw/sh_flctl.c +2 -1
 				msecs_to_jiffies(3000));
 
-	if (ret <= 0) {
+	if (time_left == 0) {
 		dmaengine_terminate_all(chan);
 		dev_err(&flctl->pdev->dev, "wait_for_completion_timeout\n");
+		ret = -ETIMEDOUT;
 	}
 
 out:    

Thanks,
Miquèl

Thanks,
Miquèl

Thanks,
Miquèl

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

#8 lore raw

PATCH v3 1/1 mtd: rawnand: Fix return value check of wait_for_completion_timeout

wait_for_completion_timeout() returns unsigned long not int. It returns 0 if timed out, and positive if completed. The check for <= 0 is ambiguous and should be == 0 here indicating timeout which is the only error case.

Fixes 83738d87e3a0 ("mtd: sh_flctl: Add DMA capabilty")

---
change in v2:
- initialize ret to 1.
---
changes in v3:
- initialize ret to 0, now ret==0 means success.
- update condition check in caller.

---
 drivers/mtd/nand/raw/sh_flctl.c | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)
drivers/mtd/nand/raw/sh_flctl.c +8 -6
index b85b9c6fcc42..a278829469d6 100644
@@ -384,7 +384,8 @@ static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf,
 	dma_addr_t dma_addr;
 	dma_cookie_t cookie;
 	uint32_t reg;
-	int ret;
+	int ret = 0;
+	unsigned long time_left;
 
 	if (dir == DMA_FROM_DEVICE) {
 		chan = flctl->chan_fifo0_rx;
@@ -425,13 +426,14 @@ static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf,
 		goto out;
 	}
 
-	ret =
+	time_left =
 	wait_for_completion_timeout(&flctl->dma_complete,
 				msecs_to_jiffies(3000));
 
-	if (ret <= 0) {
+	if (time_left == 0) {
 		dmaengine_terminate_all(chan);
 		dev_err(&flctl->pdev->dev, "wait_for_completion_timeout\n");
+		ret = -ETIMEDOUT;
 	}
 
 out:
@@ -441,7 +443,7 @@ static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf,
 
 	dma_unmap_single(chan->device->dev, dma_addr, len, dir);
 
-	/* ret > 0 is success */
+	/* ret == 0 is success */
 	return ret;
 }
 
@@ -465,7 +467,7 @@ static void read_fiforeg(struct sh_flctl *flctl, int rlen, int offset)
 
 	/* initiate DMA transfer */
 	if (flctl->chan_fifo0_rx && rlen >= 32 &&
-		flctl_dma_fifo0_transfer(flctl, buf, rlen, DMA_FROM_DEVICE) > 0)
+		!flctl_dma_fifo0_transfer(flctl, buf, rlen, DMA_FROM_DEVICE))
 			goto convert;	/* DMA success */
 
 	/* do polling transfer */
@@ -524,7 +526,7 @@ static void write_ec_fiforeg(struct sh_flctl *flctl, int rlen,
 
 	/* initiate DMA transfer */
 	if (flctl->chan_fifo0_tx && rlen >= 32 &&
-		flctl_dma_fifo0_transfer(flctl, buf, rlen, DMA_TO_DEVICE) > 0)
+		!flctl_dma_fifo0_transfer(flctl, buf, rlen, DMA_TO_DEVICE))
 			return;	/* DMA success */
 
 	/* do polling transfer */
Signature · 6 lines
2.17.1


______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
maintainer Applied
#9 lore raw
Quoted 7 lines · Miaoqian Lin

wait_for_completion_timeout() returns unsigned long not int. It returns 0 if timed out, and positive if completed. The check for <= 0 is ambiguous and should be == 0 here indicating timeout which is the only error case.

Fixes 83738d87e3a0 ("mtd: sh_flctl: Add DMA capabilty")

Applied to https://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux.git mtd/fixes, thanks.

Miquel

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