Re: [PATCH 1/5] cifs: protect GlobalOplock_Q with its own spinlock

Steve French <[email protected]>
Newsgroups gmane.linux.file-systems.cifs
Message-ID <[email protected]>
Starting to look through this set

ACK on this one.   Doesn't look like this would affect behavior, but slight
cosmetic improvement


On Tue, Aug 18, 2009 at 1:06 PM, Jeff Layton <[email protected]> wrote:

> Right now, the GlobalOplock_Q is protected by the GlobalMid_Lock. That
> lock is also used for completely unrelated purposes (mostly for managing
> the global mid queue). Give the list its own dedicated spinlock
> (cifs_oplock_lock) and rename the list to cifs_oplock_list to
> eliminate the camel-case.
>
> Signed-off-by: Jeff Layton <[email protected]>
> ---
>  fs/cifs/cifsfs.c    |   13 +++++++------
>  fs/cifs/cifsglob.h  |    6 +++++-
>  fs/cifs/transport.c |   17 ++++++++---------
>  3 files changed, 20 insertions(+), 16 deletions(-)
>
> diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c
> index b750aa5..3610e99 100644
> --- a/fs/cifs/cifsfs.c
> +++ b/fs/cifs/cifsfs.c
> @@ -986,19 +986,19 @@ static int cifs_oplock_thread(void *dummyarg)
>                if (try_to_freeze())
>                        continue;
>
> -               spin_lock(&GlobalMid_Lock);
> -               if (list_empty(&GlobalOplock_Q)) {
> -                       spin_unlock(&GlobalMid_Lock);
> +               spin_lock(&cifs_oplock_lock);
> +               if (list_empty(&cifs_oplock_list)) {
> +                       spin_unlock(&cifs_oplock_lock);
>                        set_current_state(TASK_INTERRUPTIBLE);
>                        schedule_timeout(39*HZ);
>                } else {
> -                       oplock_item = list_entry(GlobalOplock_Q.next,
> +                       oplock_item = list_entry(cifs_oplock_list.next,
>                                                struct oplock_q_entry,
> qhead);
>                        cFYI(1, ("found oplock item to write out"));
>                        pTcon = oplock_item->tcon;
>                        inode = oplock_item->pinode;
>                        netfid = oplock_item->netfid;
> -                       spin_unlock(&GlobalMid_Lock);
> +                       spin_unlock(&cifs_oplock_lock);
>                        DeleteOplockQEntry(oplock_item);
>                        /* can not grab inode sem here since it would
>                                deadlock when oplock received on delete
> @@ -1055,7 +1055,7 @@ init_cifs(void)
>        int rc = 0;
>        cifs_proc_init();
>        INIT_LIST_HEAD(&cifs_tcp_ses_list);
> -       INIT_LIST_HEAD(&GlobalOplock_Q);
> +       INIT_LIST_HEAD(&cifs_oplock_list);
>  #ifdef CONFIG_CIFS_EXPERIMENTAL
>        INIT_LIST_HEAD(&GlobalDnotifyReqList);
>        INIT_LIST_HEAD(&GlobalDnotifyRsp_Q);
> @@ -1084,6 +1084,7 @@ init_cifs(void)
>        rwlock_init(&GlobalSMBSeslock);
>        rwlock_init(&cifs_tcp_ses_lock);
>        spin_lock_init(&GlobalMid_Lock);
> +       spin_lock_init(&cifs_oplock_lock);
>
>        if (cifs_max_pending < 2) {
>                cifs_max_pending = 2;
> diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h
> index 6084d63..f100399 100644
> --- a/fs/cifs/cifsglob.h
> +++ b/fs/cifs/cifsglob.h
> @@ -656,7 +656,11 @@ GLOBAL_EXTERN rwlock_t             cifs_tcp_ses_lock;
>  */
>  GLOBAL_EXTERN rwlock_t GlobalSMBSeslock;
>
> -GLOBAL_EXTERN struct list_head GlobalOplock_Q;
> +/* Global list of oplocks */
> +GLOBAL_EXTERN struct list_head cifs_oplock_list;
> +
> +/* Protects the cifs_oplock_list */
> +GLOBAL_EXTERN spinlock_t cifs_oplock_lock;
>
>  /* Outstanding dir notify requests */
>  GLOBAL_EXTERN struct list_head GlobalDnotifyReqList;
> diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c
> index 0ad3e2d..1da4ab2 100644
> --- a/fs/cifs/transport.c
> +++ b/fs/cifs/transport.c
> @@ -119,20 +119,19 @@ AllocOplockQEntry(struct inode *pinode, __u16 fid,
> struct cifsTconInfo *tcon)
>                temp->pinode = pinode;
>                temp->tcon = tcon;
>                temp->netfid = fid;
> -               spin_lock(&GlobalMid_Lock);
> -               list_add_tail(&temp->qhead, &GlobalOplock_Q);
> -               spin_unlock(&GlobalMid_Lock);
> +               spin_lock(&cifs_oplock_lock);
> +               list_add_tail(&temp->qhead, &cifs_oplock_list);
> +               spin_unlock(&cifs_oplock_lock);
>        }
>        return temp;
> -
>  }
>
>  void DeleteOplockQEntry(struct oplock_q_entry *oplockEntry)
>  {
> -       spin_lock(&GlobalMid_Lock);
> +       spin_lock(&cifs_oplock_lock);
>     /* should we check if list empty first? */
>        list_del(&oplockEntry->qhead);
> -       spin_unlock(&GlobalMid_Lock);
> +       spin_unlock(&cifs_oplock_lock);
>        kmem_cache_free(cifs_oplock_cachep, oplockEntry);
>  }
>
> @@ -144,14 +143,14 @@ void DeleteTconOplockQEntries(struct cifsTconInfo
> *tcon)
>        if (tcon == NULL)
>                return;
>
> -       spin_lock(&GlobalMid_Lock);
> -       list_for_each_entry(temp, &GlobalOplock_Q, qhead) {
> +       spin_lock(&cifs_oplock_lock);
> +       list_for_each_entry(temp, &cifs_oplock_list, qhead) {
>                if ((temp->tcon) && (temp->tcon == tcon)) {
>                        list_del(&temp->qhead);
>                        kmem_cache_free(cifs_oplock_cachep, temp);
>                }
>        }
> -       spin_unlock(&GlobalMid_Lock);
> +       spin_unlock(&cifs_oplock_lock);
>  }
>
>  static int
> --
> 1.6.0.6
>
>


-- 
Thanks,

Steve

_______________________________________________
linux-cifs-client mailing list
[email protected]
https://lists.samba.org/mailman/listinfo/linux-cifs-client
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.