lkml.org 
[lkml]   [2013]   [Jan]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v5 23/45] [SCSI] fcoe: Use get/put_online_cpus_atomic() to prevent CPU offline
    Date
    Once stop_machine() is gone from the CPU offline path, we won't be able to
    depend on preempt_disable() or local_irq_disable() to prevent CPUs from
    going offline from under us.

    Use the get/put_online_cpus_atomic() APIs to prevent CPUs from going offline,
    while invoking from atomic context.

    Cc: Robert Love <robert.w.love@intel.com>
    Cc: "James E.J. Bottomley" <JBottomley@parallels.com>
    Cc: devel@open-fcoe.org
    Cc: linux-scsi@vger.kernel.org
    Signed-off-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
    ---

    drivers/scsi/fcoe/fcoe.c | 7 ++++++-
    1 file changed, 6 insertions(+), 1 deletion(-)

    diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c
    index 666b7ac..c971a17 100644
    --- a/drivers/scsi/fcoe/fcoe.c
    +++ b/drivers/scsi/fcoe/fcoe.c
    @@ -1475,6 +1475,7 @@ static int fcoe_rcv(struct sk_buff *skb, struct net_device *netdev,
    * was originated, otherwise select cpu using rx exchange id
    * or fcoe_select_cpu().
    */
    + get_online_cpus_atomic();
    if (ntoh24(fh->fh_f_ctl) & FC_FC_EX_CTX)
    cpu = ntohs(fh->fh_ox_id) & fc_cpu_mask;
    else {
    @@ -1484,8 +1485,10 @@ static int fcoe_rcv(struct sk_buff *skb, struct net_device *netdev,
    cpu = ntohs(fh->fh_rx_id) & fc_cpu_mask;
    }

    - if (cpu >= nr_cpu_ids)
    + if (cpu >= nr_cpu_ids) {
    + put_online_cpus_atomic();
    goto err;
    + }

    fps = &per_cpu(fcoe_percpu, cpu);
    spin_lock(&fps->fcoe_rx_list.lock);
    @@ -1505,6 +1508,7 @@ static int fcoe_rcv(struct sk_buff *skb, struct net_device *netdev,
    spin_lock(&fps->fcoe_rx_list.lock);
    if (!fps->thread) {
    spin_unlock(&fps->fcoe_rx_list.lock);
    + put_online_cpus_atomic();
    goto err;
    }
    }
    @@ -1526,6 +1530,7 @@ static int fcoe_rcv(struct sk_buff *skb, struct net_device *netdev,
    if (fps->thread->state == TASK_INTERRUPTIBLE)
    wake_up_process(fps->thread);
    spin_unlock(&fps->fcoe_rx_list.lock);
    + put_online_cpus_atomic();

    return 0;
    err:


    \
     
     \ /
      Last update: 2013-01-22 12:21    [W:4.295 / U:0.188 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site