From: Benny Halevy <bhalevy@tonian.com>
To: tao.peng@emc.com
Cc: bergwolf@gmail.com, linux-nfs@vger.kernel.org,
Trond.Myklebust@netapp.com
Subject: Re: [PATCH 7/8] pnfsblock: add im_extents to pnfs_inval_markings
Date: Thu, 10 Nov 2011 11:39:54 +0200 [thread overview]
Message-ID: <4EBB9BEA.1080802@tonian.com> (raw)
In-Reply-To: <F19688880B763E40B28B2B462677FBF805DD054C45@MX09A.corp.emc.com>
On 2011-11-10 11:37, tao.peng@emc.com wrote:
>> -----Original Message-----
>> From: Benny Halevy [mailto:bhalevy@tonian.com]
>> Sent: Thursday, November 10, 2011 5:21 PM
>> To: Peng Tao
>> Cc: linux-nfs@vger.kernel.org; Trond.Myklebust@netapp.com; Peng, Tao
>> Subject: Re: [PATCH 7/8] pnfsblock: add im_extents to pnfs_inval_markings
>>
>> On 2011-11-10 10:54, Benny Halevy wrote:
>>> On 2011-11-09 17:16, Peng Tao wrote:
>>>> It stores a list of short extents for INVAL->RW conversion.
>>>> Also add two functions to manipulate them, in preparation to
>>>> move malloc logic out of end_io.
>>>>
>>>> Signed-off-by: Peng Tao <peng_tao@emc.com>
>>>> ---
>>>> fs/nfs/blocklayout/blocklayout.c | 6 ++++++
>>>> fs/nfs/blocklayout/blocklayout.h | 5 +++++
>>>> fs/nfs/blocklayout/extents.c | 37
>> +++++++++++++++++++++++++++++++++++++
>>>> 3 files changed, 48 insertions(+), 0 deletions(-)
>>>>
>>>> diff --git a/fs/nfs/blocklayout/blocklayout.c b/fs/nfs/blocklayout/blocklayout.c
>>>> index 815c0c3..cb4ff0f 100644
>>>> --- a/fs/nfs/blocklayout/blocklayout.c
>>>> +++ b/fs/nfs/blocklayout/blocklayout.c
>>>> @@ -706,11 +706,17 @@ static void
>>>> release_inval_marks(struct pnfs_inval_markings *marks)
>>>> {
>>>> struct pnfs_inval_tracking *pos, *temp;
>>>> + struct pnfs_block_short_extent *se, *stemp;
>>>>
>>>> list_for_each_entry_safe(pos, temp, &marks->im_tree.mtt_stub, it_link) {
>>>> list_del(&pos->it_link);
>>>> kfree(pos);
>>>> }
>>>> +
>>>> + list_for_each_entry_safe(se, stemp, &marks->im_extents, bse_node) {
>>>> + list_del(&se->bse_node);
>>>> + kfree(se);
>>>> + }
>>>> return;
>>>> }
>>>>
>>>> diff --git a/fs/nfs/blocklayout/blocklayout.h b/fs/nfs/blocklayout/blocklayout.h
>>>> index 60728ac..df0e0fb 100644
>>>> --- a/fs/nfs/blocklayout/blocklayout.h
>>>> +++ b/fs/nfs/blocklayout/blocklayout.h
>>>> @@ -70,6 +70,7 @@ struct pnfs_inval_markings {
>>>> spinlock_t im_lock;
>>>> struct my_tree im_tree; /* Sectors that need LAYOUTCOMMIT */
>>>> sector_t im_block_size; /* Server blocksize in sectors */
>>>> + struct list_head im_extents; /* List of short extents for INVAL->RW conversion
>> */
>>>> };
>>>>
>>>> struct pnfs_inval_tracking {
>>>> @@ -105,6 +106,7 @@ BL_INIT_INVAL_MARKS(struct pnfs_inval_markings
>> *marks, sector_t blocksize)
>>>> {
>>>> spin_lock_init(&marks->im_lock);
>>>> INIT_LIST_HEAD(&marks->im_tree.mtt_stub);
>>>> + INIT_LIST_HEAD(&marks->im_extents);
>>>> marks->im_block_size = blocksize;
>>>> marks->im_tree.mtt_step_size = min((sector_t)PAGE_CACHE_SECTORS,
>>>> blocksize);
>>>> @@ -200,5 +202,8 @@ int bl_add_merge_extent(struct pnfs_block_layout *bl,
>>>> struct pnfs_block_extent *new);
>>>> int bl_mark_for_commit(struct pnfs_block_extent *be,
>>>> sector_t offset, sector_t length);
>>>> +int bl_push_one_short_extent(struct pnfs_inval_markings *marks);
>>>> +struct pnfs_block_short_extent*
>>>> +bl_pop_short_extent(struct pnfs_inval_markings *marks, int num_to_pop);
>>>>
>>>> #endif /* FS_NFS_NFS4BLOCKLAYOUT_H */
>>>> diff --git a/fs/nfs/blocklayout/extents.c b/fs/nfs/blocklayout/extents.c
>>>> index 952ea8a..72c7fa1 100644
>>>> --- a/fs/nfs/blocklayout/extents.c
>>>> +++ b/fs/nfs/blocklayout/extents.c
>>>> @@ -863,3 +863,40 @@ clean_pnfs_block_layoutupdate(struct
>> pnfs_block_layout *bl,
>>>> }
>>>> }
>>>> }
>>>> +
>>>> +int
>>>> +bl_push_one_short_extent(struct pnfs_inval_markings *marks) {
>>>> + struct pnfs_block_short_extent *new;
>>>> +
>>>> + new = kmalloc(sizeof(*new), GFP_NOFS);
>>>> + if (unlikely(!new))
>>>> + return -ENOMEM;
>>>> +
>>>> + spin_lock(&marks->im_lock);
>>>> + list_add(&new->bse_node, &marks->im_extents);
>>>> + spin_unlock(&marks->im_lock);
>>>> +
>>>> + return 0;
>>>> +}
>>>> +
>>>> +struct pnfs_block_short_extent*
>>>> +bl_pop_short_extent(struct pnfs_inval_markings *marks, int num_to_pop) {
>>>> + struct pnfs_block_short_extent *rv = NULL;
>>
>> The use case for bl_pop_short_extent comes only in the next patch
>> so it should be introduced there in principle, along with its use.
> I was hoping not to create too large single patch... But since you asked, I will merge them into one.
>
>>
>> With that in mind, there is one call site with num_to_pop == 1
>> in which you don't free any entry, and the other with num_to_pop == num_se
>> which seems to free all the members of the list, but the last one,
>> which is then freed by the caller.
>>
>> This tells me you crammed two functions into one and you better
>> have one that pops a single element and another to destroy the list.
> Good point. I thought there might be more users of the function when I first wrote it but apparently I am wrong...
> I will split it into bl_pop_one_short_extent() and bl_free_short_extents() as you suggested.
Terrific.
>
> Thank you very much!
Thanks you for doing all the hard work!
Benny
> Tao
>
>>
>> Benny
>>
>>>> +
>>>> + if (unlikely(num_to_pop <= 0))
>>>> + return rv;
>>>
>>> How unlikely is it?
>>> Is doing the extra compare really worth saving the spin_lock?
>>>
>>>> +
>>>> + spin_lock(&marks->im_lock);
>>>> + while (!list_empty(&marks->im_extents) && num_to_pop-- > 0) {
>>>> + rv = list_entry((&marks->im_extents)->next,
>>>> + struct pnfs_block_short_extent, bse_node);
>>>> + list_del_init(&rv->bse_node);
>>>> + if (num_to_pop)
>>>> + kfree(rv);
>>>
>>> Please correct me if I'm wrong, you don't want to free the last element
>>> you pop since you want to return it. This is worth a comment...
>>>
>>> I'd consider moving the decrement expression down here or
>>> changing the loop to be a for loop to improve its readability.
>>> In the latter case this will say if (num_to_pop > 1) kfree(rv)
>>> which is more straight forward IMHO.
>>>
>>> Benny
>>>
>>>> + }
>>>> + spin_unlock(&marks->im_lock);
>>>> +
>>>> + BUG_ON(num_to_pop > 0);
>>>> +
>>>> + return rv;
>>>> +}
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2011-11-10 9:39 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-11-09 15:15 [PATCH 0/8] pnfsblock cleanup and fixes Peng Tao
2011-11-09 15:15 ` [PATCH 1/8] pnfsblock: cleanup bl_mark_sectors_init Peng Tao
2011-11-09 15:16 ` [PATCH 3/8] pnfsblock: move find lock page logic out of bl_write_pagelist Peng Tao
2011-11-10 8:32 ` Benny Halevy
2011-11-10 8:49 ` tao.peng
2011-11-10 9:31 ` Benny Halevy
2011-11-10 9:40 ` tao.peng
2011-11-09 15:16 ` [PATCH 4/8] pnfsblock: set read/write tk_status to pnfs_error Peng Tao
2011-11-09 15:16 ` [PATCH 5/8] pnfsblock: remove rpc_call_ops from struct parallel_io Peng Tao
2011-11-09 15:16 ` [PATCH 6/8] pnfsblock: clean up _add_entry Peng Tao
2011-11-10 8:44 ` Benny Halevy
2011-11-10 8:56 ` tao.peng
2011-11-10 9:11 ` tao.peng
2011-11-09 15:16 ` [PATCH 7/8] pnfsblock: add im_extents to pnfs_inval_markings Peng Tao
2011-11-10 8:54 ` Benny Halevy
2011-11-10 9:08 ` tao.peng
2011-11-10 9:37 ` Benny Halevy
2011-11-10 9:20 ` Benny Halevy
2011-11-10 9:37 ` tao.peng
2011-11-10 9:39 ` Benny Halevy [this message]
2011-11-09 15:16 ` [PATCH 8/8] pnfsblock: alloc short extent before submit bio Peng Tao
2011-11-10 9:22 ` Benny Halevy
2011-11-10 2:09 ` [PATCH 0/8] pnfsblock cleanup and fixes tao.peng
2011-11-10 7:06 ` Benny Halevy
2011-11-10 8:37 ` Benny Halevy
2011-11-10 8:51 ` tao.peng
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=4EBB9BEA.1080802@tonian.com \
--to=bhalevy@tonian.com \
--cc=Trond.Myklebust@netapp.com \
--cc=bergwolf@gmail.com \
--cc=linux-nfs@vger.kernel.org \
--cc=tao.peng@emc.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.