Merge branch 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 7 Jan 2011 22:50:50 +0000 (14:50 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 7 Jan 2011 22:50:50 +0000 (14:50 -0800)
* 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6: (65 commits)
  [S390] prevent unneccesary loops_per_jiffy recalculation
  [S390] cpuinfo: use get_online_cpus() instead of preempt_disable()
  [S390] smp: remove cpu hotplug messages
  [S390] mutex: enable spinning mutex on s390
  [S390] mutex: Introduce arch_mutex_cpu_relax()
  [S390] cio: fix ccwgroup unregistration race condition
  [S390] perf: add DWARF register lookup for s390
  [S390] cleanup ftrace backend functions
  [S390] ptrace cleanup
  [S390] smp/idle: call init_idle() before starting a new cpu
  [S390] smp: delay idle task creation
  [S390] dasd: Correct retry counter for terminated I/O.
  [S390] dasd: Add support for raw ECKD access.
  [S390] dasd: Prevent deadlock during suspend/resume.
  [S390] dasd: Improve handling of stolen DASD reservation
  [S390] dasd: do path verification for paths added at runtime
  [S390] dasd: add High Performance FICON multitrack support
  [S390] cio: reduce memory consumption of itcw structures
  [S390] nmi: enable machine checks early
  [S390] qeth: buffer count imbalance
  ...

1  2 
drivers/s390/net/lcs.c
drivers/s390/scsi/zfcp_qdio.c

diff --combined drivers/s390/net/lcs.c
index c9f13b9ea339e12ae4650bf3537e74d74355d39d,0bf708944314d7a9f08b6c5fea917ffc1f462f97..09e7a053c8443afacf7440a4966e66a9ec26eb3d
@@@ -26,6 -26,7 +26,7 @@@
  #define KMSG_COMPONENT                "lcs"
  #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
  
+ #include <linux/kernel_stat.h>
  #include <linux/module.h>
  #include <linux/if.h>
  #include <linux/netdevice.h>
@@@ -1188,8 -1189,7 +1189,8 @@@ lcs_remove_mc_addresses(struct lcs_car
        spin_lock_irqsave(&card->ipm_lock, flags);
        list_for_each(l, &card->ipm_list) {
                ipm = list_entry(l, struct lcs_ipm_list, list);
 -              for (im4 = in4_dev->mc_list; im4 != NULL; im4 = im4->next) {
 +              for (im4 = rcu_dereference(in4_dev->mc_list);
 +                   im4 != NULL; im4 = rcu_dereference(im4->next_rcu)) {
                        lcs_get_mac_for_ipm(im4->multiaddr, buf, card->dev);
                        if ( (ipm->ipm.ip_addr == im4->multiaddr) &&
                             (memcmp(buf, &ipm->ipm.mac_addr,
@@@ -1234,8 -1234,7 +1235,8 @@@ lcs_set_mc_addresses(struct lcs_card *c
        unsigned long flags;
  
        LCS_DBF_TEXT(4, trace, "setmclst");
 -      for (im4 = in4_dev->mc_list; im4; im4 = im4->next) {
 +      for (im4 = rcu_dereference(in4_dev->mc_list); im4 != NULL;
 +           im4 = rcu_dereference(im4->next_rcu)) {
                lcs_get_mac_for_ipm(im4->multiaddr, buf, card->dev);
                ipm = lcs_check_addr_entry(card, im4, buf);
                if (ipm != NULL)
@@@ -1271,10 -1270,10 +1272,10 @@@ lcs_register_mc_addresses(void *data
        in4_dev = in_dev_get(card->dev);
        if (in4_dev == NULL)
                goto out;
 -      read_lock(&in4_dev->mc_list_lock);
 +      rcu_read_lock();
        lcs_remove_mc_addresses(card,in4_dev);
        lcs_set_mc_addresses(card, in4_dev);
 -      read_unlock(&in4_dev->mc_list_lock);
 +      rcu_read_unlock();
        in_dev_put(in4_dev);
  
        netif_carrier_off(card->dev);
@@@ -1398,6 -1397,7 +1399,7 @@@ lcs_irq(struct ccw_device *cdev, unsign
        int rc, index;
        int cstat, dstat;
  
+       kstat_cpu(smp_processor_id()).irqs[IOINT_LCS]++;
        if (lcs_check_irb_error(cdev, irb))
                return;
  
index 2511f92302dd55803b03370af11bc291316ef097,5ae40ef586a89f6a3204ea54850e5cbbdbadeb8a..8da5ed644c2b4314a4cc362f874e22efa02c4e52
@@@ -41,7 -41,7 +41,7 @@@ static void zfcp_qdio_handler_error(str
                zfcp_qdio_siosl(adapter);
        zfcp_erp_adapter_reopen(adapter,
                                ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED |
 -                              ZFCP_STATUS_COMMON_ERP_FAILED, id, NULL);
 +                              ZFCP_STATUS_COMMON_ERP_FAILED, id);
  }
  
  static void zfcp_qdio_zero_sbals(struct qdio_buffer *sbal[], int first, int cnt)
@@@ -74,6 -74,7 +74,6 @@@ static void zfcp_qdio_int_req(struct cc
        struct zfcp_qdio *qdio = (struct zfcp_qdio *) parm;
  
        if (unlikely(qdio_err)) {
 -              zfcp_dbf_hba_qdio(qdio->adapter->dbf, qdio_err, idx, count);
                zfcp_qdio_handler_error(qdio, "qdireq1", qdio_err);
                return;
        }
@@@ -96,6 -97,7 +96,6 @@@ static void zfcp_qdio_int_resp(struct c
        int sbal_idx, sbal_no;
  
        if (unlikely(qdio_err)) {
 -              zfcp_dbf_hba_qdio(qdio->adapter->dbf, qdio_err, idx, count);
                zfcp_qdio_handler_error(qdio, "qdires1", qdio_err);
                return;
        }
         * put SBALs back to response queue
         */
        if (do_QDIO(cdev, QDIO_FLAG_SYNC_INPUT, 0, idx, count))
 -              zfcp_erp_adapter_reopen(qdio->adapter, 0, "qdires2", NULL);
 +              zfcp_erp_adapter_reopen(qdio->adapter, 0, "qdires2");
  }
  
  static struct qdio_buffer_element *
@@@ -234,7 -236,7 +234,7 @@@ int zfcp_qdio_sbal_get(struct zfcp_qdi
        if (!ret) {
                atomic_inc(&qdio->req_q_full);
                /* assume hanging outbound queue, try queue recovery */
 -              zfcp_erp_adapter_reopen(qdio->adapter, 0, "qdsbg_1", NULL);
 +              zfcp_erp_adapter_reopen(qdio->adapter, 0, "qdsbg_1");
        }
  
        spin_lock_irq(&qdio->req_q_lock);
@@@ -290,6 -292,8 +290,8 @@@ static void zfcp_qdio_setup_init_data(s
        id->int_parm = (unsigned long) qdio;
        id->input_sbal_addr_array = (void **) (qdio->res_q);
        id->output_sbal_addr_array = (void **) (qdio->req_q);
+       id->scan_threshold =
+               QDIO_MAX_BUFFERS_PER_Q - ZFCP_QDIO_MAX_SBALS_PER_REQ * 2;
  }
  
  /**
@@@ -307,7 -311,6 +309,7 @@@ static int zfcp_qdio_allocate(struct zf
                return -ENOMEM;
  
        zfcp_qdio_setup_init_data(&init_data, qdio);
 +      init_waitqueue_head(&qdio->req_q_wq);
  
        return qdio_allocate(&init_data);
  }
@@@ -392,7 -395,6 +394,7 @@@ int zfcp_qdio_open(struct zfcp_qdio *qd
        /* set index of first avalable SBALS / number of available SBALS */
        qdio->req_q_idx = 0;
        atomic_set(&qdio->req_q_free, QDIO_MAX_BUFFERS_PER_Q);
 +      atomic_set_mask(ZFCP_STATUS_ADAPTER_QDIOUP, &qdio->adapter->status);
  
        return 0;