Re: [PATCH 6/6] cifs: don't bother with kmap on read_pages side
On Sat, 2016-04-09 at 21:53 +0100, Al Viro wrote: > just do ITER_BVEC recvmsg > > Signed-off-by: Al Viro> --- > fs/cifs/cifsproto.h | 7 +++--- > fs/cifs/connect.c | 65 > - > fs/cifs/file.c | 53 ++- > 3 files changed, 55 insertions(+), 70 deletions(-) > > diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h > index 7d5f53a..0f9a6bc 100644 > --- a/fs/cifs/cifsproto.h > +++ b/fs/cifs/cifsproto.h > @@ -179,10 +179,9 @@ extern int set_cifs_acl(struct cifs_ntsd *, __u32, > struct inode *, > > extern void dequeue_mid(struct mid_q_entry *mid, bool malformed); > extern int cifs_read_from_socket(struct TCP_Server_Info *server, char *buf, > - unsigned int to_read); > -extern int cifs_readv_from_socket(struct TCP_Server_Info *server, > - struct kvec *iov_orig, unsigned int nr_segs, > - unsigned int to_read); > + unsigned int to_read); > +extern int cifs_read_page_from_socket(struct TCP_Server_Info *server, > + struct page *page, unsigned int to_read); > extern void cifs_setup_cifs_sb(struct smb_vol *pvolume_info, > struct cifs_sb_info *cifs_sb); > extern int cifs_match_super(struct super_block *, void *); > diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c > index eb42665..e33c5e0 100644 > --- a/fs/cifs/connect.c > +++ b/fs/cifs/connect.c > @@ -501,39 +501,34 @@ server_unresponsive(struct TCP_Server_Info *server) > return false; > } > > -int > -cifs_readv_from_socket(struct TCP_Server_Info *server, struct kvec *iov_orig, > - unsigned int nr_segs, unsigned int to_read) > +static int > +cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr > *smb_msg) > { > int length = 0; > int total_read; > - struct msghdr smb_msg; > > - smb_msg.msg_control = NULL; > - smb_msg.msg_controllen = 0; > - iov_iter_kvec(_msg.msg_iter, READ | ITER_KVEC, > - iov_orig, nr_segs, to_read); > + smb_msg->msg_control = NULL; > + smb_msg->msg_controllen = 0; > > - for (total_read = 0; msg_data_left(_msg); total_read += length) { > + for (total_read = 0; msg_data_left(smb_msg); total_read += length) { > try_to_freeze(); > > - if (server_unresponsive(server)) { > - total_read = -ECONNABORTED; > - break; > - } > + if (server_unresponsive(server)) > + return -ECONNABORTED; > > - length = sock_recvmsg(server->ssocket, _msg, 0); > + length = sock_recvmsg(server->ssocket, smb_msg, 0); > > - if (server->tcpStatus == CifsExiting) { > - total_read = -ESHUTDOWN; > - break; > - } else if (server->tcpStatus == CifsNeedReconnect) { > + if (server->tcpStatus == CifsExiting) > + return -ESHUTDOWN; > + > + if (server->tcpStatus == CifsNeedReconnect) { > cifs_reconnect(server); > - total_read = -ECONNABORTED; > - break; > - } else if (length == -ERESTARTSYS || > - length == -EAGAIN || > - length == -EINTR) { > + return -ECONNABORTED; > + } > + > + if (length == -ERESTARTSYS || > + length == -EAGAIN || > + length == -EINTR) { > /* > * Minimum sleep to prevent looping, allowing socket > * to clear and app threads to set tcpStatus > @@ -542,11 +537,12 @@ cifs_readv_from_socket(struct TCP_Server_Info *server, > struct kvec *iov_orig, > usleep_range(1000, 2000); > length = 0; > continue; > - } else if (length <= 0) { > + } > + > + if (length <= 0) { > cifs_dbg(FYI, "Received no data or error: %d\n", > length); > cifs_reconnect(server); > - total_read = -ECONNABORTED; > - break; > + return -ECONNABORTED; > } > } > return total_read; > @@ -556,12 +552,21 @@ int > cifs_read_from_socket(struct TCP_Server_Info *server, char *buf, > unsigned int to_read) > { > - struct kvec iov; > + struct msghdr smb_msg; > + struct kvec iov = {.iov_base = buf, .iov_len = to_read}; > + iov_iter_kvec(_msg.msg_iter, READ | ITER_KVEC, , 1, to_read); > > - iov.iov_base = buf; > - iov.iov_len = to_read; > + return cifs_readv_from_socket(server, _msg); > +} > > - return cifs_readv_from_socket(server, , 1, to_read); > +int >
Re: [PATCH 6/6] cifs: don't bother with kmap on read_pages side
On Sat, 2016-04-09 at 21:53 +0100, Al Viro wrote: > just do ITER_BVEC recvmsg > > Signed-off-by: Al Viro > --- > fs/cifs/cifsproto.h | 7 +++--- > fs/cifs/connect.c | 65 > - > fs/cifs/file.c | 53 ++- > 3 files changed, 55 insertions(+), 70 deletions(-) > > diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h > index 7d5f53a..0f9a6bc 100644 > --- a/fs/cifs/cifsproto.h > +++ b/fs/cifs/cifsproto.h > @@ -179,10 +179,9 @@ extern int set_cifs_acl(struct cifs_ntsd *, __u32, > struct inode *, > > extern void dequeue_mid(struct mid_q_entry *mid, bool malformed); > extern int cifs_read_from_socket(struct TCP_Server_Info *server, char *buf, > - unsigned int to_read); > -extern int cifs_readv_from_socket(struct TCP_Server_Info *server, > - struct kvec *iov_orig, unsigned int nr_segs, > - unsigned int to_read); > + unsigned int to_read); > +extern int cifs_read_page_from_socket(struct TCP_Server_Info *server, > + struct page *page, unsigned int to_read); > extern void cifs_setup_cifs_sb(struct smb_vol *pvolume_info, > struct cifs_sb_info *cifs_sb); > extern int cifs_match_super(struct super_block *, void *); > diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c > index eb42665..e33c5e0 100644 > --- a/fs/cifs/connect.c > +++ b/fs/cifs/connect.c > @@ -501,39 +501,34 @@ server_unresponsive(struct TCP_Server_Info *server) > return false; > } > > -int > -cifs_readv_from_socket(struct TCP_Server_Info *server, struct kvec *iov_orig, > - unsigned int nr_segs, unsigned int to_read) > +static int > +cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr > *smb_msg) > { > int length = 0; > int total_read; > - struct msghdr smb_msg; > > - smb_msg.msg_control = NULL; > - smb_msg.msg_controllen = 0; > - iov_iter_kvec(_msg.msg_iter, READ | ITER_KVEC, > - iov_orig, nr_segs, to_read); > + smb_msg->msg_control = NULL; > + smb_msg->msg_controllen = 0; > > - for (total_read = 0; msg_data_left(_msg); total_read += length) { > + for (total_read = 0; msg_data_left(smb_msg); total_read += length) { > try_to_freeze(); > > - if (server_unresponsive(server)) { > - total_read = -ECONNABORTED; > - break; > - } > + if (server_unresponsive(server)) > + return -ECONNABORTED; > > - length = sock_recvmsg(server->ssocket, _msg, 0); > + length = sock_recvmsg(server->ssocket, smb_msg, 0); > > - if (server->tcpStatus == CifsExiting) { > - total_read = -ESHUTDOWN; > - break; > - } else if (server->tcpStatus == CifsNeedReconnect) { > + if (server->tcpStatus == CifsExiting) > + return -ESHUTDOWN; > + > + if (server->tcpStatus == CifsNeedReconnect) { > cifs_reconnect(server); > - total_read = -ECONNABORTED; > - break; > - } else if (length == -ERESTARTSYS || > - length == -EAGAIN || > - length == -EINTR) { > + return -ECONNABORTED; > + } > + > + if (length == -ERESTARTSYS || > + length == -EAGAIN || > + length == -EINTR) { > /* > * Minimum sleep to prevent looping, allowing socket > * to clear and app threads to set tcpStatus > @@ -542,11 +537,12 @@ cifs_readv_from_socket(struct TCP_Server_Info *server, > struct kvec *iov_orig, > usleep_range(1000, 2000); > length = 0; > continue; > - } else if (length <= 0) { > + } > + > + if (length <= 0) { > cifs_dbg(FYI, "Received no data or error: %d\n", > length); > cifs_reconnect(server); > - total_read = -ECONNABORTED; > - break; > + return -ECONNABORTED; > } > } > return total_read; > @@ -556,12 +552,21 @@ int > cifs_read_from_socket(struct TCP_Server_Info *server, char *buf, > unsigned int to_read) > { > - struct kvec iov; > + struct msghdr smb_msg; > + struct kvec iov = {.iov_base = buf, .iov_len = to_read}; > + iov_iter_kvec(_msg.msg_iter, READ | ITER_KVEC, , 1, to_read); > > - iov.iov_base = buf; > - iov.iov_len = to_read; > + return cifs_readv_from_socket(server, _msg); > +} > > - return cifs_readv_from_socket(server, , 1, to_read); > +int >
[PATCH 6/6] cifs: don't bother with kmap on read_pages side
just do ITER_BVEC recvmsg Signed-off-by: Al Viro--- fs/cifs/cifsproto.h | 7 +++--- fs/cifs/connect.c | 65 - fs/cifs/file.c | 53 ++- 3 files changed, 55 insertions(+), 70 deletions(-) diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h index 7d5f53a..0f9a6bc 100644 --- a/fs/cifs/cifsproto.h +++ b/fs/cifs/cifsproto.h @@ -179,10 +179,9 @@ extern int set_cifs_acl(struct cifs_ntsd *, __u32, struct inode *, extern void dequeue_mid(struct mid_q_entry *mid, bool malformed); extern int cifs_read_from_socket(struct TCP_Server_Info *server, char *buf, -unsigned int to_read); -extern int cifs_readv_from_socket(struct TCP_Server_Info *server, - struct kvec *iov_orig, unsigned int nr_segs, - unsigned int to_read); +unsigned int to_read); +extern int cifs_read_page_from_socket(struct TCP_Server_Info *server, + struct page *page, unsigned int to_read); extern void cifs_setup_cifs_sb(struct smb_vol *pvolume_info, struct cifs_sb_info *cifs_sb); extern int cifs_match_super(struct super_block *, void *); diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index eb42665..e33c5e0 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c @@ -501,39 +501,34 @@ server_unresponsive(struct TCP_Server_Info *server) return false; } -int -cifs_readv_from_socket(struct TCP_Server_Info *server, struct kvec *iov_orig, - unsigned int nr_segs, unsigned int to_read) +static int +cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr *smb_msg) { int length = 0; int total_read; - struct msghdr smb_msg; - smb_msg.msg_control = NULL; - smb_msg.msg_controllen = 0; - iov_iter_kvec(_msg.msg_iter, READ | ITER_KVEC, - iov_orig, nr_segs, to_read); + smb_msg->msg_control = NULL; + smb_msg->msg_controllen = 0; - for (total_read = 0; msg_data_left(_msg); total_read += length) { + for (total_read = 0; msg_data_left(smb_msg); total_read += length) { try_to_freeze(); - if (server_unresponsive(server)) { - total_read = -ECONNABORTED; - break; - } + if (server_unresponsive(server)) + return -ECONNABORTED; - length = sock_recvmsg(server->ssocket, _msg, 0); + length = sock_recvmsg(server->ssocket, smb_msg, 0); - if (server->tcpStatus == CifsExiting) { - total_read = -ESHUTDOWN; - break; - } else if (server->tcpStatus == CifsNeedReconnect) { + if (server->tcpStatus == CifsExiting) + return -ESHUTDOWN; + + if (server->tcpStatus == CifsNeedReconnect) { cifs_reconnect(server); - total_read = -ECONNABORTED; - break; - } else if (length == -ERESTARTSYS || - length == -EAGAIN || - length == -EINTR) { + return -ECONNABORTED; + } + + if (length == -ERESTARTSYS || + length == -EAGAIN || + length == -EINTR) { /* * Minimum sleep to prevent looping, allowing socket * to clear and app threads to set tcpStatus @@ -542,11 +537,12 @@ cifs_readv_from_socket(struct TCP_Server_Info *server, struct kvec *iov_orig, usleep_range(1000, 2000); length = 0; continue; - } else if (length <= 0) { + } + + if (length <= 0) { cifs_dbg(FYI, "Received no data or error: %d\n", length); cifs_reconnect(server); - total_read = -ECONNABORTED; - break; + return -ECONNABORTED; } } return total_read; @@ -556,12 +552,21 @@ int cifs_read_from_socket(struct TCP_Server_Info *server, char *buf, unsigned int to_read) { - struct kvec iov; + struct msghdr smb_msg; + struct kvec iov = {.iov_base = buf, .iov_len = to_read}; + iov_iter_kvec(_msg.msg_iter, READ | ITER_KVEC, , 1, to_read); - iov.iov_base = buf; - iov.iov_len = to_read; + return cifs_readv_from_socket(server, _msg); +} - return cifs_readv_from_socket(server, , 1, to_read); +int +cifs_read_page_from_socket(struct TCP_Server_Info *server, struct page *page, + unsigned int to_read) +{ + struct msghdr smb_msg; +
[PATCH 6/6] cifs: don't bother with kmap on read_pages side
just do ITER_BVEC recvmsg Signed-off-by: Al Viro --- fs/cifs/cifsproto.h | 7 +++--- fs/cifs/connect.c | 65 - fs/cifs/file.c | 53 ++- 3 files changed, 55 insertions(+), 70 deletions(-) diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h index 7d5f53a..0f9a6bc 100644 --- a/fs/cifs/cifsproto.h +++ b/fs/cifs/cifsproto.h @@ -179,10 +179,9 @@ extern int set_cifs_acl(struct cifs_ntsd *, __u32, struct inode *, extern void dequeue_mid(struct mid_q_entry *mid, bool malformed); extern int cifs_read_from_socket(struct TCP_Server_Info *server, char *buf, -unsigned int to_read); -extern int cifs_readv_from_socket(struct TCP_Server_Info *server, - struct kvec *iov_orig, unsigned int nr_segs, - unsigned int to_read); +unsigned int to_read); +extern int cifs_read_page_from_socket(struct TCP_Server_Info *server, + struct page *page, unsigned int to_read); extern void cifs_setup_cifs_sb(struct smb_vol *pvolume_info, struct cifs_sb_info *cifs_sb); extern int cifs_match_super(struct super_block *, void *); diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index eb42665..e33c5e0 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c @@ -501,39 +501,34 @@ server_unresponsive(struct TCP_Server_Info *server) return false; } -int -cifs_readv_from_socket(struct TCP_Server_Info *server, struct kvec *iov_orig, - unsigned int nr_segs, unsigned int to_read) +static int +cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr *smb_msg) { int length = 0; int total_read; - struct msghdr smb_msg; - smb_msg.msg_control = NULL; - smb_msg.msg_controllen = 0; - iov_iter_kvec(_msg.msg_iter, READ | ITER_KVEC, - iov_orig, nr_segs, to_read); + smb_msg->msg_control = NULL; + smb_msg->msg_controllen = 0; - for (total_read = 0; msg_data_left(_msg); total_read += length) { + for (total_read = 0; msg_data_left(smb_msg); total_read += length) { try_to_freeze(); - if (server_unresponsive(server)) { - total_read = -ECONNABORTED; - break; - } + if (server_unresponsive(server)) + return -ECONNABORTED; - length = sock_recvmsg(server->ssocket, _msg, 0); + length = sock_recvmsg(server->ssocket, smb_msg, 0); - if (server->tcpStatus == CifsExiting) { - total_read = -ESHUTDOWN; - break; - } else if (server->tcpStatus == CifsNeedReconnect) { + if (server->tcpStatus == CifsExiting) + return -ESHUTDOWN; + + if (server->tcpStatus == CifsNeedReconnect) { cifs_reconnect(server); - total_read = -ECONNABORTED; - break; - } else if (length == -ERESTARTSYS || - length == -EAGAIN || - length == -EINTR) { + return -ECONNABORTED; + } + + if (length == -ERESTARTSYS || + length == -EAGAIN || + length == -EINTR) { /* * Minimum sleep to prevent looping, allowing socket * to clear and app threads to set tcpStatus @@ -542,11 +537,12 @@ cifs_readv_from_socket(struct TCP_Server_Info *server, struct kvec *iov_orig, usleep_range(1000, 2000); length = 0; continue; - } else if (length <= 0) { + } + + if (length <= 0) { cifs_dbg(FYI, "Received no data or error: %d\n", length); cifs_reconnect(server); - total_read = -ECONNABORTED; - break; + return -ECONNABORTED; } } return total_read; @@ -556,12 +552,21 @@ int cifs_read_from_socket(struct TCP_Server_Info *server, char *buf, unsigned int to_read) { - struct kvec iov; + struct msghdr smb_msg; + struct kvec iov = {.iov_base = buf, .iov_len = to_read}; + iov_iter_kvec(_msg.msg_iter, READ | ITER_KVEC, , 1, to_read); - iov.iov_base = buf; - iov.iov_len = to_read; + return cifs_readv_from_socket(server, _msg); +} - return cifs_readv_from_socket(server, , 1, to_read); +int +cifs_read_page_from_socket(struct TCP_Server_Info *server, struct page *page, + unsigned int to_read) +{ + struct msghdr smb_msg; + struct bio_vec bv =