* [PATCH] cifs: get rid of dns resolve worker
@ 2023-02-20 19:36 Paulo Alcantara
2023-02-20 20:50 ` ronnie sahlberg
0 siblings, 1 reply; 2+ messages in thread
From: Paulo Alcantara @ 2023-02-20 19:36 UTC (permalink / raw)
To: smfrench; +Cc: linux-cifs, Paulo Alcantara
We already upcall to resolve hostnames during reconnect by calling
reconn_set_ipaddr_from_hostname(), so there is no point in having a
worker to periodically call it.
Signed-off-by: Paulo Alcantara (SUSE) <pc@manguebit.com>
---
fs/cifs/cifsglob.h | 5 -----
fs/cifs/connect.c | 53 ++++++----------------------------------------
fs/cifs/sess.c | 1 -
3 files changed, 6 insertions(+), 53 deletions(-)
diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h
index 893c2e21eb8e..b1db5dbae31a 100644
--- a/fs/cifs/cifsglob.h
+++ b/fs/cifs/cifsglob.h
@@ -77,10 +77,6 @@
#define SMB_ECHO_INTERVAL_MAX 600
#define SMB_ECHO_INTERVAL_DEFAULT 60
-/* dns resolution intervals in seconds */
-#define SMB_DNS_RESOLVE_INTERVAL_MIN 120
-#define SMB_DNS_RESOLVE_INTERVAL_DEFAULT 600
-
/* smb multichannel query server interfaces interval in seconds */
#define SMB_INTERFACE_POLL_INTERVAL 600
@@ -689,7 +685,6 @@ struct TCP_Server_Info {
/* point to the SMBD connection if RDMA is used instead of socket */
struct smbd_connection *smbd_conn;
struct delayed_work echo; /* echo ping workqueue job */
- struct delayed_work resolve; /* dns resolution workqueue job */
char *smallbuf; /* pointer to current "small" buffer */
char *bigbuf; /* pointer to current "big" buffer */
/* Total size of this PDU. Only valid from cifs_demultiplex_thread */
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
index c65b06855e5f..6831eb8cea7c 100644
--- a/fs/cifs/connect.c
+++ b/fs/cifs/connect.c
@@ -79,8 +79,6 @@ static int reconn_set_ipaddr_from_hostname(struct TCP_Server_Info *server)
int len;
char *unc;
struct sockaddr_storage ss;
- time64_t expiry, now;
- unsigned long ttl = SMB_DNS_RESOLVE_INTERVAL_DEFAULT;
if (!server->hostname)
return -EINVAL;
@@ -102,29 +100,19 @@ static int reconn_set_ipaddr_from_hostname(struct TCP_Server_Info *server)
ss = server->dstaddr;
spin_unlock(&server->srv_lock);
- rc = dns_resolve_server_name_to_ip(unc, (struct sockaddr *)&ss, &expiry);
+ rc = dns_resolve_server_name_to_ip(unc, (struct sockaddr *)&ss, NULL);
kfree(unc);
if (rc < 0) {
cifs_dbg(FYI, "%s: failed to resolve server part of %s to IP: %d\n",
__func__, server->hostname, rc);
- goto requeue_resolve;
+ } else {
+ spin_lock(&server->srv_lock);
+ memcpy(&server->dstaddr, &ss, sizeof(server->dstaddr));
+ spin_unlock(&server->srv_lock);
+ rc = 0;
}
- spin_lock(&server->srv_lock);
- memcpy(&server->dstaddr, &ss, sizeof(server->dstaddr));
- spin_unlock(&server->srv_lock);
-
- now = ktime_get_real_seconds();
- if (expiry && expiry > now)
- /* To make sure we don't use the cached entry, retry 1s */
- ttl = max_t(unsigned long, expiry - now, SMB_DNS_RESOLVE_INTERVAL_MIN) + 1;
-
-requeue_resolve:
- cifs_dbg(FYI, "%s: next dns resolution scheduled for %lu seconds in the future\n",
- __func__, ttl);
- mod_delayed_work(cifsiod_wq, &server->resolve, (ttl * HZ));
-
return rc;
}
@@ -148,26 +136,6 @@ static void smb2_query_server_interfaces(struct work_struct *work)
(SMB_INTERFACE_POLL_INTERVAL * HZ));
}
-static void cifs_resolve_server(struct work_struct *work)
-{
- int rc;
- struct TCP_Server_Info *server = container_of(work,
- struct TCP_Server_Info, resolve.work);
-
- cifs_server_lock(server);
-
- /*
- * Resolve the hostname again to make sure that IP address is up-to-date.
- */
- rc = reconn_set_ipaddr_from_hostname(server);
- if (rc) {
- cifs_dbg(FYI, "%s: failed to resolve hostname: %d\n",
- __func__, rc);
- }
-
- cifs_server_unlock(server);
-}
-
/*
* Update the tcpStatus for the server.
* This is used to signal the cifsd thread to call cifs_reconnect
@@ -939,7 +907,6 @@ static void clean_demultiplex_info(struct TCP_Server_Info *server)
spin_unlock(&server->srv_lock);
cancel_delayed_work_sync(&server->echo);
- cancel_delayed_work_sync(&server->resolve);
spin_lock(&server->srv_lock);
server->tcpStatus = CifsExiting;
@@ -1563,7 +1530,6 @@ cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect)
cifs_put_tcp_session(server->primary_server, from_reconnect);
cancel_delayed_work_sync(&server->echo);
- cancel_delayed_work_sync(&server->resolve);
if (from_reconnect)
/*
@@ -1669,7 +1635,6 @@ cifs_get_tcp_session(struct smb3_fs_context *ctx,
INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
- INIT_DELAYED_WORK(&tcp_ses->resolve, cifs_resolve_server);
INIT_DELAYED_WORK(&tcp_ses->reconnect, smb2_reconnect_server);
mutex_init(&tcp_ses->reconnect_mutex);
#ifdef CONFIG_CIFS_DFS_UPCALL
@@ -1758,12 +1723,6 @@ cifs_get_tcp_session(struct smb3_fs_context *ctx,
/* queue echo request delayed work */
queue_delayed_work(cifsiod_wq, &tcp_ses->echo, tcp_ses->echo_interval);
- /* queue dns resolution delayed work */
- cifs_dbg(FYI, "%s: next dns resolution scheduled for %d seconds in the future\n",
- __func__, SMB_DNS_RESOLVE_INTERVAL_DEFAULT);
-
- queue_delayed_work(cifsiod_wq, &tcp_ses->resolve, (SMB_DNS_RESOLVE_INTERVAL_DEFAULT * HZ));
-
return tcp_ses;
out_err_crypto_release:
diff --git a/fs/cifs/sess.c b/fs/cifs/sess.c
index 07822f2a5b7c..13e36ee967a6 100644
--- a/fs/cifs/sess.c
+++ b/fs/cifs/sess.c
@@ -541,7 +541,6 @@ cifs_ses_add_channel(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
* remove this channel
*/
cancel_delayed_work_sync(&chan->server->echo);
- cancel_delayed_work_sync(&chan->server->resolve);
cancel_delayed_work_sync(&chan->server->reconnect);
spin_lock(&ses->chan_lock);
--
2.39.2
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] cifs: get rid of dns resolve worker
2023-02-20 19:36 [PATCH] cifs: get rid of dns resolve worker Paulo Alcantara
@ 2023-02-20 20:50 ` ronnie sahlberg
0 siblings, 0 replies; 2+ messages in thread
From: ronnie sahlberg @ 2023-02-20 20:50 UTC (permalink / raw)
To: Paulo Alcantara; +Cc: smfrench, linux-cifs
Nice
Reviewed-by lsahlber@redhat.com
On Tue, 21 Feb 2023 at 05:40, Paulo Alcantara <pc@manguebit.com> wrote:
>
> We already upcall to resolve hostnames during reconnect by calling
> reconn_set_ipaddr_from_hostname(), so there is no point in having a
> worker to periodically call it.
>
> Signed-off-by: Paulo Alcantara (SUSE) <pc@manguebit.com>
> ---
> fs/cifs/cifsglob.h | 5 -----
> fs/cifs/connect.c | 53 ++++++----------------------------------------
> fs/cifs/sess.c | 1 -
> 3 files changed, 6 insertions(+), 53 deletions(-)
>
> diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h
> index 893c2e21eb8e..b1db5dbae31a 100644
> --- a/fs/cifs/cifsglob.h
> +++ b/fs/cifs/cifsglob.h
> @@ -77,10 +77,6 @@
> #define SMB_ECHO_INTERVAL_MAX 600
> #define SMB_ECHO_INTERVAL_DEFAULT 60
>
> -/* dns resolution intervals in seconds */
> -#define SMB_DNS_RESOLVE_INTERVAL_MIN 120
> -#define SMB_DNS_RESOLVE_INTERVAL_DEFAULT 600
> -
> /* smb multichannel query server interfaces interval in seconds */
> #define SMB_INTERFACE_POLL_INTERVAL 600
>
> @@ -689,7 +685,6 @@ struct TCP_Server_Info {
> /* point to the SMBD connection if RDMA is used instead of socket */
> struct smbd_connection *smbd_conn;
> struct delayed_work echo; /* echo ping workqueue job */
> - struct delayed_work resolve; /* dns resolution workqueue job */
> char *smallbuf; /* pointer to current "small" buffer */
> char *bigbuf; /* pointer to current "big" buffer */
> /* Total size of this PDU. Only valid from cifs_demultiplex_thread */
> diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
> index c65b06855e5f..6831eb8cea7c 100644
> --- a/fs/cifs/connect.c
> +++ b/fs/cifs/connect.c
> @@ -79,8 +79,6 @@ static int reconn_set_ipaddr_from_hostname(struct TCP_Server_Info *server)
> int len;
> char *unc;
> struct sockaddr_storage ss;
> - time64_t expiry, now;
> - unsigned long ttl = SMB_DNS_RESOLVE_INTERVAL_DEFAULT;
>
> if (!server->hostname)
> return -EINVAL;
> @@ -102,29 +100,19 @@ static int reconn_set_ipaddr_from_hostname(struct TCP_Server_Info *server)
> ss = server->dstaddr;
> spin_unlock(&server->srv_lock);
>
> - rc = dns_resolve_server_name_to_ip(unc, (struct sockaddr *)&ss, &expiry);
> + rc = dns_resolve_server_name_to_ip(unc, (struct sockaddr *)&ss, NULL);
> kfree(unc);
>
> if (rc < 0) {
> cifs_dbg(FYI, "%s: failed to resolve server part of %s to IP: %d\n",
> __func__, server->hostname, rc);
> - goto requeue_resolve;
> + } else {
> + spin_lock(&server->srv_lock);
> + memcpy(&server->dstaddr, &ss, sizeof(server->dstaddr));
> + spin_unlock(&server->srv_lock);
> + rc = 0;
> }
>
> - spin_lock(&server->srv_lock);
> - memcpy(&server->dstaddr, &ss, sizeof(server->dstaddr));
> - spin_unlock(&server->srv_lock);
> -
> - now = ktime_get_real_seconds();
> - if (expiry && expiry > now)
> - /* To make sure we don't use the cached entry, retry 1s */
> - ttl = max_t(unsigned long, expiry - now, SMB_DNS_RESOLVE_INTERVAL_MIN) + 1;
> -
> -requeue_resolve:
> - cifs_dbg(FYI, "%s: next dns resolution scheduled for %lu seconds in the future\n",
> - __func__, ttl);
> - mod_delayed_work(cifsiod_wq, &server->resolve, (ttl * HZ));
> -
> return rc;
> }
>
> @@ -148,26 +136,6 @@ static void smb2_query_server_interfaces(struct work_struct *work)
> (SMB_INTERFACE_POLL_INTERVAL * HZ));
> }
>
> -static void cifs_resolve_server(struct work_struct *work)
> -{
> - int rc;
> - struct TCP_Server_Info *server = container_of(work,
> - struct TCP_Server_Info, resolve.work);
> -
> - cifs_server_lock(server);
> -
> - /*
> - * Resolve the hostname again to make sure that IP address is up-to-date.
> - */
> - rc = reconn_set_ipaddr_from_hostname(server);
> - if (rc) {
> - cifs_dbg(FYI, "%s: failed to resolve hostname: %d\n",
> - __func__, rc);
> - }
> -
> - cifs_server_unlock(server);
> -}
> -
> /*
> * Update the tcpStatus for the server.
> * This is used to signal the cifsd thread to call cifs_reconnect
> @@ -939,7 +907,6 @@ static void clean_demultiplex_info(struct TCP_Server_Info *server)
> spin_unlock(&server->srv_lock);
>
> cancel_delayed_work_sync(&server->echo);
> - cancel_delayed_work_sync(&server->resolve);
>
> spin_lock(&server->srv_lock);
> server->tcpStatus = CifsExiting;
> @@ -1563,7 +1530,6 @@ cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect)
> cifs_put_tcp_session(server->primary_server, from_reconnect);
>
> cancel_delayed_work_sync(&server->echo);
> - cancel_delayed_work_sync(&server->resolve);
>
> if (from_reconnect)
> /*
> @@ -1669,7 +1635,6 @@ cifs_get_tcp_session(struct smb3_fs_context *ctx,
> INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
> INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
> INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
> - INIT_DELAYED_WORK(&tcp_ses->resolve, cifs_resolve_server);
> INIT_DELAYED_WORK(&tcp_ses->reconnect, smb2_reconnect_server);
> mutex_init(&tcp_ses->reconnect_mutex);
> #ifdef CONFIG_CIFS_DFS_UPCALL
> @@ -1758,12 +1723,6 @@ cifs_get_tcp_session(struct smb3_fs_context *ctx,
> /* queue echo request delayed work */
> queue_delayed_work(cifsiod_wq, &tcp_ses->echo, tcp_ses->echo_interval);
>
> - /* queue dns resolution delayed work */
> - cifs_dbg(FYI, "%s: next dns resolution scheduled for %d seconds in the future\n",
> - __func__, SMB_DNS_RESOLVE_INTERVAL_DEFAULT);
> -
> - queue_delayed_work(cifsiod_wq, &tcp_ses->resolve, (SMB_DNS_RESOLVE_INTERVAL_DEFAULT * HZ));
> -
> return tcp_ses;
>
> out_err_crypto_release:
> diff --git a/fs/cifs/sess.c b/fs/cifs/sess.c
> index 07822f2a5b7c..13e36ee967a6 100644
> --- a/fs/cifs/sess.c
> +++ b/fs/cifs/sess.c
> @@ -541,7 +541,6 @@ cifs_ses_add_channel(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
> * remove this channel
> */
> cancel_delayed_work_sync(&chan->server->echo);
> - cancel_delayed_work_sync(&chan->server->resolve);
> cancel_delayed_work_sync(&chan->server->reconnect);
>
> spin_lock(&ses->chan_lock);
> --
> 2.39.2
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2023-02-20 20:50 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-02-20 19:36 [PATCH] cifs: get rid of dns resolve worker Paulo Alcantara
2023-02-20 20:50 ` ronnie sahlberg
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.