]>
Commit | Line | Data |
---|---|---|
4d1e5b62 AF |
1 | From: Vasu Dev <vasu.dev@intel.com> |
2 | Subject: [FcOE] improved load balancing in rx path | |
3 | References: bnc #459142 | |
4 | ||
5 | Currently incoming frame exchange id ANDing with total number of bits | |
6 | in online CPU bits mask, resulted only at most two CPUs selection in | |
7 | rx path, so instead used online CPU bits mask to direct incoming frame | |
8 | to a all cpus for better load balancing. | |
9 | ||
10 | Added code to default to first CPU in case selected CPU is offline or | |
11 | its rx thread not present. | |
12 | ||
13 | Signed-off-by: Vasu Dev <vasu.dev@intel.com> | |
14 | Acked-by: Bernhard Walle <bwalle@suse.de> | |
15 | --- | |
16 | ||
17 | drivers/scsi/fcoe/libfcoe.c | 13 +++++++------ | |
18 | 1 file changed, 7 insertions(+), 6 deletions(-) | |
19 | ||
20 | ||
21 | --- a/drivers/scsi/fcoe/libfcoe.c | |
22 | +++ b/drivers/scsi/fcoe/libfcoe.c | |
23 | @@ -230,13 +230,14 @@ int fcoe_rcv(struct sk_buff *skb, struct | |
24 | cpu_idx = 0; | |
25 | #ifdef CONFIG_SMP | |
26 | /* | |
27 | - * The exchange ID are ANDed with num of online CPUs, | |
28 | - * so that will have the least lock contention in | |
29 | - * handling the exchange. if there is no thread | |
30 | - * for a given idx then use first online cpu. | |
31 | + * The incoming frame exchange id(oxid) is ANDed with num of online | |
32 | + * cpu bits to get cpu_idx and then this cpu_idx is used for selecting | |
33 | + * a per cpu kernel thread from fcoe_percpu. In case the cpu is | |
34 | + * offline or no kernel thread for derived cpu_idx then cpu_idx is | |
35 | + * initialize to first online cpu index. | |
36 | */ | |
37 | - cpu_idx = oxid & (num_online_cpus() >> 1); | |
38 | - if (fcoe_percpu[cpu_idx] == NULL) | |
39 | + cpu_idx = oxid & (num_online_cpus() - 1); | |
40 | + if (!fcoe_percpu[cpu_idx] || !cpu_online(cpu_idx)) | |
41 | cpu_idx = first_cpu(cpu_online_map); | |
42 | #endif | |
43 | fps = fcoe_percpu[cpu_idx]; |