Skip to content

Commit

Permalink
cifs: sort interface list by speed
Browse files Browse the repository at this point in the history
New channels are going to be opened by walking the list sequentially,
so by sorting it we will connect to the fastest interfaces first.

Signed-off-by: Aurelien Aptel <aaptel@suse.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
  • Loading branch information
Aurelien Aptel authored and Steve French committed Nov 25, 2019
1 parent fa9c236 commit 35adffe
Showing 1 changed file with 11 additions and 0 deletions.
11 changes: 11 additions & 0 deletions fs/cifs/smb2ops.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include <linux/falloc.h>
#include <linux/scatterlist.h>
#include <linux/uuid.h>
#include <linux/sort.h>
#include <crypto/aead.h>
#include "cifsglob.h"
#include "smb2pdu.h"
Expand Down Expand Up @@ -552,6 +553,13 @@ parse_server_interfaces(struct network_interface_info_ioctl_rsp *buf,
return rc;
}

static int compare_iface(const void *ia, const void *ib)
{
const struct cifs_server_iface *a = (struct cifs_server_iface *)ia;
const struct cifs_server_iface *b = (struct cifs_server_iface *)ib;

return a->speed == b->speed ? 0 : (a->speed > b->speed ? -1 : 1);
}

static int
SMB3_request_interfaces(const unsigned int xid, struct cifs_tcon *tcon)
Expand Down Expand Up @@ -581,6 +589,9 @@ SMB3_request_interfaces(const unsigned int xid, struct cifs_tcon *tcon)
if (rc)
goto out;

/* sort interfaces from fastest to slowest */
sort(iface_list, iface_count, sizeof(*iface_list), compare_iface, NULL);

spin_lock(&ses->iface_lock);
kfree(ses->iface_list);
ses->iface_list = iface_list;
Expand Down

0 comments on commit 35adffe

Please sign in to comment.