verbs.c (bec7c79cd8f764ba84c8ec6d8c402b8a7cd3a54f) | verbs.c (8e959601996dc645f4ed7004482a1667c27deb39) |
---|---|
1/* 2 * Copyright(c) 2015 - 2017 Intel Corporation. 3 * 4 * This file is provided under a dual BSD/GPLv2 license. When using or 5 * redistributing this file, you may do so under either license. 6 * 7 * GPL LICENSE SUMMARY 8 * --- 494 unchanged lines hidden (view full) --- 503 length = 8; 504 goto again; 505 } 506} 507 508/* 509 * Make sure the QP is ready and able to accept the given opcode. 510 */ | 1/* 2 * Copyright(c) 2015 - 2017 Intel Corporation. 3 * 4 * This file is provided under a dual BSD/GPLv2 license. When using or 5 * redistributing this file, you may do so under either license. 6 * 7 * GPL LICENSE SUMMARY 8 * --- 494 unchanged lines hidden (view full) --- 503 length = 8; 504 goto again; 505 } 506} 507 508/* 509 * Make sure the QP is ready and able to accept the given opcode. 510 */ |
511static inline opcode_handler qp_ok(struct hfi1_packet *packet) | 511static inline opcode_handler qp_ok(int opcode, struct hfi1_packet *packet) |
512{ 513 if (!(ib_rvt_state_ops[packet->qp->state] & RVT_PROCESS_RECV_OK)) 514 return NULL; | 512{ 513 if (!(ib_rvt_state_ops[packet->qp->state] & RVT_PROCESS_RECV_OK)) 514 return NULL; |
515 if (((packet->opcode & RVT_OPCODE_QP_MASK) == 516 packet->qp->allowed_ops) || 517 (packet->opcode == IB_OPCODE_CNP)) 518 return opcode_handler_tbl[packet->opcode]; | 515 if (((opcode & RVT_OPCODE_QP_MASK) == packet->qp->allowed_ops) || 516 (opcode == IB_OPCODE_CNP)) 517 return opcode_handler_tbl[opcode]; |
519 520 return NULL; 521} 522 523static u64 hfi1_fault_tx(struct rvt_qp *qp, u8 opcode, u64 pbc) 524{ 525#ifdef CONFIG_FAULT_INJECTION 526 if ((opcode & IB_OPCODE_MSP) == IB_OPCODE_MSP) --- 17 unchanged lines hidden (view full) --- 544 * a 'late ebp error' will be 545 * triggered and will be dropped. 546 */ 547 pbc |= PBC_TEST_EBP; 548#endif 549 return pbc; 550} 551 | 518 519 return NULL; 520} 521 522static u64 hfi1_fault_tx(struct rvt_qp *qp, u8 opcode, u64 pbc) 523{ 524#ifdef CONFIG_FAULT_INJECTION 525 if ((opcode & IB_OPCODE_MSP) == IB_OPCODE_MSP) --- 17 unchanged lines hidden (view full) --- 543 * a 'late ebp error' will be 544 * triggered and will be dropped. 545 */ 546 pbc |= PBC_TEST_EBP; 547#endif 548 return pbc; 549} 550 |
552static inline void hfi1_handle_packet(struct hfi1_packet *packet, 553 bool is_mcast) | 551/** 552 * hfi1_ib_rcv - process an incoming packet 553 * @packet: data packet information 554 * 555 * This is called to process an incoming packet at interrupt level. 556 * 557 * Tlen is the length of the header + data + CRC in bytes. 558 */ 559void hfi1_ib_rcv(struct hfi1_packet *packet) |
554{ | 560{ |
555 u32 qp_num; | |
556 struct hfi1_ctxtdata *rcd = packet->rcd; | 561 struct hfi1_ctxtdata *rcd = packet->rcd; |
562 struct ib_header *hdr = packet->hdr; 563 u32 tlen = packet->tlen; |
|
557 struct hfi1_pportdata *ppd = rcd->ppd; 558 struct hfi1_ibport *ibp = rcd_to_iport(rcd); 559 struct rvt_dev_info *rdi = &ppd->dd->verbs_dev.rdi; 560 opcode_handler packet_handler; 561 unsigned long flags; | 564 struct hfi1_pportdata *ppd = rcd->ppd; 565 struct hfi1_ibport *ibp = rcd_to_iport(rcd); 566 struct rvt_dev_info *rdi = &ppd->dd->verbs_dev.rdi; 567 opcode_handler packet_handler; 568 unsigned long flags; |
569 u32 qp_num; 570 int lnh; 571 u8 opcode; 572 u16 lid; |
|
562 | 573 |
563 inc_opstats(packet->tlen, &rcd->opstats->stats[packet->opcode]); | 574 /* Check for GRH */ 575 lnh = ib_get_lnh(hdr); 576 if (lnh == HFI1_LRH_BTH) { 577 packet->ohdr = &hdr->u.oth; 578 } else if (lnh == HFI1_LRH_GRH) { 579 u32 vtf; |
564 | 580 |
565 if (unlikely(is_mcast)) { | 581 packet->ohdr = &hdr->u.l.oth; 582 if (hdr->u.l.grh.next_hdr != IB_GRH_NEXT_HDR) 583 goto drop; 584 vtf = be32_to_cpu(hdr->u.l.grh.version_tclass_flow); 585 if ((vtf >> IB_GRH_VERSION_SHIFT) != IB_GRH_VERSION) 586 goto drop; 587 packet->rcv_flags |= HFI1_HAS_GRH; 588 } else { 589 goto drop; 590 } 591 592 trace_input_ibhdr(rcd->dd, hdr); 593 594 opcode = ib_bth_get_opcode(packet->ohdr); 595 inc_opstats(tlen, &rcd->opstats->stats[opcode]); 596 597 /* Get the destination QP number. */ 598 qp_num = be32_to_cpu(packet->ohdr->bth[1]) & RVT_QPN_MASK; 599 lid = ib_get_dlid(hdr); 600 if (unlikely((lid >= be16_to_cpu(IB_MULTICAST_LID_BASE)) && 601 (lid != be16_to_cpu(IB_LID_PERMISSIVE)))) { |
566 struct rvt_mcast *mcast; 567 struct rvt_mcast_qp *p; 568 | 602 struct rvt_mcast *mcast; 603 struct rvt_mcast_qp *p; 604 |
569 if (!packet->grh) | 605 if (lnh != HFI1_LRH_GRH) |
570 goto drop; | 606 goto drop; |
571 mcast = rvt_mcast_find(&ibp->rvp, 572 &packet->grh->dgid, 573 packet->dlid); | 607 mcast = rvt_mcast_find(&ibp->rvp, &hdr->u.l.grh.dgid, lid); |
574 if (!mcast) 575 goto drop; 576 list_for_each_entry_rcu(p, &mcast->qp_list, list) { 577 packet->qp = p->qp; 578 spin_lock_irqsave(&packet->qp->r_lock, flags); | 608 if (!mcast) 609 goto drop; 610 list_for_each_entry_rcu(p, &mcast->qp_list, list) { 611 packet->qp = p->qp; 612 spin_lock_irqsave(&packet->qp->r_lock, flags); |
579 packet_handler = qp_ok(packet); | 613 packet_handler = qp_ok(opcode, packet); |
580 if (likely(packet_handler)) 581 packet_handler(packet); 582 else 583 ibp->rvp.n_pkt_drops++; 584 spin_unlock_irqrestore(&packet->qp->r_lock, flags); 585 } 586 /* 587 * Notify rvt_multicast_detach() if it is waiting for us 588 * to finish. 589 */ 590 if (atomic_dec_return(&mcast->refcount) <= 1) 591 wake_up(&mcast->wait); 592 } else { | 614 if (likely(packet_handler)) 615 packet_handler(packet); 616 else 617 ibp->rvp.n_pkt_drops++; 618 spin_unlock_irqrestore(&packet->qp->r_lock, flags); 619 } 620 /* 621 * Notify rvt_multicast_detach() if it is waiting for us 622 * to finish. 623 */ 624 if (atomic_dec_return(&mcast->refcount) <= 1) 625 wake_up(&mcast->wait); 626 } else { |
593 /* Get the destination QP number. */ 594 qp_num = ib_bth_get_qpn(packet->ohdr); | |
595 rcu_read_lock(); 596 packet->qp = rvt_lookup_qpn(rdi, &ibp->rvp, qp_num); 597 if (!packet->qp) { 598 rcu_read_unlock(); 599 goto drop; 600 } | 627 rcu_read_lock(); 628 packet->qp = rvt_lookup_qpn(rdi, &ibp->rvp, qp_num); 629 if (!packet->qp) { 630 rcu_read_unlock(); 631 goto drop; 632 } |
601 if (unlikely(hfi1_dbg_fault_opcode(packet->qp, packet->opcode, | 633 if (unlikely(hfi1_dbg_fault_opcode(packet->qp, opcode, |
602 true))) { 603 rcu_read_unlock(); 604 goto drop; 605 } 606 spin_lock_irqsave(&packet->qp->r_lock, flags); | 634 true))) { 635 rcu_read_unlock(); 636 goto drop; 637 } 638 spin_lock_irqsave(&packet->qp->r_lock, flags); |
607 packet_handler = qp_ok(packet); | 639 packet_handler = qp_ok(opcode, packet); |
608 if (likely(packet_handler)) 609 packet_handler(packet); 610 else 611 ibp->rvp.n_pkt_drops++; 612 spin_unlock_irqrestore(&packet->qp->r_lock, flags); 613 rcu_read_unlock(); 614 } 615 return; | 640 if (likely(packet_handler)) 641 packet_handler(packet); 642 else 643 ibp->rvp.n_pkt_drops++; 644 spin_unlock_irqrestore(&packet->qp->r_lock, flags); 645 rcu_read_unlock(); 646 } 647 return; |
648 |
|
616drop: 617 ibp->rvp.n_pkt_drops++; 618} 619 | 649drop: 650 ibp->rvp.n_pkt_drops++; 651} 652 |
620/** 621 * hfi1_ib_rcv - process an incoming packet 622 * @packet: data packet information 623 * 624 * This is called to process an incoming packet at interrupt level. 625 */ 626void hfi1_ib_rcv(struct hfi1_packet *packet) 627{ 628 struct hfi1_ctxtdata *rcd = packet->rcd; 629 bool is_mcast = false; 630 631 if (unlikely(hfi1_check_mcast(packet->dlid))) 632 is_mcast = true; 633 634 trace_input_ibhdr(rcd->dd, packet, 635 !!(packet->rhf & RHF_DC_INFO_SMASK)); 636 hfi1_handle_packet(packet, is_mcast); 637} 638 | |
639/* 640 * This is called from a timer to check for QPs 641 * which need kernel memory in order to send a packet. 642 */ 643static void mem_timer(unsigned long data) 644{ 645 struct hfi1_ibdev *dev = (struct hfi1_ibdev *)data; 646 struct list_head *list = &dev->memwait; --- 197 unchanged lines hidden (view full) --- 844 tx = ps->s_txreq; 845 if (!sdma_txreq_built(&tx->txreq)) { 846 if (likely(pbc == 0)) { 847 u32 vl = sc_to_vlt(dd_from_ibdev(qp->ibqp.device), sc5); 848 u8 opcode = get_opcode(&tx->phdr.hdr); 849 850 /* No vl15 here */ 851 /* set PBC_DC_INFO bit (aka SC[4]) in pbc_flags */ | 653/* 654 * This is called from a timer to check for QPs 655 * which need kernel memory in order to send a packet. 656 */ 657static void mem_timer(unsigned long data) 658{ 659 struct hfi1_ibdev *dev = (struct hfi1_ibdev *)data; 660 struct list_head *list = &dev->memwait; --- 197 unchanged lines hidden (view full) --- 858 tx = ps->s_txreq; 859 if (!sdma_txreq_built(&tx->txreq)) { 860 if (likely(pbc == 0)) { 861 u32 vl = sc_to_vlt(dd_from_ibdev(qp->ibqp.device), sc5); 862 u8 opcode = get_opcode(&tx->phdr.hdr); 863 864 /* No vl15 here */ 865 /* set PBC_DC_INFO bit (aka SC[4]) in pbc_flags */ |
852 pbc |= (ib_is_sc5(sc5) << PBC_DC_INFO_SHIFT); | 866 pbc |= (!!(sc5 & 0x10)) << PBC_DC_INFO_SHIFT; |
853 854 if (unlikely(hfi1_dbg_fault_opcode(qp, opcode, false))) 855 pbc = hfi1_fault_tx(qp, opcode, pbc); 856 pbc = create_pbc(ppd, 857 pbc, 858 qp->srate_mbps, 859 vl, 860 plen); --- 5 unchanged lines hidden (view full) --- 866 } 867 ret = sdma_send_txreq(tx->sde, &priv->s_iowait, &tx->txreq); 868 if (unlikely(ret < 0)) { 869 if (ret == -ECOMM) 870 goto bail_ecomm; 871 return ret; 872 } 873 trace_sdma_output_ibhdr(dd_from_ibdev(qp->ibqp.device), | 867 868 if (unlikely(hfi1_dbg_fault_opcode(qp, opcode, false))) 869 pbc = hfi1_fault_tx(qp, opcode, pbc); 870 pbc = create_pbc(ppd, 871 pbc, 872 qp->srate_mbps, 873 vl, 874 plen); --- 5 unchanged lines hidden (view full) --- 880 } 881 ret = sdma_send_txreq(tx->sde, &priv->s_iowait, &tx->txreq); 882 if (unlikely(ret < 0)) { 883 if (ret == -ECOMM) 884 goto bail_ecomm; 885 return ret; 886 } 887 trace_sdma_output_ibhdr(dd_from_ibdev(qp->ibqp.device), |
874 &ps->s_txreq->phdr.hdr, ib_is_sc5(sc5)); | 888 &ps->s_txreq->phdr.hdr); |
875 return ret; 876 877bail_ecomm: 878 /* The current one got "sent" */ 879 return 0; 880bail_build: 881 ret = wait_kmem(dev, qp, ps); 882 if (!ret) { --- 97 unchanged lines hidden (view full) --- 980 sc = ps->s_txreq->psc; 981 982 if (likely(pbc == 0)) { 983 u8 vl = sc_to_vlt(dd_from_ibdev(qp->ibqp.device), sc5); 984 struct verbs_txreq *tx = ps->s_txreq; 985 u8 opcode = get_opcode(&tx->phdr.hdr); 986 987 /* set PBC_DC_INFO bit (aka SC[4]) in pbc_flags */ | 889 return ret; 890 891bail_ecomm: 892 /* The current one got "sent" */ 893 return 0; 894bail_build: 895 ret = wait_kmem(dev, qp, ps); 896 if (!ret) { --- 97 unchanged lines hidden (view full) --- 994 sc = ps->s_txreq->psc; 995 996 if (likely(pbc == 0)) { 997 u8 vl = sc_to_vlt(dd_from_ibdev(qp->ibqp.device), sc5); 998 struct verbs_txreq *tx = ps->s_txreq; 999 u8 opcode = get_opcode(&tx->phdr.hdr); 1000 1001 /* set PBC_DC_INFO bit (aka SC[4]) in pbc_flags */ |
988 pbc |= (ib_is_sc5(sc5) << PBC_DC_INFO_SHIFT); | 1002 pbc |= (!!(sc5 & 0x10)) << PBC_DC_INFO_SHIFT; |
989 if (unlikely(hfi1_dbg_fault_opcode(qp, opcode, false))) 990 pbc = hfi1_fault_tx(qp, opcode, pbc); 991 pbc = create_pbc(ppd, pbc, qp->srate_mbps, vl, plen); 992 } 993 if (cb) 994 iowait_pio_inc(&priv->s_iowait); 995 pbuf = sc_buffer_alloc(sc, plen, cb, qp); 996 if (unlikely(!pbuf)) { --- 42 unchanged lines hidden (view full) --- 1039 seg_pio_copy_mid(pbuf, addr, slen); 1040 len -= slen; 1041 } 1042 seg_pio_copy_end(pbuf); 1043 } 1044 } 1045 1046 trace_pio_output_ibhdr(dd_from_ibdev(qp->ibqp.device), | 1003 if (unlikely(hfi1_dbg_fault_opcode(qp, opcode, false))) 1004 pbc = hfi1_fault_tx(qp, opcode, pbc); 1005 pbc = create_pbc(ppd, pbc, qp->srate_mbps, vl, plen); 1006 } 1007 if (cb) 1008 iowait_pio_inc(&priv->s_iowait); 1009 pbuf = sc_buffer_alloc(sc, plen, cb, qp); 1010 if (unlikely(!pbuf)) { --- 42 unchanged lines hidden (view full) --- 1053 seg_pio_copy_mid(pbuf, addr, slen); 1054 len -= slen; 1055 } 1056 seg_pio_copy_end(pbuf); 1057 } 1058 } 1059 1060 trace_pio_output_ibhdr(dd_from_ibdev(qp->ibqp.device), |
1047 &ps->s_txreq->phdr.hdr, ib_is_sc5(sc5)); | 1061 &ps->s_txreq->phdr.hdr); |
1048 1049pio_bail: 1050 if (qp->s_wqe) { 1051 spin_lock_irqsave(&qp->s_lock, flags); 1052 hfi1_send_complete(qp, qp->s_wqe, wc_status); 1053 spin_unlock_irqrestore(&qp->s_lock, flags); 1054 } else if (qp->ibqp.qp_type == IB_QPT_RC) { 1055 spin_lock_irqsave(&qp->s_lock, flags); --- 293 unchanged lines hidden (view full) --- 1349 struct hfi1_pportdata *ppd = &dd->pport[port_num - 1]; 1350 u16 lid = ppd->lid; 1351 1352 /* props being zeroed by the caller, avoid zeroing it here */ 1353 props->lid = lid ? lid : 0; 1354 props->lmc = ppd->lmc; 1355 /* OPA logical states match IB logical states */ 1356 props->state = driver_lstate(ppd); | 1062 1063pio_bail: 1064 if (qp->s_wqe) { 1065 spin_lock_irqsave(&qp->s_lock, flags); 1066 hfi1_send_complete(qp, qp->s_wqe, wc_status); 1067 spin_unlock_irqrestore(&qp->s_lock, flags); 1068 } else if (qp->ibqp.qp_type == IB_QPT_RC) { 1069 spin_lock_irqsave(&qp->s_lock, flags); --- 293 unchanged lines hidden (view full) --- 1363 struct hfi1_pportdata *ppd = &dd->pport[port_num - 1]; 1364 u16 lid = ppd->lid; 1365 1366 /* props being zeroed by the caller, avoid zeroing it here */ 1367 props->lid = lid ? lid : 0; 1368 props->lmc = ppd->lmc; 1369 /* OPA logical states match IB logical states */ 1370 props->state = driver_lstate(ppd); |
1357 props->phys_state = driver_pstate(ppd); | 1371 props->phys_state = hfi1_ibphys_portstate(ppd); |
1358 props->gid_tbl_len = HFI1_GUIDS_PER_PORT; 1359 props->active_width = (u8)opa_width_to_ib(ppd->link_width_active); 1360 /* see rate_show() in ib core/sysfs.c */ 1361 props->active_speed = (u8)opa_speed_to_ib(ppd->link_speed_active); 1362 props->max_vl_num = ppd->vls_supported; 1363 1364 /* Once we are a "first class" citizen and have added the OPA MTUs to 1365 * the core we can advertise the larger MTU enum to the ULPs, for now --- 166 unchanged lines hidden (view full) --- 1532 ibp->sl_to_sc[i] = i; 1533 ibp->sc_to_sl[i] = i; 1534 } 1535 1536 spin_lock_init(&ibp->rvp.lock); 1537 /* Set the prefix to the default value (see ch. 4.1.1) */ 1538 ibp->rvp.gid_prefix = IB_DEFAULT_GID_PREFIX; 1539 ibp->rvp.sm_lid = 0; | 1372 props->gid_tbl_len = HFI1_GUIDS_PER_PORT; 1373 props->active_width = (u8)opa_width_to_ib(ppd->link_width_active); 1374 /* see rate_show() in ib core/sysfs.c */ 1375 props->active_speed = (u8)opa_speed_to_ib(ppd->link_speed_active); 1376 props->max_vl_num = ppd->vls_supported; 1377 1378 /* Once we are a "first class" citizen and have added the OPA MTUs to 1379 * the core we can advertise the larger MTU enum to the ULPs, for now --- 166 unchanged lines hidden (view full) --- 1546 ibp->sl_to_sc[i] = i; 1547 ibp->sc_to_sl[i] = i; 1548 } 1549 1550 spin_lock_init(&ibp->rvp.lock); 1551 /* Set the prefix to the default value (see ch. 4.1.1) */ 1552 ibp->rvp.gid_prefix = IB_DEFAULT_GID_PREFIX; 1553 ibp->rvp.sm_lid = 0; |
1540 /* 1541 * Below should only set bits defined in OPA PortInfo.CapabilityMask 1542 * and PortInfo.CapabilityMask3 1543 */ | 1554 /* Below should only set bits defined in OPA PortInfo.CapabilityMask */ |
1544 ibp->rvp.port_cap_flags = IB_PORT_AUTO_MIGR_SUP | 1545 IB_PORT_CAP_MASK_NOTICE_SUP; | 1555 ibp->rvp.port_cap_flags = IB_PORT_AUTO_MIGR_SUP | 1556 IB_PORT_CAP_MASK_NOTICE_SUP; |
1546 ibp->rvp.port_cap3_flags = OPA_CAP_MASK3_IsSharedSpaceSupported; | |
1547 ibp->rvp.pma_counter_select[0] = IB_PMA_PORT_XMIT_DATA; 1548 ibp->rvp.pma_counter_select[1] = IB_PMA_PORT_RCV_DATA; 1549 ibp->rvp.pma_counter_select[2] = IB_PMA_PORT_XMIT_PKTS; 1550 ibp->rvp.pma_counter_select[3] = IB_PMA_PORT_RCV_PKTS; 1551 ibp->rvp.pma_counter_select[4] = IB_PMA_PORT_XMIT_WAIT; 1552 1553 RCU_INIT_POINTER(ibp->rvp.qp[0], NULL); 1554 RCU_INIT_POINTER(ibp->rvp.qp[1], NULL); --- 209 unchanged lines hidden (view full) --- 1764 strlcpy(ibdev->name + lcpysz, "_%d", IB_DEVICE_NAME_MAX - lcpysz); 1765 ibdev->owner = THIS_MODULE; 1766 ibdev->phys_port_cnt = dd->num_pports; 1767 ibdev->dev.parent = &dd->pcidev->dev; 1768 ibdev->modify_device = modify_device; 1769 ibdev->alloc_hw_stats = alloc_hw_stats; 1770 ibdev->get_hw_stats = get_hw_stats; 1771 ibdev->alloc_rdma_netdev = hfi1_vnic_alloc_rn; | 1557 ibp->rvp.pma_counter_select[0] = IB_PMA_PORT_XMIT_DATA; 1558 ibp->rvp.pma_counter_select[1] = IB_PMA_PORT_RCV_DATA; 1559 ibp->rvp.pma_counter_select[2] = IB_PMA_PORT_XMIT_PKTS; 1560 ibp->rvp.pma_counter_select[3] = IB_PMA_PORT_RCV_PKTS; 1561 ibp->rvp.pma_counter_select[4] = IB_PMA_PORT_XMIT_WAIT; 1562 1563 RCU_INIT_POINTER(ibp->rvp.qp[0], NULL); 1564 RCU_INIT_POINTER(ibp->rvp.qp[1], NULL); --- 209 unchanged lines hidden (view full) --- 1774 strlcpy(ibdev->name + lcpysz, "_%d", IB_DEVICE_NAME_MAX - lcpysz); 1775 ibdev->owner = THIS_MODULE; 1776 ibdev->phys_port_cnt = dd->num_pports; 1777 ibdev->dev.parent = &dd->pcidev->dev; 1778 ibdev->modify_device = modify_device; 1779 ibdev->alloc_hw_stats = alloc_hw_stats; 1780 ibdev->get_hw_stats = get_hw_stats; 1781 ibdev->alloc_rdma_netdev = hfi1_vnic_alloc_rn; |
1772 ibdev->free_rdma_netdev = hfi1_vnic_free_rn; | |
1773 1774 /* keep process mad in the driver */ 1775 ibdev->process_mad = hfi1_process_mad; 1776 ibdev->get_dev_fw_str = hfi1_get_dev_fw_str; 1777 1778 strncpy(ibdev->node_desc, init_utsname()->nodename, 1779 sizeof(ibdev->node_desc)); 1780 --- 154 unchanged lines hidden --- | 1782 1783 /* keep process mad in the driver */ 1784 ibdev->process_mad = hfi1_process_mad; 1785 ibdev->get_dev_fw_str = hfi1_get_dev_fw_str; 1786 1787 strncpy(ibdev->node_desc, init_utsname()->nodename, 1788 sizeof(ibdev->node_desc)); 1789 --- 154 unchanged lines hidden --- |