* [PATCH 2/2] cifs: try harder to open new channels
2019-11-20 16:15 [PATCH 1/2] cifs: dump channel info in DebugData Aurelien Aptel
@ 2019-11-20 16:15 ` Aurelien Aptel
2019-11-21 21:54 ` [PATCH 1/2] cifs: dump channel info in DebugData Steve French
2019-11-21 23:44 ` [PATCH 1/2] " Steve French
2 siblings, 0 replies; 5+ messages in thread
From: Aurelien Aptel @ 2019-11-20 16:15 UTC (permalink / raw)
To: linux-cifs; +Cc: smfrench, Aurelien Aptel
Previously we would only loop over the iface list once.
This patch tries to loop over multiple times until all channels are
opened. It will also try to reuse RSS ifaces.
Signed-off-by: Aurelien Aptel <aaptel@suse.com>
---
fs/cifs/sess.c | 32 ++++++++++++++++++++++----------
1 file changed, 22 insertions(+), 10 deletions(-)
diff --git a/fs/cifs/sess.c b/fs/cifs/sess.c
index ee6bf47b6cfe..fb3bdc44775c 100644
--- a/fs/cifs/sess.c
+++ b/fs/cifs/sess.c
@@ -76,6 +76,7 @@ int cifs_try_adding_channels(struct cifs_ses *ses)
int left = ses->chan_max - ses->chan_count;
int i = 0;
int rc = 0;
+ int tries = 0;
if (left <= 0) {
cifs_dbg(FYI,
@@ -89,29 +90,40 @@ int cifs_try_adding_channels(struct cifs_ses *ses)
return 0;
}
- /* ifaces are sorted by speed, try them in order */
- for (i = 0; left > 0 && i < ses->iface_count; i++) {
+ /*
+ * Keep connecting to same, fastest, iface for all channels as
+ * long as its RSS. Try next fastest one if not RSS or channel
+ * creation fails.
+ */
+ while (left > 0) {
struct cifs_server_iface *iface;
+ tries++;
+ if (tries > 3*ses->chan_max) {
+ cifs_dbg(FYI, "too many attempt at opening channels (%d channels left to open)\n",
+ left);
+ break;
+ }
+
iface = &ses->iface_list[i];
- if (is_ses_using_iface(ses, iface) && !iface->rss_capable)
+ if (is_ses_using_iface(ses, iface) && !iface->rss_capable) {
+ i = (i+1) % ses->iface_count;
continue;
+ }
rc = cifs_ses_add_channel(ses, iface);
if (rc) {
- cifs_dbg(FYI, "failed to open extra channel\n");
+ cifs_dbg(FYI, "failed to open extra channel on iface#%d rc=%d\n",
+ i, rc);
+ i = (i+1) % ses->iface_count;
continue;
}
- cifs_dbg(FYI, "successfully opened new channel\n");
+ cifs_dbg(FYI, "successfully opened new channel on iface#%d\n",
+ i);
left--;
}
- /*
- * TODO: if we still have channels left to open try to connect
- * to same RSS-capable iface multiple times
- */
-
return ses->chan_count - old_chan_count;
}
--
2.16.4
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 1/2] cifs: dump channel info in DebugData
2019-11-20 16:15 [PATCH 1/2] cifs: dump channel info in DebugData Aurelien Aptel
2019-11-20 16:15 ` [PATCH 2/2] cifs: try harder to open new channels Aurelien Aptel
@ 2019-11-21 21:54 ` Steve French
2019-11-25 12:16 ` [PATCH v2] " Aurelien Aptel
2019-11-21 23:44 ` [PATCH 1/2] " Steve French
2 siblings, 1 reply; 5+ messages in thread
From: Steve French @ 2019-11-21 21:54 UTC (permalink / raw)
To: Aurelien Aptel; +Cc: CIFS
With current for-next got:
CHECK /home/smfrench/cifs-2.6/fs/cifs/cifs_debug.c
/home/smfrench/cifs-2.6/fs/cifs/cifs_debug.c:141:39: error: no member
'in_send' in struct TCP_Server_Info
CC [M] /home/smfrench/cifs-2.6/fs/cifs/cifs_debug.o
/home/smfrench/cifs-2.6/fs/cifs/cifs_debug.c: In function ‘cifs_dump_channel’:
/home/smfrench/cifs-2.6/fs/cifs/cifs_debug.c:141:25: error: ‘struct
TCP_Server_Info’ has no member named ‘in_send’
141 | atomic_read(&server->in_send),
| ^~
/home/smfrench/cifs-2.6/fs/cifs/cifs_debug.c:142:25: error: ‘struct
TCP_Server_Info’ has no member named ‘num_waiters’
142 | atomic_read(&server->num_waiters));
On Wed, Nov 20, 2019 at 10:16 AM Aurelien Aptel <aaptel@suse.com> wrote:
>
> * show server&TCP states for extra channels
> * mention if an interface has a channel connected to it
>
> Signed-off-by: Aurelien Aptel <aaptel@suse.com>
> ---
> fs/cifs/cifs_debug.c | 35 ++++++++++++++++++++++++++++++++++-
> 1 file changed, 34 insertions(+), 1 deletion(-)
>
> diff --git a/fs/cifs/cifs_debug.c b/fs/cifs/cifs_debug.c
> index efb2928ff6c8..c2dd07903d56 100644
> --- a/fs/cifs/cifs_debug.c
> +++ b/fs/cifs/cifs_debug.c
> @@ -121,6 +121,27 @@ static void cifs_debug_tcon(struct seq_file *m, struct cifs_tcon *tcon)
> seq_putc(m, '\n');
> }
>
> +static void
> +cifs_dump_channel(struct seq_file *m, int i, struct cifs_chan *chan)
> +{
> + struct TCP_Server_Info *server = chan->server;
> +
> + seq_printf(m, "\t\tChannel %d Number of credits: %d Dialect 0x%x "
> + "TCP status: %d Instance: %d Local Users To Server: %d "
> + "SecMode: 0x%x Req On Wire: %d In Send: %d "
> + "In MaxReq Wait: %d\n",
> + i+1,
> + server->credits,
> + server->dialect,
> + server->tcpStatus,
> + server->reconnect_instance,
> + server->srv_count,
> + server->sec_mode,
> + in_flight(server),
> + atomic_read(&server->in_send),
> + atomic_read(&server->num_waiters));
> +}
> +
> static void
> cifs_dump_iface(struct seq_file *m, struct cifs_server_iface *iface)
> {
> @@ -377,6 +398,13 @@ static int cifs_debug_data_proc_show(struct seq_file *m, void *v)
> if (ses->sign)
> seq_puts(m, " signed");
>
> + if (ses->chan_count > 1) {
> + seq_printf(m, "\n\n\tExtra Channels: %lu\n",
> + ses->chan_count-1);
> + for (j = 1; j < ses->chan_count; j++)
> + cifs_dump_channel(m, j, &ses->chans[j]);
> + }
> +
> seq_puts(m, "\n\tShares:");
> j = 0;
>
> @@ -415,8 +443,13 @@ static int cifs_debug_data_proc_show(struct seq_file *m, void *v)
> seq_printf(m, "\n\tServer interfaces: %zu\n",
> ses->iface_count);
> for (j = 0; j < ses->iface_count; j++) {
> + struct cifs_server_iface *iface;
> +
> + iface = &ses->iface_list[j];
> seq_printf(m, "\t%d)", j);
> - cifs_dump_iface(m, &ses->iface_list[j]);
> + cifs_dump_iface(m, iface);
> + if (is_ses_using_iface(ses, iface))
> + seq_puts(m, "\t\t[CONNECTED]\n");
> }
> spin_unlock(&ses->iface_lock);
> }
> --
> 2.16.4
>
--
Thanks,
Steve
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v2] cifs: dump channel info in DebugData
2019-11-21 21:54 ` [PATCH 1/2] cifs: dump channel info in DebugData Steve French
@ 2019-11-25 12:16 ` Aurelien Aptel
0 siblings, 0 replies; 5+ messages in thread
From: Aurelien Aptel @ 2019-11-25 12:16 UTC (permalink / raw)
To: linux-cifs; +Cc: smfrench, Aurelien Aptel
* show server&TCP states for extra channels
* mention if an interface has a channel connected to it
Signed-off-by: Aurelien Aptel <aaptel@suse.com>
---
Changes since v1:
* make it work regardless of CONFIG_CIFS_STATS2
* use %zu for printing size_t
fs/cifs/cifs_debug.c | 41 ++++++++++++++++++++++++++++++++++++++++-
1 file changed, 40 insertions(+), 1 deletion(-)
diff --git a/fs/cifs/cifs_debug.c b/fs/cifs/cifs_debug.c
index efb2928ff6c8..05376bfa5938 100644
--- a/fs/cifs/cifs_debug.c
+++ b/fs/cifs/cifs_debug.c
@@ -121,6 +121,33 @@ static void cifs_debug_tcon(struct seq_file *m, struct cifs_tcon *tcon)
seq_putc(m, '\n');
}
+static void
+cifs_dump_channel(struct seq_file *m, int i, struct cifs_chan *chan)
+{
+ struct TCP_Server_Info *server = chan->server;
+
+ seq_printf(m, "\t\tChannel %d Number of credits: %d Dialect 0x%x "
+ "TCP status: %d Instance: %d Local Users To Server: %d "
+ "SecMode: 0x%x Req On Wire: %d"
+#ifdef CONFIG_CIFS_STATS2
+ " In Send: %d In MaxReq Wait: %d"
+#endif
+ "\n",
+ i+1,
+ server->credits,
+ server->dialect,
+ server->tcpStatus,
+ server->reconnect_instance,
+ server->srv_count,
+ server->sec_mode,
+ in_flight(server)
+#ifdef CONFIG_CIFS_STATS2
+ ,atomic_read(&server->in_send),
+ atomic_read(&server->num_waiters)
+#endif
+ );
+}
+
static void
cifs_dump_iface(struct seq_file *m, struct cifs_server_iface *iface)
{
@@ -377,6 +404,13 @@ static int cifs_debug_data_proc_show(struct seq_file *m, void *v)
if (ses->sign)
seq_puts(m, " signed");
+ if (ses->chan_count > 1) {
+ seq_printf(m, "\n\n\tExtra Channels: %zu\n",
+ ses->chan_count-1);
+ for (j = 1; j < ses->chan_count; j++)
+ cifs_dump_channel(m, j, &ses->chans[j]);
+ }
+
seq_puts(m, "\n\tShares:");
j = 0;
@@ -415,8 +449,13 @@ static int cifs_debug_data_proc_show(struct seq_file *m, void *v)
seq_printf(m, "\n\tServer interfaces: %zu\n",
ses->iface_count);
for (j = 0; j < ses->iface_count; j++) {
+ struct cifs_server_iface *iface;
+
+ iface = &ses->iface_list[j];
seq_printf(m, "\t%d)", j);
- cifs_dump_iface(m, &ses->iface_list[j]);
+ cifs_dump_iface(m, iface);
+ if (is_ses_using_iface(ses, iface))
+ seq_puts(m, "\t\t[CONNECTED]\n");
}
spin_unlock(&ses->iface_lock);
}
--
2.16.4
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 1/2] cifs: dump channel info in DebugData
2019-11-20 16:15 [PATCH 1/2] cifs: dump channel info in DebugData Aurelien Aptel
2019-11-20 16:15 ` [PATCH 2/2] cifs: try harder to open new channels Aurelien Aptel
2019-11-21 21:54 ` [PATCH 1/2] cifs: dump channel info in DebugData Steve French
@ 2019-11-21 23:44 ` Steve French
2 siblings, 0 replies; 5+ messages in thread
From: Steve French @ 2019-11-21 23:44 UTC (permalink / raw)
To: Aurelien Aptel; +Cc: CIFS
This wouldn't build due to CONFIG_CIFS_STATS2 but I merged it and
fixed the build break by adding a followon patch which enables in_send
and num_waiters by default (not requiring CONFIG_CIFS_STATS2 for those
two counters)
On Wed, Nov 20, 2019 at 10:16 AM Aurelien Aptel <aaptel@suse.com> wrote:
>
> * show server&TCP states for extra channels
> * mention if an interface has a channel connected to it
>
> Signed-off-by: Aurelien Aptel <aaptel@suse.com>
> ---
> fs/cifs/cifs_debug.c | 35 ++++++++++++++++++++++++++++++++++-
> 1 file changed, 34 insertions(+), 1 deletion(-)
>
> diff --git a/fs/cifs/cifs_debug.c b/fs/cifs/cifs_debug.c
> index efb2928ff6c8..c2dd07903d56 100644
> --- a/fs/cifs/cifs_debug.c
> +++ b/fs/cifs/cifs_debug.c
> @@ -121,6 +121,27 @@ static void cifs_debug_tcon(struct seq_file *m, struct cifs_tcon *tcon)
> seq_putc(m, '\n');
> }
>
> +static void
> +cifs_dump_channel(struct seq_file *m, int i, struct cifs_chan *chan)
> +{
> + struct TCP_Server_Info *server = chan->server;
> +
> + seq_printf(m, "\t\tChannel %d Number of credits: %d Dialect 0x%x "
> + "TCP status: %d Instance: %d Local Users To Server: %d "
> + "SecMode: 0x%x Req On Wire: %d In Send: %d "
> + "In MaxReq Wait: %d\n",
> + i+1,
> + server->credits,
> + server->dialect,
> + server->tcpStatus,
> + server->reconnect_instance,
> + server->srv_count,
> + server->sec_mode,
> + in_flight(server),
> + atomic_read(&server->in_send),
> + atomic_read(&server->num_waiters));
> +}
> +
> static void
> cifs_dump_iface(struct seq_file *m, struct cifs_server_iface *iface)
> {
> @@ -377,6 +398,13 @@ static int cifs_debug_data_proc_show(struct seq_file *m, void *v)
> if (ses->sign)
> seq_puts(m, " signed");
>
> + if (ses->chan_count > 1) {
> + seq_printf(m, "\n\n\tExtra Channels: %lu\n",
> + ses->chan_count-1);
> + for (j = 1; j < ses->chan_count; j++)
> + cifs_dump_channel(m, j, &ses->chans[j]);
> + }
> +
> seq_puts(m, "\n\tShares:");
> j = 0;
>
> @@ -415,8 +443,13 @@ static int cifs_debug_data_proc_show(struct seq_file *m, void *v)
> seq_printf(m, "\n\tServer interfaces: %zu\n",
> ses->iface_count);
> for (j = 0; j < ses->iface_count; j++) {
> + struct cifs_server_iface *iface;
> +
> + iface = &ses->iface_list[j];
> seq_printf(m, "\t%d)", j);
> - cifs_dump_iface(m, &ses->iface_list[j]);
> + cifs_dump_iface(m, iface);
> + if (is_ses_using_iface(ses, iface))
> + seq_puts(m, "\t\t[CONNECTED]\n");
> }
> spin_unlock(&ses->iface_lock);
> }
> --
> 2.16.4
>
--
Thanks,
Steve
^ permalink raw reply [flat|nested] 5+ messages in thread