From: Michael Neuling <mikey@neuling.org>
To: Vaibhav Jain <vaibhav@linux.vnet.ibm.com>
Cc: linuxppc-dev@lists.ozlabs.org, Ian Munsie <imunsie@au1.ibm.com>,
Michael Ellerman <michael@ellerman.id.au>
Subject: Re: [PATCH v3] cxl: Export AFU error buffer via sysfs
Date: Thu, 21 May 2015 09:46:10 +1000 [thread overview]
Message-ID: <1432165570.27130.5.camel@neuling.org> (raw)
In-Reply-To: <1432142313-7741-1-git-send-email-vaibhav@linux.vnet.ibm.com>
+ */
> +ssize_t cxl_afu_read_err_buffer(struct cxl_afu *afu, char *buf,
> + loff_t off, size_t count)
> +{
> + loff_t aligned_off;
> + size_t aligned_count;
> + const void __iomem *ebuf =3D afu->afu_desc_mmio + afu->eb_offset;
> +
> + if (!afu->eb_len || count =3D=3D 0 || off < 0)
if eb_len =3D=3D 0 we don't even create the sysfs file. So is this check
needed?
> + return 0;
> +
> + /* calculate aligned read window */
> + count =3D min((size_t)(afu->eb_len - off), count);
What if count ends up being negative because off > afu->eb_len??
> + aligned_off =3D round_down(off, 8);
> + aligned_count =3D round_up(off + count, 8) - aligned_off;
I kinda preferred the start end variables, and length was just end -
start.
I though it was more readable. IMHO
How about:
aligned_start =3D round_down(off, 8);
aligned_end =3D round_up(off + count, 8);
aligned_length =3D aligned_end - aligned_start;
> +
> + /* fast path */
> + if ((aligned_off =3D=3D off) && (aligned_count =3D=3D count)) {
> + /* no need to use the bounce buffer */
> + _memcpy_fromio(buf, ebuf + off, count);
I would drop this, as the other code path should work fine.
Premature optimisation.....
> +
> + } else {
> + /* use bounce buffer for copy */
> + void *tbuf =3D (void *)__get_free_page(GFP_TEMPORARY);
> +
> + if (!tbuf)
> + return -ENOMEM;
> +
> + /* max we can copy in one read is PAGE_SIZE */
> + aligned_count =3D min(aligned_count, PAGE_SIZE);
> + _memcpy_fromio(tbuf, ebuf + aligned_off, aligned_count);
> +
> + count =3D min(count, aligned_count);
This doesn't seem right. count will equal PAGE_SIZE if it's too big but
it has to be smaller by (off & 7) in this case.
How about this?
#define MAX_COPY_SIZE PAGE_SIZE
...
void *bbuf;
/* Bounds check count with err buf length */
count =3D min((size_t)(afu->eb_len - off), count);
if ((off < 0) || (count < 0))
return 0;
/* Create aligned bounce buffer to copy into */
aligned_start =3D round_down(off, 8);
aligned_end =3D round_up(off + count, 8);
aligned_length =3D aligned_end - aligned_start;
if (aligned_length > MAX_COPY_SIZE) {
aligned_length =3D MAX_COPY_SIZE;
count =3D MAX_COPY_SIZE - (off & 0x7);
}
bbuf =3D (void *)__get_free_page(GFP_TEMPORARY);
if (!bbuf)
return -ENOMEM;
/* Use _memcpy_fromio() so the reads are aligned */
_memcpy_fromio(bbuf, ebuf + aligned_start, aligned_length);
memcpy(buf, bbuf + (off & 0x7), count);
free_page(bbuf);
> + memcpy(buf, tbuf + (off & 0x7), count);
> +
> + free_page((unsigned long)tbuf);
> + }
> +
> + return count;
next prev parent reply other threads:[~2015-05-20 23:46 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-20 17:18 [PATCH v3] cxl: Export AFU error buffer via sysfs Vaibhav Jain
2015-05-20 23:46 ` Michael Neuling [this message]
2015-05-21 3:36 ` trigg
2015-05-21 3:48 ` Michael Neuling
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=1432165570.27130.5.camel@neuling.org \
--to=mikey@neuling.org \
--cc=imunsie@au1.ibm.com \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=michael@ellerman.id.au \
--cc=vaibhav@linux.vnet.ibm.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.