summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKiran Patil2011-06-21 01:59:25 +0200
committerJames Bottomley2011-06-29 23:30:02 +0200
commit29bdd2bb3e48c742e6b5a0be2ff2fa00e9838fe0 (patch)
tree0c0726bae03a45e72127dac08f09b62aa6314d90
parent[SCSI] fcoe: Round-robin based selection of CPU for post-processing of incomi... (diff)
downloadkernel-qcow2-linux-29bdd2bb3e48c742e6b5a0be2ff2fa00e9838fe0.tar.gz
kernel-qcow2-linux-29bdd2bb3e48c742e6b5a0be2ff2fa00e9838fe0.tar.xz
kernel-qcow2-linux-29bdd2bb3e48c742e6b5a0be2ff2fa00e9838fe0.zip
[SCSI] fcoe: Amends previous patch, Round-robin based selection of CPU for post processing of incoming request for FCoE target
Problem: Selection of RX queue on target is based on RX-ID. FCoE used 8 Net Rx queues. HW post the packets based on rx_id % num_rx_queue. Due to this has based filtering, only one CPU is busy servicing incoming request including post-processing of incoming request. This is gating factor because 1. Only one CPU is utilized 100% while others CPUs are not used at all. 2. CPU which received request assign "sequence' by selecting exchange from per CPU pool (num_ddp_context / num_online_cpus, approxi.). Due to which if if rate of incoming request is higher than rate of servicing request, existing code path end of sending "BUSY" response (SAM_STAT_BUSY because unable to allocate exchange). Fix: Fan-out incoming request to all other CPUs excluding the CPU which is receiving all incoiming request. This path also addresses, selecting same CPU based on rx_id from received frame for completion of the request such as "releasing exchange to the per CPU Pool". This fix is applicable for FCoE target since initiator code path already takes care of selecting CPU to complete post-processing of request once OX_ID is assigned. Notes: N/A Dependencines: N/A Signed-off-by: Kiran Patil <kiran.patil@intel.com> Signed-off-by: Robert Love <robert.w.love@intel.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
-rw-r--r--drivers/scsi/fcoe/fcoe.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c
index da73115ddf4d..522fbaaf9782 100644
--- a/drivers/scsi/fcoe/fcoe.c
+++ b/drivers/scsi/fcoe/fcoe.c
@@ -1358,7 +1358,11 @@ int fcoe_rcv(struct sk_buff *skb, struct net_device *netdev,
do {
cpu = fcoe_select_cpu(cpu);
} while (!cpu_online(cpu));
- }
+ } else if ((fh->fh_type == FC_TYPE_FCP) &&
+ (ntohs(fh->fh_rx_id) != FC_XID_UNKNOWN)) {
+ cpu = ntohs(fh->fh_rx_id) & fc_cpu_mask;
+ } else
+ cpu = smp_processor_id();
}
fps = &per_cpu(fcoe_percpu, cpu);
spin_lock_bh(&fps->fcoe_rx_list.lock);