Message ID | 20230215032155.74993-7-damien.lemoal@opensource.wdc.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | PCI endpoint fixes and improvements | expand |
On Wed, Feb 15, 2023 at 12:21:49PM +0900, Damien Le Moal wrote: > In pci_epf_test_print_rate(), instead of open coding a reduction loop to > allow for a disivision by a 32-bits ns value, simply use div64_u64() to > calculate the rate. To match the printed unit of KB/s, this calculation > divides the rate by 1000 instead of 1024 (that would be KiB/s unit). > > The format of the results printed by pci_epf_test_print_rate() is also > changed to be more compact without the double new line. dev_info() is > used instead of pr_info(). > > Signed-off-by: Damien Le Moal <damien.lemoal@opensource.wdc.com> Reviewed-by: Manivannan Sadhasivam <mani@kernel.org> Thanks, Mani > --- > drivers/pci/endpoint/functions/pci-epf-test.c | 42 ++++++++----------- > 1 file changed, 17 insertions(+), 25 deletions(-) > > diff --git a/drivers/pci/endpoint/functions/pci-epf-test.c b/drivers/pci/endpoint/functions/pci-epf-test.c > index e07868c99531..f630393e8208 100644 > --- a/drivers/pci/endpoint/functions/pci-epf-test.c > +++ b/drivers/pci/endpoint/functions/pci-epf-test.c > @@ -297,34 +297,23 @@ static void pci_epf_test_clean_dma_chan(struct pci_epf_test *epf_test) > return; > } > > -static void pci_epf_test_print_rate(const char *ops, u64 size, > +static void pci_epf_test_print_rate(struct pci_epf_test *epf_test, > + const char *op, u64 size, > struct timespec64 *start, > struct timespec64 *end, bool dma) > { > - struct timespec64 ts; > - u64 rate, ns; > - > - ts = timespec64_sub(*end, *start); > - > - /* convert both size (stored in 'rate') and time in terms of 'ns' */ > - ns = timespec64_to_ns(&ts); > - rate = size * NSEC_PER_SEC; > - > - /* Divide both size (stored in 'rate') and ns by a common factor */ > - while (ns > UINT_MAX) { > - rate >>= 1; > - ns >>= 1; > - } > - > - if (!ns) > - return; > + struct timespec64 ts = timespec64_sub(*end, *start); > + u64 rate = 0, ns; > > /* calculate the rate */ > - do_div(rate, (uint32_t)ns); > + ns = timespec64_to_ns(&ts); > + if (ns) > + rate = div64_u64(size * NSEC_PER_SEC, ns * 1000); > > - pr_info("\n%s => Size: %llu bytes\t DMA: %s\t Time: %llu.%09u seconds\t" > - "Rate: %llu KB/s\n", ops, size, dma ? "YES" : "NO", > - (u64)ts.tv_sec, (u32)ts.tv_nsec, rate / 1024); > + dev_info(&epf_test->epf->dev, > + "%s => Size: %llu B, DMA: %s, Time: %llu.%09u s, Rate: %llu KB/s\n", > + op, size, dma ? "YES" : "NO", > + (u64)ts.tv_sec, (u32)ts.tv_nsec, rate); > } > > static int pci_epf_test_copy(struct pci_epf_test *epf_test, bool use_dma) > @@ -400,7 +389,8 @@ static int pci_epf_test_copy(struct pci_epf_test *epf_test, bool use_dma) > kfree(buf); > } > ktime_get_ts64(&end); > - pci_epf_test_print_rate("COPY", reg->size, &start, &end, use_dma); > + pci_epf_test_print_rate(epf_test, "COPY", reg->size, &start, &end, > + use_dma); > > err_map_addr: > pci_epc_unmap_addr(epc, epf->func_no, epf->vfunc_no, dst_phys_addr); > @@ -481,7 +471,8 @@ static int pci_epf_test_read(struct pci_epf_test *epf_test, bool use_dma) > ktime_get_ts64(&end); > } > > - pci_epf_test_print_rate("READ", reg->size, &start, &end, use_dma); > + pci_epf_test_print_rate(epf_test, "READ", reg->size, &start, &end, > + use_dma); > > crc32 = crc32_le(~0, buf, reg->size); > if (crc32 != reg->checksum) > @@ -567,7 +558,8 @@ static int pci_epf_test_write(struct pci_epf_test *epf_test, bool use_dma) > ktime_get_ts64(&end); > } > > - pci_epf_test_print_rate("WRITE", reg->size, &start, &end, use_dma); > + pci_epf_test_print_rate(epf_test, "WRITE", reg->size, &start, &end, > + use_dma); > > /* > * wait 1ms inorder for the write to complete. Without this delay L3 > -- > 2.39.1 >
diff --git a/drivers/pci/endpoint/functions/pci-epf-test.c b/drivers/pci/endpoint/functions/pci-epf-test.c index e07868c99531..f630393e8208 100644 --- a/drivers/pci/endpoint/functions/pci-epf-test.c +++ b/drivers/pci/endpoint/functions/pci-epf-test.c @@ -297,34 +297,23 @@ static void pci_epf_test_clean_dma_chan(struct pci_epf_test *epf_test) return; } -static void pci_epf_test_print_rate(const char *ops, u64 size, +static void pci_epf_test_print_rate(struct pci_epf_test *epf_test, + const char *op, u64 size, struct timespec64 *start, struct timespec64 *end, bool dma) { - struct timespec64 ts; - u64 rate, ns; - - ts = timespec64_sub(*end, *start); - - /* convert both size (stored in 'rate') and time in terms of 'ns' */ - ns = timespec64_to_ns(&ts); - rate = size * NSEC_PER_SEC; - - /* Divide both size (stored in 'rate') and ns by a common factor */ - while (ns > UINT_MAX) { - rate >>= 1; - ns >>= 1; - } - - if (!ns) - return; + struct timespec64 ts = timespec64_sub(*end, *start); + u64 rate = 0, ns; /* calculate the rate */ - do_div(rate, (uint32_t)ns); + ns = timespec64_to_ns(&ts); + if (ns) + rate = div64_u64(size * NSEC_PER_SEC, ns * 1000); - pr_info("\n%s => Size: %llu bytes\t DMA: %s\t Time: %llu.%09u seconds\t" - "Rate: %llu KB/s\n", ops, size, dma ? "YES" : "NO", - (u64)ts.tv_sec, (u32)ts.tv_nsec, rate / 1024); + dev_info(&epf_test->epf->dev, + "%s => Size: %llu B, DMA: %s, Time: %llu.%09u s, Rate: %llu KB/s\n", + op, size, dma ? "YES" : "NO", + (u64)ts.tv_sec, (u32)ts.tv_nsec, rate); } static int pci_epf_test_copy(struct pci_epf_test *epf_test, bool use_dma) @@ -400,7 +389,8 @@ static int pci_epf_test_copy(struct pci_epf_test *epf_test, bool use_dma) kfree(buf); } ktime_get_ts64(&end); - pci_epf_test_print_rate("COPY", reg->size, &start, &end, use_dma); + pci_epf_test_print_rate(epf_test, "COPY", reg->size, &start, &end, + use_dma); err_map_addr: pci_epc_unmap_addr(epc, epf->func_no, epf->vfunc_no, dst_phys_addr); @@ -481,7 +471,8 @@ static int pci_epf_test_read(struct pci_epf_test *epf_test, bool use_dma) ktime_get_ts64(&end); } - pci_epf_test_print_rate("READ", reg->size, &start, &end, use_dma); + pci_epf_test_print_rate(epf_test, "READ", reg->size, &start, &end, + use_dma); crc32 = crc32_le(~0, buf, reg->size); if (crc32 != reg->checksum) @@ -567,7 +558,8 @@ static int pci_epf_test_write(struct pci_epf_test *epf_test, bool use_dma) ktime_get_ts64(&end); } - pci_epf_test_print_rate("WRITE", reg->size, &start, &end, use_dma); + pci_epf_test_print_rate(epf_test, "WRITE", reg->size, &start, &end, + use_dma); /* * wait 1ms inorder for the write to complete. Without this delay L3
In pci_epf_test_print_rate(), instead of open coding a reduction loop to allow for a disivision by a 32-bits ns value, simply use div64_u64() to calculate the rate. To match the printed unit of KB/s, this calculation divides the rate by 1000 instead of 1024 (that would be KiB/s unit). The format of the results printed by pci_epf_test_print_rate() is also changed to be more compact without the double new line. dev_info() is used instead of pr_info(). Signed-off-by: Damien Le Moal <damien.lemoal@opensource.wdc.com> --- drivers/pci/endpoint/functions/pci-epf-test.c | 42 ++++++++----------- 1 file changed, 17 insertions(+), 25 deletions(-)