From: "Franklin S Cooper Jr." <fcooper-l0cyMroinI0@public.gmane.org>
To: Andy Shevchenko
<andy.shevchenko-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Cc: <david.s.gordon-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>,
Jens Axboe <axboe-b10kYP2dOMg@public.gmane.org>,
Andrew Morton
<akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org>,
Ming Lin <ming.l-Vzezgt5dB6uUEJcrhfAQsw@public.gmane.org>,
"linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org"
<linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
Mark Brown <broonie-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>,
linux-spi <linux-spi-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
Sekhar Nori <nsekhar-l0cyMroinI0@public.gmane.org>,
Peter Ujfalusi <peter.ujfalusi-l0cyMroinI0@public.gmane.org>
Subject: Re: [RFC] [PATCH v2 1/3] scatterlist: Add support to clone scatterlist
Date: Wed, 6 Jul 2016 12:09:48 -0500 [thread overview]
Message-ID: <577D3B5C.7080805@ti.com> (raw)
In-Reply-To: <CAHp75VfR=TKfVN=03jvGy5oZRA_-ASb8Vb_A4+x3OrkpZT6PoQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
On 07/05/2016 12:10 PM, Andy Shevchenko wrote:
> On Mon, Jun 27, 2016 at 5:54 PM, Franklin S Cooper Jr <fcooper-l0cyMroinI0@public.gmane.org> wrote:
>> Occasionally there are times you need to tweak a chained S/G list while
>> maintaining the original list. This function will duplicate the passed
>> in chained S/G list and return a pointer to the cloned copy.
>>
>> The function also supports passing in a length that can be equal or less
>> than the original chained S/G list length. Reducing the length can result
>> in less entries of the chained S/G list being created.
>
> My comments below.
>
>> +struct sg_table *sg_table_clone(struct sg_table *orig_table, u64 len,
>> + gfp_t gfp_mask);
>
> size_t len ?
> Or it would be commented somewhere why u64.
No reason other than sg_nents_for_len required u64. But I see other
users of that function using size_t so I'll fix this.
>
>> +/*
>> + * sg_clone - Duplicate an existing chained sgl
>> + * @orig_sgl: Original sg list to be duplicated
>> + * @len: Total length of sg while taking chaining into account
>> + * @gfp_mask: GFP allocation mask
>> + *
>> + * Description:
>> + * Clone a chained sgl. This cloned copy may be modified in some ways while
>> + * keeping the original sgl in tact. Also allow the cloned copy to have
>> + * a smaller length than the original which may reduce the sgl total
>> + * sg entries.
>> + *
>> + * Returns:
>> + * Pointer to new kmalloced sg list, ERR_PTR() on error
>
> Maybe "...new allocated SG list using kmalloc()..." ?
Will fix
>
>> + *
>
> Extra line.
Will fix along with all the other extra line comments.
>
>> + */
>> +static struct scatterlist *sg_clone(struct scatterlist *orig_sgl, u64 len,
>> + gfp_t gfp_mask)
>> +{
>> + unsigned int nents;
>> + bool last_entry;
>> + struct scatterlist *sgl, *head;
>> +
>> + nents = sg_nents_for_len(orig_sgl, len);
>> +
>
> Ditto.
>
>> + if (nents < 0)
>
>> + return ERR_PTR(-EINVAL);
>
> return ERR_PTR(nents);
Will fix
>
>> +
>> + head = sg_kmalloc(nents, gfp_mask);
>> +
>
> Extra line.
>
>> + if (!head)
>> + return ERR_PTR(-ENOMEM);
>> +
>
>> + sgl = head;
>> +
>> + sg_init_table(sgl, nents);
>> +
>> + for (; sgl; orig_sgl = sg_next(orig_sgl), sgl = sg_next(sgl)) {
>
> Maybe
>
> sg_init_table(head, nents);
>
> for (sgl = head; sgl; ...
Yeah that will probably look better. Will fix.
>
>> +
>> + last_entry = sg_is_last(sgl);
>> + *sgl = *orig_sgl;
>> +
>> + /*
>> + * If page_link is pointing to a chained sgl then set it to
>> + * zero since we already compensated for chained sgl. If
>> + * page_link is pointing to a page then clear bits 1 and 0.
>> + */
>> + if (sg_is_chain(orig_sgl))
>> + sgl->page_link = 0x0;
>> + else
>> + sgl->page_link &= ~0x03;
>> +
>
>> + if (last_entry) {
>> + sg_dma_len(sgl) = len;
>
> Hmm... If it's not DMA mapped and CONFIG_NEED_SG_DMA_LENGTH=y, you
> will set dma_length field and len otherwise. Is it on purpose?
Thanks for pointing this out. I didn't take into consideration the above
scenario.
After looking at this more it seems like on occasion dma_length !=
length. I see this occurring in various map_sg functions for several
architectures.
I'm simply trying to reduce the overall sgl length by a certain amount.
I'm not sure what the proper approach would be since dma_length and
length can be set to different values. Simply setting sgl->dma_length to
sgl->length or vice a versa seems like it can be problematic in some
scenarios. What confuses me even more is if dma_length != length then
how can sg_nents_for_len only use the sgl length property.
Any thoughts on what would be the best way to handle this?
How about something like the following to address your original question?
sgl->length = len
if (sgl->dma_address)
sg_dma_len(sgl) = sgl->length
>
>> + /* Set bit 1 to indicate end of sgl */
>> + sgl->page_link |= 0x02;
>> + } else {
>
>> + len -= sg_dma_len(sgl);
len -= sgl->length
>
> Ditto.
>
>> + }
>> + }
>> +
>> + return head;
>> +}
>> +
>> +/*
>> + * sg_table_clone - Duplicate an existing sg_table including chained sgl
>> + * @orig_table: Original sg_table to be duplicated
>> + * @len: Total length of sg while taking chaining into account
>> + * @gfp_mask: GFP allocation mask
>> + *
>> + * Description:
>> + * Clone a sg_table along with chained sgl. This cloned copy may be
>> + * modified in some ways while keeping the original table and sgl in tact.
>> + * Also allow the cloned sgl copy to have a smaller length than the original
>> + * which may reduce the sgl total sg entries.
>> + *
>> + * Returns:
>> + * Pointer to new kmalloced sg_table, ERR_PTR() on error
>> + *
>> + */
>> +struct sg_table *sg_table_clone(struct sg_table *orig_table, u64 len,
>> + gfp_t gfp_mask)
>> +{
>> + struct sg_table *table;
>> +
>> + table = kmalloc(sizeof(struct sg_table), gfp_mask);
>> +
>
> Extra line.
>
>> + if (!table)
>> + return ERR_PTR(-ENOMEM);
>> +
>> + table->sgl = sg_clone(orig_table->sgl, len, gfp_mask);
>> +
>
> Ditto.
>
>> + if (IS_ERR(table->sgl)) {
>> + kfree(table);
>> + return ERR_PTR(-ENOMEM);
>> + }
>> +
>> + table->nents = table->orig_nents = sg_nents(table->sgl);
>> +
>> + return table;
>> +}
>
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2016-07-06 17:09 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-06-27 14:54 [RFC] [PATCH v2 0/3] scatterlist: Add support to clone sg_table Franklin S Cooper Jr
[not found] ` <1467039249-7816-1-git-send-email-fcooper-l0cyMroinI0@public.gmane.org>
2016-06-27 14:54 ` [RFC] [PATCH v2 1/3] scatterlist: Add support to clone scatterlist Franklin S Cooper Jr
[not found] ` <1467039249-7816-2-git-send-email-fcooper-l0cyMroinI0@public.gmane.org>
2016-07-05 14:49 ` Mark Brown
2016-07-05 16:47 ` Andy Shevchenko
2016-07-05 17:10 ` Andy Shevchenko
[not found] ` <CAHp75VfR=TKfVN=03jvGy5oZRA_-ASb8Vb_A4+x3OrkpZT6PoQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-07-06 17:09 ` Franklin S Cooper Jr. [this message]
2016-07-06 17:46 ` Andy Shevchenko
[not found] ` <CAHp75VcPLV-483ihn_RmHnDOc0iFMSdYj5_SrNevyqrrpeWatQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-07-06 19:39 ` Franklin S Cooper Jr.
2016-07-06 22:04 ` Robert Jarzmik
[not found] ` <871t368lu6.fsf-4ty26DBLk+jEm7gnYqmdkQ@public.gmane.org>
2016-07-07 8:02 ` Mark Brown
[not found] ` <20160707080241.GE6247-GFdadSzt00ze9xe1eoZjHA@public.gmane.org>
2016-07-07 17:43 ` Robert Jarzmik
[not found] ` <87twg1739e.fsf-4ty26DBLk+jEm7gnYqmdkQ@public.gmane.org>
2016-07-08 8:18 ` Mark Brown
2016-07-12 17:14 ` Robert Jarzmik
2016-07-07 15:58 ` Franklin S Cooper Jr.
2016-07-06 10:15 ` Sekhar Nori
[not found] ` <577CDA45.80408-l0cyMroinI0@public.gmane.org>
2016-07-06 17:20 ` Franklin S Cooper Jr.
2016-06-27 14:54 ` [RFC] [PATCH v2 2/3] spi: omap2-mcspi: Add comments for RX only DMA buffer workaround Franklin S Cooper Jr
2016-06-27 14:54 ` [RFC] [PATCH v2 3/3] spi: omap2-mcspi: Use the SPI framework to handle DMA mapping Franklin S Cooper Jr
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=577D3B5C.7080805@ti.com \
--to=fcooper-l0cymroini0@public.gmane.org \
--cc=akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org \
--cc=andy.shevchenko-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
--cc=axboe-b10kYP2dOMg@public.gmane.org \
--cc=broonie-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
--cc=david.s.gordon-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
--cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-spi-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=ming.l-Vzezgt5dB6uUEJcrhfAQsw@public.gmane.org \
--cc=nsekhar-l0cyMroinI0@public.gmane.org \
--cc=peter.ujfalusi-l0cyMroinI0@public.gmane.org \
/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;
as well as URLs for NNTP newsgroup(s).