All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sachin Prabhu <sprabhu-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
To: Shirish Pargaonkar
	<shirishpargaonkar-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Cc: linux-cifs <linux-cifs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
	Steve French <smfrench-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Subject: Re: [PATCH] cifs: Make echo interval tunable.
Date: Tue, 15 Dec 2015 15:51:54 +0530	[thread overview]
Message-ID: <1450174914.4930.14.camel@redhat.com> (raw)
In-Reply-To: <CADT32e+AtzJ5f5bOKKVz=uTonHvNMs=DJmNTnohy_Yi5HK=R7A-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>

On Mon, 2015-12-14 at 21:58 -0600, Shirish Pargaonkar wrote:
> Looks correct. Only comment would be to keep one definition of
> echo_interval,
> preferably unsigned int (instead of unsigned long also).

Sirish,

The event_timeout defined in struct smb_vol contains the timeout value
in seconds while the one defined in struct TCP_Server_Info multiplies
the value from the smb_vol by HZ to get the time in ticks.

Sachin Prabhu

> 
> On Mon, Dec 14, 2015 at 6:54 AM, Sachin Prabhu <sprabhu-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
> wrote:
> > Another approach as pointed to by Jeff Layton is to make it a
> > module
> > parameter which is then set for all shares mounted on the client.
> > 
> > Any comments on the patch are welcome.
> > 
> > Sachin Prabhu
> > 
> > On Mon, 2015-12-14 at 18:17 +0530, Sachin Prabhu wrote:
> > > Currently the echo interval is set to 60 seconds using a macro.
> > > This
> > > setting determines the interval at which echo requests are sent
> > > to
> > > the
> > > server on an idling connection. This setting also affects the
> > > time
> > > required for a connection to an unresponsive server to timeout.
> > > 
> > > Making this setting a tunable allows users to control the echo
> > > interval
> > > times as well as control the time after which the connecting to
> > > an
> > > unresponsive server times out.
> > > 
> > > Signed-off-by: Sachin Prabhu <sprabhu-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
> > > ---
> > >  fs/cifs/cifsfs.c   |  2 ++
> > >  fs/cifs/cifsglob.h |  8 ++++++--
> > >  fs/cifs/connect.c  | 33 +++++++++++++++++++++++++++------
> > >  3 files changed, 35 insertions(+), 8 deletions(-)
> > > 
> > > diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c
> > > index cbc0f4b..eab2de6 100644
> > > --- a/fs/cifs/cifsfs.c
> > > +++ b/fs/cifs/cifsfs.c
> > > @@ -507,6 +507,8 @@ cifs_show_options(struct seq_file *s, struct
> > > dentry *root)
> > > 
> > >       seq_printf(s, ",rsize=%u", cifs_sb->rsize);
> > >       seq_printf(s, ",wsize=%u", cifs_sb->wsize);
> > > +     seq_printf(s, ",echo_interval=%lu",
> > > +                     tcon->ses->server->echo_interval / HZ);
> > >       /* convert actimeo and display it in seconds */
> > >       seq_printf(s, ",actimeo=%lu", cifs_sb->actimeo / HZ);
> > > 
> > > diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h
> > > index 2b510c5..56d3698 100644
> > > --- a/fs/cifs/cifsglob.h
> > > +++ b/fs/cifs/cifsglob.h
> > > @@ -70,8 +70,10 @@
> > >  #define SERVER_NAME_LENGTH 40
> > >  #define SERVER_NAME_LEN_WITH_NULL     (SERVER_NAME_LENGTH + 1)
> > > 
> > > -/* SMB echo "timeout" -- FIXME: tunable? */
> > > -#define SMB_ECHO_INTERVAL (60 * HZ)
> > > +/* echo interval in seconds */
> > > +#define SMB_ECHO_INTERVAL_MIN 10
> > > +#define SMB_ECHO_INTERVAL_MAX 120
> > > +#define SMB_ECHO_INTERVAL_DEFAULT 60
> > > 
> > >  #include "cifspdu.h"
> > > 
> > > @@ -507,6 +509,7 @@ struct smb_vol {
> > >       struct sockaddr_storage dstaddr; /* destination address */
> > >       struct sockaddr_storage srcaddr; /* allow binding to a
> > > local
> > > IP */
> > >       struct nls_table *local_nls;
> > > +     unsigned int echo_interval; /* echo interval in secs */
> > >  };
> > > 
> > >  #define CIFS_MOUNT_MASK (CIFS_MOUNT_NO_PERM | CIFS_MOUNT_SET_UID
> > > | \
> > > @@ -628,6 +631,7 @@ struct TCP_Server_Info {
> > >       unsigned int    max_read;
> > >       unsigned int    max_write;
> > >  #endif /* CONFIG_CIFS_SMB2 */
> > > +     unsigned long echo_interval;
> > >  };
> > > 
> > >  static inline unsigned int
> > > diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
> > > index ecb0803..3b44e9e 100644
> > > --- a/fs/cifs/connect.c
> > > +++ b/fs/cifs/connect.c
> > > @@ -95,6 +95,7 @@ enum {
> > >       Opt_cruid, Opt_gid, Opt_file_mode,
> > >       Opt_dirmode, Opt_port,
> > >       Opt_rsize, Opt_wsize, Opt_actimeo,
> > > +     Opt_echo_interval,
> > > 
> > >       /* Mount options which take string value */
> > >       Opt_user, Opt_pass, Opt_ip,
> > > @@ -188,6 +189,7 @@ static const match_table_t
> > > cifs_mount_option_tokens = {
> > >       { Opt_rsize, "rsize=%s" },
> > >       { Opt_wsize, "wsize=%s" },
> > >       { Opt_actimeo, "actimeo=%s" },
> > > +     { Opt_echo_interval, "echo_interval=%s" },
> > > 
> > >       { Opt_blank_user, "user=" },
> > >       { Opt_blank_user, "username=" },
> > > @@ -418,6 +420,7 @@ cifs_echo_request(struct work_struct *work)
> > >       int rc;
> > >       struct TCP_Server_Info *server = container_of(work,
> > >                                       struct TCP_Server_Info,
> > > echo.work);
> > > +     unsigned long echo_interval = server->echo_interval;
> > > 
> > >       /*
> > >        * We cannot send an echo if it is disabled or until the
> > > @@ -427,7 +430,7 @@ cifs_echo_request(struct work_struct *work)
> > >        */
> > >       if (!server->ops->need_neg || server->ops->need_neg(server)
> > > > > 
> > >           (server->ops->can_echo && !server->ops
> > > ->can_echo(server)) ||
> > > -         time_before(jiffies, server->lstrp + SMB_ECHO_INTERVAL
> > > -
> > > HZ))
> > > +         time_before(jiffies, server->lstrp + echo_interval -
> > > HZ))
> > >               goto requeue_echo;
> > > 
> > >       rc = server->ops->echo ? server->ops->echo(server) :
> > > -ENOSYS;
> > > @@ -436,7 +439,7 @@ cifs_echo_request(struct work_struct *work)
> > >                        server->hostname);
> > > 
> > >  requeue_echo:
> > > -     queue_delayed_work(cifsiod_wq, &server->echo,
> > > SMB_ECHO_INTERVAL);
> > > +     queue_delayed_work(cifsiod_wq, &server->echo,
> > > echo_interval);
> > >  }
> > > 
> > >  static bool
> > > @@ -487,9 +490,9 @@ server_unresponsive(struct TCP_Server_Info
> > > *server)
> > >        *     a response in >60s.
> > >        */
> > >       if (server->tcpStatus == CifsGood &&
> > > -         time_after(jiffies, server->lstrp + 2 *
> > > SMB_ECHO_INTERVAL)) {
> > > -             cifs_dbg(VFS, "Server %s has not responded in %d
> > > seconds. Reconnecting...\n",
> > > -                      server->hostname, (2 * SMB_ECHO_INTERVAL)
> > > /
> > > HZ);
> > > +         time_after(jiffies, server->lstrp + 2 * server
> > > ->echo_interval)) {
> > > +             cifs_dbg(VFS, "Server %s has not responded in %lu
> > > seconds. Reconnecting...\n",
> > > +                      server->hostname, (2 * server
> > > ->echo_interval) / HZ);
> > >               cifs_reconnect(server);
> > >               wake_up(&server->response_q);
> > >               return true;
> > > @@ -1624,6 +1627,14 @@ cifs_parse_mount_options(const char
> > > *mountdata, const char *devname,
> > >                               goto cifs_parse_mount_err;
> > >                       }
> > >                       break;
> > > +             case Opt_echo_interval:
> > > +                     if (get_option_ul(args, &option)) {
> > > +                             cifs_dbg(VFS, "%s: Invalid echo
> > > interval value\n",
> > > +                                      __func__);
> > > +                             goto cifs_parse_mount_err;
> > > +                     }
> > > +                     vol->echo_interval = option;
> > > +                     break;
> > > 
> > >               /* String Arguments */
> > > 
> > > @@ -2089,6 +2100,9 @@ static int match_server(struct
> > > TCP_Server_Info
> > > *server, struct smb_vol *vol)
> > >       if (!match_security(server, vol))
> > >               return 0;
> > > 
> > > +     if (server->echo_interval != vol->echo_interval)
> > > +             return 0;
> > > +
> > >       return 1;
> > >  }
> > > 
> > > @@ -2208,6 +2222,13 @@ cifs_get_tcp_session(struct smb_vol
> > > *volume_info)
> > >       tcp_ses->tcpStatus = CifsNew;
> > >       ++tcp_ses->srv_count;
> > > 
> > > +     /* echo interval should be between 10 and 120 secs */
> > > +     if (volume_info->echo_interval > SMB_ECHO_INTERVAL_MIN ||
> > > +             volume_info->echo_interval < SMB_ECHO_INTERVAL_MAX)
> > > +             tcp_ses->echo_interval = volume_info->echo_interval
> > > * HZ;
> > > +     else
> > > +             tcp_ses->echo_interval = SMB_ECHO_INTERVAL_DEFAULT
> > > *
> > > HZ;
> > > +
> > >       rc = ip_connect(tcp_ses);
> > >       if (rc < 0) {
> > >               cifs_dbg(VFS, "Error connecting to socket. Aborting
> > > operation.\n");
> > > @@ -2237,7 +2258,7 @@ cifs_get_tcp_session(struct smb_vol
> > > *volume_info)
> > >       cifs_fscache_get_client_cookie(tcp_ses);
> > > 
> > >       /* queue echo request delayed work */
> > > -     queue_delayed_work(cifsiod_wq, &tcp_ses->echo,
> > > SMB_ECHO_INTERVAL);
> > > +     queue_delayed_work(cifsiod_wq, &tcp_ses->echo, tcp_ses
> > > ->echo_interval);
> > > 
> > >       return tcp_ses;
> > > 
> > 
> > --
> > To unsubscribe from this list: send the line "unsubscribe linux-
> > cifs" in
> > the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
> > More majordomo info at  http://vger.kernel.org/majordomo-info.html

  parent reply	other threads:[~2015-12-15 10:21 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-12-14 12:47 [PATCH] cifs: Make echo interval tunable Sachin Prabhu
     [not found] ` <1450097226-20815-1-git-send-email-sprabhu-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2015-12-14 12:54   ` Sachin Prabhu
     [not found]     ` <1450097641.6822.6.camel-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2015-12-15  3:58       ` Shirish Pargaonkar
     [not found]         ` <CADT32e+AtzJ5f5bOKKVz=uTonHvNMs=DJmNTnohy_Yi5HK=R7A-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-12-15 10:21           ` Sachin Prabhu [this message]
     [not found]             ` <1450174914.4930.14.camel-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2015-12-17  3:54               ` Shirish Pargaonkar
2015-12-17  4:37   ` Steve French
     [not found]     ` <CAH2r5mu1xKmd+cg33ti7UtBWpj9XCt5SL0B=7QnV4LDxw-79vw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-12-17  5:28       ` Sachin Prabhu
     [not found]         ` <1450330113.4353.2.camel-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2015-12-17  7:04           ` Steve French
2015-12-17  7:10       ` Scott Lovenberg

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=1450174914.4930.14.camel@redhat.com \
    --to=sprabhu-h+wxahxf7alqt0dzr+alfa@public.gmane.org \
    --cc=linux-cifs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=shirishpargaonkar-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
    --cc=smfrench-Re5JQEeQqe8AvxtiuMwx3w@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 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.