ipath - bug fixes, performance enhancements, and portability improvements
Subsystems (3)
PATCH 1/1 ipath - bug fixes, performance enhancements, and portability improvements
Hi, Andrew -
These patches bring the ipath driver up to date with a number of bug fixes, performance improvements, and better PowerPC support. There are a few whitespace and formatting patches in the series, but they're all self- contained. The patches have been tested internally, and shouldn't contain anything controversial.
My hope is that they'll sit in -mm for a little bit, and make it into an early 2.6.18 -rc kernel.
Thanks,
<b
PATCH 1/1 IB/ipath - Name zero counter offsets so it's clear they aren't counters
drivers/infiniband/hw/ipath/ipath_mad.c +40 -40
@@ -215,7 +215,7 @@ static int recv_subn_get_portinfo(struct/* P_KeyViolations are counted by hardware. */ pip->pkey_violations =cpu_to_be16 ((ipath_layer_get_cr_errpkey (dev->dd) - - dev->n_pkey_violations) &0xFFFF ); + dev->z_pkey_violations) &0xFFFF ); pip->qkey_violations =cpu_to_be16 (dev->qkey_violations);/* Only the hardware GUID is supported for now */ pip->guid_cap =1 ;
@@ -389,7 +389,7 @@ static int recv_subn_set_portinfo(struct* later. */ if (pip->pkey_violations ==0 ) - dev->n_pkey_violations = + dev->z_pkey_violations =ipath_layer_get_cr_errpkey (dev->dd);if (pip->qkey_violations ==0 )
@@ -844,18 +844,18 @@ static int recv_pma_get_portcounters(stripath_layer_get_counters (dev->dd, &cntrs);/* Adjust counters for any resets done. */ - cntrs.symbol_error_counter -= dev->n_symbol_error_counter; + cntrs.symbol_error_counter -= dev->z_symbol_error_counter; cntrs.link_error_recovery_counter -= - dev->n_link_error_recovery_counter; - cntrs.link_downed_counter -= dev->n_link_downed_counter; + dev->z_link_error_recovery_counter; + cntrs.link_downed_counter -= dev->z_link_downed_counter; cntrs.port_rcv_errors += dev->rcv_errors; - cntrs.port_rcv_errors -= dev->n_port_rcv_errors; - cntrs.port_rcv_remphys_errors -= dev->n_port_rcv_remphys_errors; - cntrs.port_xmit_discards -= dev->n_port_xmit_discards; - cntrs.port_xmit_data -= dev->n_port_xmit_data; - cntrs.port_rcv_data -= dev->n_port_rcv_data; - cntrs.port_xmit_packets -= dev->n_port_xmit_packets; - cntrs.port_rcv_packets -= dev->n_port_rcv_packets; + cntrs.port_rcv_errors -= dev->z_port_rcv_errors; + cntrs.port_rcv_remphys_errors -= dev->z_port_rcv_remphys_errors; + cntrs.port_xmit_discards -= dev->z_port_xmit_discards; + cntrs.port_xmit_data -= dev->z_port_xmit_data; + cntrs.port_rcv_data -= dev->z_port_rcv_data; + cntrs.port_xmit_packets -= dev->z_port_xmit_packets; + cntrs.port_rcv_packets -= dev->z_port_rcv_packets;memset (pmp->data,0 ,sizeof (pmp->data));
@@ -928,10 +928,10 @@ static int recv_pma_get_portcounters_ext &rpkts, &xwait);/* Adjust counters for any resets done. */ - swords -= dev->n_port_xmit_data; - rwords -= dev->n_port_rcv_data; - spkts -= dev->n_port_xmit_packets; - rpkts -= dev->n_port_rcv_packets; + swords -= dev->z_port_xmit_data; + rwords -= dev->z_port_rcv_data; + spkts -= dev->z_port_xmit_packets; + rpkts -= dev->z_port_rcv_packets;memset (pmp->data,0 ,sizeof (pmp->data));
@@ -967,37 +967,37 @@ static int recv_pma_set_portcounters(stripath_layer_get_counters (dev->dd, &cntrs);if (p->counter_select &IB_PMA_SEL_SYMBOL_ERROR ) - dev->n_symbol_error_counter = cntrs.symbol_error_counter; + dev->z_symbol_error_counter = cntrs.symbol_error_counter;if (p->counter_select &IB_PMA_SEL_LINK_ERROR_RECOVERY ) - dev->n_link_error_recovery_counter = + dev->z_link_error_recovery_counter = cntrs.link_error_recovery_counter;if (p->counter_select &IB_PMA_SEL_LINK_DOWNED ) - dev->n_link_downed_counter = cntrs.link_downed_counter; + dev->z_link_downed_counter = cntrs.link_downed_counter;if (p->counter_select &IB_PMA_SEL_PORT_RCV_ERRORS ) - dev->n_port_rcv_errors = + dev->z_port_rcv_errors = cntrs.port_rcv_errors + dev->rcv_errors;if (p->counter_select &IB_PMA_SEL_PORT_RCV_REMPHYS_ERRORS ) - dev->n_port_rcv_remphys_errors = + dev->z_port_rcv_remphys_errors = cntrs.port_rcv_remphys_errors;if (p->counter_select &IB_PMA_SEL_PORT_XMIT_DISCARDS ) - dev->n_port_xmit_discards = cntrs.port_xmit_discards; + dev->z_port_xmit_discards = cntrs.port_xmit_discards;if (p->counter_select &IB_PMA_SEL_PORT_XMIT_DATA ) - dev->n_port_xmit_data = cntrs.port_xmit_data; + dev->z_port_xmit_data = cntrs.port_xmit_data;if (p->counter_select &IB_PMA_SEL_PORT_RCV_DATA ) - dev->n_port_rcv_data = cntrs.port_rcv_data; + dev->z_port_rcv_data = cntrs.port_rcv_data;if (p->counter_select &IB_PMA_SEL_PORT_XMIT_PACKETS ) - dev->n_port_xmit_packets = cntrs.port_xmit_packets; + dev->z_port_xmit_packets = cntrs.port_xmit_packets;if (p->counter_select &IB_PMA_SEL_PORT_RCV_PACKETS ) - dev->n_port_rcv_packets = cntrs.port_rcv_packets; + dev->z_port_rcv_packets = cntrs.port_rcv_packets;return recv_pma_get_portcounters (pmp, ibdev, port); }
@@ -1014,16 +1014,16 @@ static int recv_pma_set_portcounters_ext &rpkts, &xwait);if (p->counter_select &IB_PMA_SELX_PORT_XMIT_DATA ) - dev->n_port_xmit_data = swords; + dev->z_port_xmit_data = swords;if (p->counter_select &IB_PMA_SELX_PORT_RCV_DATA ) - dev->n_port_rcv_data = rwords; + dev->z_port_rcv_data = rwords;if (p->counter_select &IB_PMA_SELX_PORT_XMIT_PACKETS ) - dev->n_port_xmit_packets = spkts; + dev->z_port_xmit_packets = spkts;if (p->counter_select &IB_PMA_SELX_PORT_RCV_PACKETS ) - dev->n_port_rcv_packets = rpkts; + dev->z_port_rcv_packets = rpkts;if (p->counter_select &IB_PMA_SELX_PORT_UNI_XMIT_PACKETS ) dev->n_unicast_xmit =0 ;
@@ -1285,18 +1285,18 @@ int ipath_process_mad(struct ib_device *ipath_layer_get_counters (to_idev (ibdev)->dd, &cntrs); dev->rcv_errors++; - dev->n_symbol_error_counter = cntrs.symbol_error_counter; - dev->n_link_error_recovery_counter = + dev->z_symbol_error_counter = cntrs.symbol_error_counter; + dev->z_link_error_recovery_counter = cntrs.link_error_recovery_counter; - dev->n_link_downed_counter = cntrs.link_downed_counter; - dev->n_port_rcv_errors = cntrs.port_rcv_errors +1 ; - dev->n_port_rcv_remphys_errors = + dev->z_link_downed_counter = cntrs.link_downed_counter; + dev->z_port_rcv_errors = cntrs.port_rcv_errors +1 ; + dev->z_port_rcv_remphys_errors = cntrs.port_rcv_remphys_errors; - dev->n_port_xmit_discards = cntrs.port_xmit_discards; - dev->n_port_xmit_data = cntrs.port_xmit_data; - dev->n_port_rcv_data = cntrs.port_rcv_data; - dev->n_port_xmit_packets = cntrs.port_xmit_packets; - dev->n_port_rcv_packets = cntrs.port_rcv_packets; + dev->z_port_xmit_discards = cntrs.port_xmit_discards; + dev->z_port_xmit_data = cntrs.port_xmit_data; + dev->z_port_rcv_data = cntrs.port_rcv_data; + dev->z_port_xmit_packets = cntrs.port_xmit_packets; + dev->z_port_rcv_packets = cntrs.port_rcv_packets; }switch (in_mad->mad_hdr.mgmt_class) {case IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE :
drivers/infiniband/hw/ipath/ipath_verbs.c +1 -1
@@ -646,7 +646,7 @@ static int ipath_query_port(struct ib_de props->max_msg_sz =4096 ; props->pkey_tbl_len =ipath_layer_get_npkeys (dev->dd); props->bad_pkey_cntr =ipath_layer_get_cr_errpkey (dev->dd) - - dev->n_pkey_violations; + dev->z_pkey_violations; props->qkey_viol_cntr = dev->qkey_violations; props->active_width =IB_WIDTH_4X ;/* See rate_show() */
drivers/infiniband/hw/ipath/ipath_verbs.h +11 -11
@@ -442,17 +442,17 @@ struct ipath_ibdev {u64 n_unicast_rcv;/* total unicast packets received */ u64 n_multicast_xmit;/* total multicast packets sent */ u64 n_multicast_rcv;/* total multicast packets received */ -u64 n_symbol_error_counter;/* starting count for PMA */ -u64 n_link_error_recovery_counter;/* starting count for PMA */ -u64 n_link_downed_counter;/* starting count for PMA */ -u64 n_port_rcv_errors;/* starting count for PMA */ -u64 n_port_rcv_remphys_errors;/* starting count for PMA */ -u64 n_port_xmit_discards;/* starting count for PMA */ -u64 n_port_xmit_data;/* starting count for PMA */ -u64 n_port_rcv_data;/* starting count for PMA */ -u64 n_port_xmit_packets;/* starting count for PMA */ -u64 n_port_rcv_packets;/* starting count for PMA */ -u32 n_pkey_violations;/* starting count for PMA */ +u64 z_symbol_error_counter;/* starting count for PMA */ +u64 z_link_error_recovery_counter;/* starting count for PMA */ +u64 z_link_downed_counter;/* starting count for PMA */ +u64 z_port_rcv_errors;/* starting count for PMA */ +u64 z_port_rcv_remphys_errors;/* starting count for PMA */ +u64 z_port_xmit_discards;/* starting count for PMA */ +u64 z_port_xmit_data;/* starting count for PMA */ +u64 z_port_rcv_data;/* starting count for PMA */ +u64 z_port_xmit_packets;/* starting count for PMA */ +u64 z_port_rcv_packets;/* starting count for PMA */ +u32 z_pkey_violations;/* starting count for PMA */ u32 n_rc_resends;u32 n_rc_acks;u32 n_rc_qacks;
PATCH 1/1 IB/ipath - update copyrights and other strings to reflect new company name
In reply to Bryan O'Sullivandrivers/infiniband/hw/ipath/Kconfig +4 -4
@@ -1,16 +1,16 @@ config IPATH_CORE config IPATH_CORE - tristate "PathScale InfiniPath Driver" + tristate "QLogic InfiniPath Driver" depends on 64BIT && PCI_MSI && NET ---help--- - This is a low-level driver for PathScale InfiniPath host channel + This is a low-level driver for QLogic InfiniPath host channel adapters (HCAs) based on the HT-400 and PE-800 chips. config INFINIBAND_IPATH - tristate "PathScale InfiniPath Verbs Driver" + tristate "QLogic InfiniPath Verbs Driver" depends on IPATH_CORE && INFINIBAND ---help--- This is a driver that provides InfiniBand verbs support for - PathScale InfiniPath host channel adapters (HCAs). This + QLogic InfiniPath host channel adapters (HCAs). This allows these devices to be used with both kernel upper level protocols such as IP-over-InfiniBand as well as with userspace applications (in conjunction with InfiniBand userspace access).
drivers/infiniband/hw/ipath/Makefile +1 -1
@@ -1,4 +1,4 @@ EXTRA_CFLAGS += -DIPATH_IDSTR='"PathScal -EXTRA_CFLAGS += -DIPATH_IDSTR='"PathScale kernel.org driver"' \ +EXTRA_CFLAGS += -DIPATH_IDSTR='"QLogic kernel.org driver"' \ -DIPATH_KERN_TYPE=0 obj-$(CONFIG_IPATH_CORE) += ipath_core.o
drivers/infiniband/hw/ipath/ipath_common.h +4 -3
@@ -1,4 +1,5 @@/* +* Copyright (c) 2006 QLogic, Inc. All rights reserved. * Copyright (c) 2003, 2004, 2005, 2006 PathScale, Inc. All rights reserved. * * This software is available to you under a choice of one of two
@@ -38,7 +39,7 @@* to communicate between kernel and user code. */ -/* This is the IEEE-assigned OUI for PathScale, Inc. */ +/* This is the IEEE-assigned OUI for QLogic, Inc. InfiniPath */ #define IPATH_SRC_OUI_1 0x00#define IPATH_SRC_OUI_2 0x11#define IPATH_SRC_OUI_3 0x75
@@ -342,9 +343,9 @@ struct ipath_base_info {/* * Similarly, this is the kernel version going back to the user. It's * slightly different, in that we want to tell if the driver was built as -* part of a PathScale release, or from the driver from OpenIB, kernel.org, +* part of a QLogic release, or from the driver from OpenIB, kernel.org, * or a standard distribution, for support reasons. The high bit is 0 for -* non-PathScale, and 1 for PathScale-built/supplied. +* non-QLogic, and 1 for QLogic-built/supplied. * * It's returned by the driver to the user code during initialization in the * spi_sw_version field of ipath_base_info, so the user code can in turn
drivers/infiniband/hw/ipath/ipath_cq.c +1 -0
@@ -1,4 +1,5 @@/* +* Copyright (c) 2006 QLogic, Inc. All rights reserved. * Copyright (c) 2005, 2006 PathScale, Inc. All rights reserved. * * This software is available to you under a choice of one of two
drivers/infiniband/hw/ipath/ipath_debug.h +1 -0
@@ -1,4 +1,5 @@/* +* Copyright (c) 2006 QLogic, Inc. All rights reserved. * Copyright (c) 2003, 2004, 2005, 2006 PathScale, Inc. All rights reserved. * * This software is available to you under a choice of one of two
drivers/infiniband/hw/ipath/ipath_diag.c +1 -0
@@ -1,4 +1,5 @@/* +* Copyright (c) 2006 QLogic, Inc. All rights reserved. * Copyright (c) 2003, 2004, 2005, 2006 PathScale, Inc. All rights reserved. * * This software is available to you under a choice of one of two
drivers/infiniband/hw/ipath/ipath_driver.c +5 -4
@@ -1,4 +1,5 @@/* +* Copyright (c) 2006 QLogic, Inc. All rights reserved. * Copyright (c) 2003, 2004, 2005, 2006 PathScale, Inc. All rights reserved. * * This software is available to you under a choice of one of two
@@ -52,7 +53,7 @@ const char *ipath_get_unit_name(int unitEXPORT_SYMBOL_GPL (ipath_get_unit_name); -#define DRIVER_LOAD_MSG "PathScale " IPATH_DRV_NAME " loaded: " +#define DRIVER_LOAD_MSG "QLogic " IPATH_DRV_NAME " loaded: "#define PFX IPATH_DRV_NAME ": "/*
@@ -74,8 +75,8 @@ EXPORT_SYMBOL_GPL(ipath_debug);EXPORT_SYMBOL_GPL (ipath_debug);MODULE_LICENSE ("GPL" ); -MODULE_AUTHOR ("PathScale <[email protected]>" ); -MODULE_DESCRIPTION ("Pathscale InfiniPath driver" ); +MODULE_AUTHOR ("QLogic <[email protected]>" ); +MODULE_DESCRIPTION ("QLogic InfiniPath driver" );const char *ipath_ibcstatus_str[] = {"Disabled" ,
@@ -452,7 +453,7 @@ static int __devinit ipath_init_one(struipath_init_pe800_funcs (dd);break ;default : -ipath_dev_err (dd,"Found unknown PathScale deviceid 0x%x, " +ipath_dev_err (dd,"Found unknown QLogic deviceid 0x%x, " "failing\n" , ent->device);return -ENODEV ; }
drivers/infiniband/hw/ipath/ipath_eeprom.c +1 -0
@@ -1,4 +1,5 @@/* +* Copyright (c) 2006 QLogic, Inc. All rights reserved. * Copyright (c) 2003, 2004, 2005, 2006 PathScale, Inc. All rights reserved. * * This software is available to you under a choice of one of two
drivers/infiniband/hw/ipath/ipath_file_ops.c +1 -0
@@ -1,4 +1,5 @@/* +* Copyright (c) 2006 QLogic, Inc. All rights reserved. * Copyright (c) 2003, 2004, 2005, 2006 PathScale, Inc. All rights reserved. * * This software is available to you under a choice of one of two
drivers/infiniband/hw/ipath/ipath_fs.c +1 -0
@@ -1,4 +1,5 @@/* +* Copyright (c) 2006 QLogic, Inc. All rights reserved. * Copyright (c) 2006 PathScale, Inc. All rights reserved. * * This software is available to you under a choice of one of two
drivers/infiniband/hw/ipath/ipath_ht400.c +1 -0
@@ -1,4 +1,5 @@/* +* Copyright (c) 2006 QLogic, Inc. All rights reserved. * Copyright (c) 2003, 2004, 2005, 2006 PathScale, Inc. All rights reserved. * * This software is available to you under a choice of one of two
drivers/infiniband/hw/ipath/ipath_init_chip.c +1 -0
@@ -1,4 +1,5 @@/* +* Copyright (c) 2006 QLogic, Inc. All rights reserved. * Copyright (c) 2003, 2004, 2005, 2006 PathScale, Inc. All rights reserved. * * This software is available to you under a choice of one of two
drivers/infiniband/hw/ipath/ipath_intr.c +1 -0
@@ -1,4 +1,5 @@/* +* Copyright (c) 2006 QLogic, Inc. All rights reserved. * Copyright (c) 2003, 2004, 2005, 2006 PathScale, Inc. All rights reserved. * * This software is available to you under a choice of one of two
drivers/infiniband/hw/ipath/ipath_kernel.h +1 -0
@@ -1,6 +1,7 @@#ifndef _IPATH_KERNEL_H#define _IPATH_KERNEL_H/* +* Copyright (c) 2006 QLogic, Inc. All rights reserved. * Copyright (c) 2003, 2004, 2005, 2006 PathScale, Inc. All rights reserved. * * This software is available to you under a choice of one of two
drivers/infiniband/hw/ipath/ipath_keys.c +1 -0
@@ -1,4 +1,5 @@/* +* Copyright (c) 2006 QLogic, Inc. All rights reserved. * Copyright (c) 2005, 2006 PathScale, Inc. All rights reserved. * * This software is available to you under a choice of one of two
drivers/infiniband/hw/ipath/ipath_layer.c +1 -0
@@ -1,4 +1,5 @@/* +* Copyright (c) 2006 QLogic, Inc. All rights reserved. * Copyright (c) 2003, 2004, 2005, 2006 PathScale, Inc. All rights reserved. * * This software is available to you under a choice of one of two
drivers/infiniband/hw/ipath/ipath_layer.h +1 -0
@@ -1,4 +1,5 @@/* +* Copyright (c) 2006 QLogic, Inc. All rights reserved. * Copyright (c) 2003, 2004, 2005, 2006 PathScale, Inc. All rights reserved. * * This software is available to you under a choice of one of two
drivers/infiniband/hw/ipath/ipath_mad.c +1 -0
@@ -1,4 +1,5 @@/* +* Copyright (c) 2006 QLogic, Inc. All rights reserved. * Copyright (c) 2005, 2006 PathScale, Inc. All rights reserved. * * This software is available to you under a choice of one of two
drivers/infiniband/hw/ipath/ipath_mr.c +1 -0
@@ -1,4 +1,5 @@/* +* Copyright (c) 2006 QLogic, Inc. All rights reserved. * Copyright (c) 2005, 2006 PathScale, Inc. All rights reserved. * * This software is available to you under a choice of one of two
drivers/infiniband/hw/ipath/ipath_pe800.c +2 -1
@@ -1,4 +1,5 @@/* +* Copyright (c) 2006 QLogic, Inc. All rights reserved. * Copyright (c) 2003, 2004, 2005, 2006 PathScale, Inc. All rights reserved. * * This software is available to you under a choice of one of two
@@ -44,7 +45,7 @@/* * This file contains all the chip-specific register information and -* access functions for the PathScale PE800, the PCI-Express chip. +* access functions for the QLogic InfiniPath PE800, the PCI-Express chip. * * This lists the InfiniPath PE800 registers, in the actual chip layout. * This structure should never be directly accessed.
drivers/infiniband/hw/ipath/ipath_qp.c +1 -0
@@ -1,4 +1,5 @@/* +* Copyright (c) 2006 QLogic, Inc. All rights reserved. * Copyright (c) 2005, 2006 PathScale, Inc. All rights reserved. * * This software is available to you under a choice of one of two
drivers/infiniband/hw/ipath/ipath_rc.c +1 -0
@@ -1,4 +1,5 @@/* +* Copyright (c) 2006 QLogic, Inc. All rights reserved. * Copyright (c) 2005, 2006 PathScale, Inc. All rights reserved. * * This software is available to you under a choice of one of two
drivers/infiniband/hw/ipath/ipath_registers.h +1 -0
@@ -1,4 +1,5 @@/* +* Copyright (c) 2006 QLogic, Inc. All rights reserved. * Copyright (c) 2003, 2004, 2005, 2006 PathScale, Inc. All rights reserved. * * This software is available to you under a choice of one of two
drivers/infiniband/hw/ipath/ipath_ruc.c +1 -0
@@ -1,4 +1,5 @@/* +* Copyright (c) 2006 QLogic, Inc. All rights reserved. * Copyright (c) 2005, 2006 PathScale, Inc. All rights reserved. * * This software is available to you under a choice of one of two
drivers/infiniband/hw/ipath/ipath_srq.c +1 -0
@@ -1,4 +1,5 @@/* +* Copyright (c) 2006 QLogic, Inc. All rights reserved. * Copyright (c) 2005, 2006 PathScale, Inc. All rights reserved. * * This software is available to you under a choice of one of two
drivers/infiniband/hw/ipath/ipath_stats.c +1 -0
@@ -1,4 +1,5 @@/* +* Copyright (c) 2006 QLogic, Inc. All rights reserved. * Copyright (c) 2003, 2004, 2005, 2006 PathScale, Inc. All rights reserved. * * This software is available to you under a choice of one of two
drivers/infiniband/hw/ipath/ipath_sysfs.c +1 -0
@@ -1,4 +1,5 @@/* +* Copyright (c) 2006 QLogic, Inc. All rights reserved. * Copyright (c) 2006 PathScale, Inc. All rights reserved. * * This software is available to you under a choice of one of two
drivers/infiniband/hw/ipath/ipath_uc.c +1 -0
@@ -1,4 +1,5 @@/* +* Copyright (c) 2006 QLogic, Inc. All rights reserved. * Copyright (c) 2005, 2006 PathScale, Inc. All rights reserved. * * This software is available to you under a choice of one of two
drivers/infiniband/hw/ipath/ipath_ud.c +1 -0
@@ -1,4 +1,5 @@/* +* Copyright (c) 2006 QLogic, Inc. All rights reserved. * Copyright (c) 2005, 2006 PathScale, Inc. All rights reserved. * * This software is available to you under a choice of one of two
drivers/infiniband/hw/ipath/ipath_user_pages.c +1 -0
@@ -1,4 +1,5 @@/* +* Copyright (c) 2006 QLogic, Inc. All rights reserved. * Copyright (c) 2003, 2004, 2005, 2006 PathScale, Inc. All rights reserved. * * This software is available to you under a choice of one of two
drivers/infiniband/hw/ipath/ipath_verbs.c +3 -2
@@ -1,4 +1,5 @@/* +* Copyright (c) 2006 QLogic, Inc. All rights reserved. * Copyright (c) 2005, 2006 PathScale, Inc. All rights reserved. * * This software is available to you under a choice of one of two
@@ -56,8 +57,8 @@ MODULE_PARM_DESC(debug, "Verbs debug masMODULE_PARM_DESC (debug,"Verbs debug mask" );MODULE_LICENSE ("GPL" ); -MODULE_AUTHOR ("PathScale <[email protected]>" ); -MODULE_DESCRIPTION ("Pathscale InfiniPath driver" ); +MODULE_AUTHOR ("QLogic <[email protected]>" ); +MODULE_DESCRIPTION ("QLogic InfiniPath driver" );const int ib_ipath_state_ops[IB_QPS_ERR +1 ] = { [IB_QPS_RESET ] =0 ,
drivers/infiniband/hw/ipath/ipath_verbs.h +1 -0
@@ -1,4 +1,5 @@/* +* Copyright (c) 2006 QLogic, Inc. All rights reserved. * Copyright (c) 2005, 2006 PathScale, Inc. All rights reserved. * * This software is available to you under a choice of one of two
drivers/infiniband/hw/ipath/ipath_verbs_mcast.c +1 -0
@@ -1,4 +1,5 @@/* +* Copyright (c) 2006 QLogic, Inc. All rights reserved. * Copyright (c) 2005, 2006 PathScale, Inc. All rights reserved. * * This software is available to you under a choice of one of two
drivers/infiniband/hw/ipath/ipath_wc_x86_64.c +1 -0
@@ -1,4 +1,5 @@/* +* Copyright (c) 2006 QLogic, Inc. All rights reserved. * Copyright (c) 2003, 2004, 2005, 2006 PathScale, Inc. All rights reserved. * * This software is available to you under a choice of one of two
drivers/infiniband/hw/ipath/ips_common.h +1 -0
@@ -1,6 +1,7 @@#ifndef IPS_COMMON_H #define IPS_COMMON_H /* +* Copyright (c) 2006 QLogic, Inc. All rights reserved. * Copyright (c) 2003, 2004, 2005, 2006 PathScale, Inc. All rights reserved. * * This software is available to you under a choice of one of two
drivers/infiniband/hw/ipath/verbs_debug.h +1 -0
@@ -1,4 +1,5 @@/* +* Copyright (c) 2006 QLogic, Inc. All rights reserved. * Copyright (c) 2003, 2004, 2005, 2006 PathScale, Inc. All rights reserved. * * This software is available to you under a choice of one of two
PATCH 1/1 IB/ipath - Share more common code between RC and UC protocols
In reply to Bryan O'Sullivandrivers/infiniband/hw/ipath/ipath_qp.c +3 -5
@@ -709,9 +709,7 @@ struct ib_qp *ipath_create_qp(struct ib_spin_lock_init (&qp->r_rq.lock);atomic_set (&qp->refcount,0 );init_waitqueue_head (&qp->wait); -tasklet_init (&qp->s_task, - init_attr->qp_type ==IB_QPT_RC ? - ipath_do_rc_send : ipath_do_uc_send, +tasklet_init (&qp->s_task, ipath_do_ruc_send, (unsigned long )qp);INIT_LIST_HEAD (&qp->piowait);INIT_LIST_HEAD (&qp->timerwait);
@@ -896,9 +894,9 @@ void ipath_get_credit(struct ipath_qp *q* as many packets as we like. Otherwise, we have to * honor the credit field. */ -if (credit ==IPS_AETH_CREDIT_INVAL ) { +if (credit ==IPS_AETH_CREDIT_INVAL ) qp->s_lsn = (u32) -1 ; - }else if (qp->s_lsn != (u32) -1 ) { +else if (qp->s_lsn != (u32) -1 ) {/* Compute new LSN (i.e., MSN + credit) */ credit = (aeth + credit_table[credit]) &IPS_MSN_MASK ;if (ipath_cmp24 (credit, qp->s_lsn) >0 )
drivers/infiniband/hw/ipath/ipath_rc.c +32 -172
290 lines not on this page · raw message
drivers/infiniband/hw/ipath/ipath_ruc.c +191 -54
333 lines not on this page · raw message
drivers/infiniband/hw/ipath/ipath_uc.c +32 -127
212 lines not on this page · raw message
drivers/infiniband/hw/ipath/ipath_verbs.c +1 -1
@@ -194,7 +194,7 @@ static int ipath_post_send(struct ib_qpswitch (qp->ibqp.qp_type) {case IB_QPT_UC :case IB_QPT_RC : - err =ipath_post_rc_send (qp, wr); + err =ipath_post_ruc_send (qp, wr);break ;case IB_QPT_SMI :
drivers/infiniband/hw/ipath/ipath_verbs.h +14 -6
@@ -581,10 +581,6 @@ void ipath_sqerror_qp(struct ipath_qp *qvoid ipath_get_credit (struct ipath_qp *qp,u32 aeth); -void ipath_do_rc_send (unsigned long data); - -void ipath_do_uc_send (unsigned long data); -void ipath_cq_enter (struct ipath_cq *cq,struct ib_wc *entry,int sig); int ipath_rkey_ok(struct ipath_ibdev *dev, struct ipath_sge_state *ss,
@@ -597,7 +593,7 @@ void ipath_copy_sge(struct ipath_sge_stavoid ipath_skip_sge (struct ipath_sge_state *ss,u32 length); -int ipath_post_rc_send (struct ipath_qp *qp,struct ib_send_wr *wr); +int ipath_post_ruc_send (struct ipath_qp *qp,struct ib_send_wr *wr);void ipath_uc_rcv (struct ipath_ibdev *dev,struct ipath_ib_header *hdr,int has_grh,void *data,u32 tlen,struct ipath_qp *qp);
@@ -679,7 +675,19 @@ void ipath_insert_rnr_queue(struct ipathint ipath_get_rwqe (struct ipath_qp *qp,int wr_id_only); -void ipath_ruc_loopback (struct ipath_qp *sqp,struct ib_wc *wc); +u32 ipath_make_grh (struct ipath_ibdev *dev,struct ib_grh *hdr, +struct ib_global_route *grh,u32 hwords,u32 nwords); + +void ipath_do_ruc_send (unsigned long data); + +u32 ipath_make_rc_ack (struct ipath_qp *qp,struct ipath_other_headers *ohdr, +u32 pmtu); + +int ipath_make_rc_req (struct ipath_qp *qp,struct ipath_other_headers *ohdr, +u32 pmtu,u32 *bth0p,u32 *bth2p); + +int ipath_make_uc_req (struct ipath_qp *qp,struct ipath_other_headers *ohdr, +u32 pmtu,u32 *bth0p,u32 *bth2p);extern const enum ib_wc_opcode ib_ipath_wc_opcode[];
PATCH 1/1 IB/ipath - fix an indenting problem
In reply to Bryan O'Sullivandrivers/infiniband/hw/ipath/ipath_rc.c +26 -26
@@ -1053,32 +1053,32 @@ static inline void ipath_rc_rcv_resp(str goto ack_done; } rdma_read: -if (unlikely (qp->s_state !=OP (RDMA_READ_REQUEST ))) - goto ack_done; -if (unlikely (tlen != (hdrsize + pmtu +4 ))) - goto ack_done; -if (unlikely (pmtu >= qp->s_len)) - goto ack_done; -/* We got a response so update the timeout. */ -if (unlikely (qp->s_last == qp->s_tail || -get_swqe_ptr (qp, qp->s_last)->wr.opcode != -IB_WR_RDMA_READ )) - goto ack_done; -spin_lock (&dev->pending_lock); -if (qp->s_rnr_timeout ==0 && !list_empty (&qp->timerwait)) -list_move_tail (&qp->timerwait, - &dev->pending[dev->pending_index]); -spin_unlock (&dev->pending_lock); -/* -* Update the RDMA receive state but do the copy w/o holding the -* locks and blocking interrupts. XXX Yet another place that -* affects relaxed RDMA order since we don't want s_sge modified. -*/ - qp->s_len -= pmtu; - qp->s_last_psn = psn; -spin_unlock_irqrestore (&qp->s_lock, flags); -ipath_copy_sge (&qp->s_sge, data, pmtu); - goto bail; +if (unlikely (qp->s_state !=OP (RDMA_READ_REQUEST ))) + goto ack_done; +if (unlikely (tlen != (hdrsize + pmtu +4 ))) + goto ack_done; +if (unlikely (pmtu >= qp->s_len)) + goto ack_done; +/* We got a response so update the timeout. */ +if (unlikely (qp->s_last == qp->s_tail || +get_swqe_ptr (qp, qp->s_last)->wr.opcode != +IB_WR_RDMA_READ )) + goto ack_done; +spin_lock (&dev->pending_lock); +if (qp->s_rnr_timeout ==0 && !list_empty (&qp->timerwait)) +list_move_tail (&qp->timerwait, + &dev->pending[dev->pending_index]); +spin_unlock (&dev->pending_lock); +/* +* Update the RDMA receive state but do the copy w/o holding the +* locks and blocking interrupts. XXX Yet another place that +* affects relaxed RDMA order since we don't want s_sge modified. +*/ + qp->s_len -= pmtu; + qp->s_last_psn = psn; +spin_unlock_irqrestore (&qp->s_lock, flags); +ipath_copy_sge (&qp->s_sge, data, pmtu); + goto bail;case OP (RDMA_READ_RESPONSE_LAST ):/* ACKs READ req. */
PATCH 1/1 IB/ipath - fix shared receive queues for RC
In reply to Bryan O'Sullivandrivers/infiniband/hw/ipath/ipath_rc.c +101 -142
@@ -257,7 +257,7 @@ int ipath_make_rc_req(struct ipath_qp *qbreak ;case IB_WR_RDMA_WRITE : -if (newreq) +if (newreq && qp->s_lsn != (u32) -1 ) qp->s_lsn++;/* FALLTHROUGH */ case IB_WR_RDMA_WRITE_WITH_IMM :
@@ -283,8 +283,7 @@ int ipath_make_rc_req(struct ipath_qp *qelse { qp->s_state =OP (RDMA_WRITE_ONLY_WITH_IMMEDIATE ); -/* Immediate data comes -* after RETH */ +/* Immediate data comes after RETH */ ohdr->u.rc.imm_data = wqe->wr.imm_data; hwords +=1 ;if (wqe->wr.send_flags &IB_SEND_SOLICITED )
@@ -304,7 +303,8 @@ int ipath_make_rc_req(struct ipath_qp *q qp->s_state =OP (RDMA_READ_REQUEST ); hwords +=sizeof (ohdr->u.rc.reth) /4 ;if (newreq) { - qp->s_lsn++; +if (qp->s_lsn != (u32) -1 ) + qp->s_lsn++;/* * Adjust s_next_psn to count the * expected number of responses.
@@ -335,7 +335,8 @@ int ipath_make_rc_req(struct ipath_qp *q wqe->wr.wr.atomic.compare_add); hwords +=sizeof (struct ib_atomic_eth ) /4 ;if (newreq) { - qp->s_lsn++; +if (qp->s_lsn != (u32) -1 ) + qp->s_lsn++; wqe->lpsn = wqe->psn; }if (++qp->s_cur == qp->s_size)
@@ -553,6 +554,88 @@ static void send_rc_ack(struct ipath_qp }/** +* reset_psn - reset the QP state to send starting from PSN +* @qp: the QP +* @psn: the packet sequence number to restart at +* +* This is called from ipath_rc_rcv() to process an incoming RC ACK +* for the given QP. +* Called at interrupt level with the QP s_lock held. +*/ +static void reset_psn (struct ipath_qp *qp,u32 psn) +{ +u32 n = qp->s_last; +struct ipath_swqe *wqe =get_swqe_ptr (qp, n); +u32 opcode; + + qp->s_cur = n; + +/* +* If we are starting the request from the beginning, +* let the normal send code handle initialization. +*/ +if (ipath_cmp24 (psn, wqe->psn) <=0 ) { + qp->s_state =OP (SEND_LAST ); + goto done; + } + +/* Find the work request opcode corresponding to the given PSN. */ + opcode = wqe->wr.opcode; +for (;;) { +int diff; + +if (++n == qp->s_size) + n =0 ; +if (n == qp->s_tail) +break ; + wqe =get_swqe_ptr (qp, n); + diff =ipath_cmp24 (psn, wqe->psn); +if (diff <0 ) +break ; + qp->s_cur = n; +/* +* If we are starting the request from the beginning, +* let the normal send code handle initialization. +*/ +if (diff ==0 ) { + qp->s_state =OP (SEND_LAST ); + goto done; + } + opcode = wqe->wr.opcode; + } + +/* +* Set the state to restart in the middle of a request. +* Don't change the s_sge, s_cur_sge, or s_cur_size. +* See ipath_do_rc_send(). +*/ +switch (opcode) { +case IB_WR_SEND : +case IB_WR_SEND_WITH_IMM : + qp->s_state =OP (RDMA_READ_RESPONSE_FIRST ); +break ; + +case IB_WR_RDMA_WRITE : +case IB_WR_RDMA_WRITE_WITH_IMM : + qp->s_state =OP (RDMA_READ_RESPONSE_LAST ); +break ; + +case IB_WR_RDMA_READ : + qp->s_state =OP (RDMA_READ_RESPONSE_MIDDLE ); +break ; + +default : +/* +* This case shouldn't happen since its only +* one PSN per req. +*/ + qp->s_state =OP (SEND_LAST ); + } +done: + qp->s_psn = psn; +} + +/** * ipath_restart_rc - back up requester to resend the last un-ACKed request * @qp: the QP to restart * @psn: packet sequence number for the request
@@ -564,7 +647,6 @@ void ipath_restart_rc(struct ipath_qp *q {struct ipath_swqe *wqe =get_swqe_ptr (qp, qp->s_last);struct ipath_ibdev *dev; -u32 n;/* * If there are no requests pending, we are done.
@@ -606,130 +688,13 @@ void ipath_restart_rc(struct ipath_qp *qelse dev->n_rc_resends += (int )qp->s_psn - (int )psn; -/* -* If we are starting the request from the beginning, let the normal -* send code handle initialization. -*/ - qp->s_cur = qp->s_last; -if (ipath_cmp24 (psn, wqe->psn) <=0 ) { - qp->s_state =OP (SEND_LAST ); - qp->s_psn = wqe->psn; - }else { - n = qp->s_cur; -for (;;) { -if (++n == qp->s_size) - n =0 ; -if (n == qp->s_tail) { -if (ipath_cmp24 (psn, qp->s_next_psn) >=0 ) { - qp->s_cur = n; - wqe =get_swqe_ptr (qp, n); - } -break ; - } - wqe =get_swqe_ptr (qp, n); -if (ipath_cmp24 (psn, wqe->psn) <0 ) -break ; - qp->s_cur = n; - } - qp->s_psn = psn; - -/* -* Reset the state to restart in the middle of a request. -* Don't change the s_sge, s_cur_sge, or s_cur_size. -* See ipath_do_rc_send(). -*/ -switch (wqe->wr.opcode) { -case IB_WR_SEND : -case IB_WR_SEND_WITH_IMM : - qp->s_state =OP (RDMA_READ_RESPONSE_FIRST ); -break ; - -case IB_WR_RDMA_WRITE : -case IB_WR_RDMA_WRITE_WITH_IMM : - qp->s_state =OP (RDMA_READ_RESPONSE_LAST ); -break ; - -case IB_WR_RDMA_READ : - qp->s_state = -OP (RDMA_READ_RESPONSE_MIDDLE ); -break ; - -default : -/* -* This case shouldn't happen since its only -* one PSN per req. -*/ - qp->s_state =OP (SEND_LAST ); - } - } +reset_psn (qp, psn); done:tasklet_hi_schedule (&qp->s_task); bail:return ; -} - -/** -* reset_psn - reset the QP state to send starting from PSN -* @qp: the QP -* @psn: the packet sequence number to restart at -* -* This is called from ipath_rc_rcv_resp() to process an incoming RC ACK -* for the given QP. -* Called at interrupt level with the QP s_lock held. -*/ -static void reset_psn (struct ipath_qp *qp,u32 psn) -{ -struct ipath_swqe *wqe; -u32 n; - - n = qp->s_cur; - wqe =get_swqe_ptr (qp, n); -for (;;) { -if (++n == qp->s_size) - n =0 ; -if (n == qp->s_tail) { -if (ipath_cmp24 (psn, qp->s_next_psn) >=0 ) { - qp->s_cur = n; - wqe =get_swqe_ptr (qp, n); - } -break ; - } - wqe =get_swqe_ptr (qp, n); -if (ipath_cmp24 (psn, wqe->psn) <0 ) -break ; - qp->s_cur = n; - } - qp->s_psn = psn; - -/* -* Set the state to restart in the middle of a -* request. Don't change the s_sge, s_cur_sge, or -* s_cur_size. See ipath_do_rc_send(). -*/ -switch (wqe->wr.opcode) { -case IB_WR_SEND : -case IB_WR_SEND_WITH_IMM : - qp->s_state =OP (RDMA_READ_RESPONSE_FIRST ); -break ; - -case IB_WR_RDMA_WRITE : -case IB_WR_RDMA_WRITE_WITH_IMM : - qp->s_state =OP (RDMA_READ_RESPONSE_LAST ); -break ; - -case IB_WR_RDMA_READ : - qp->s_state =OP (RDMA_READ_RESPONSE_MIDDLE ); -break ; - -default : -/* -* This case shouldn't happen since its only -* one PSN per req. -*/ - qp->s_state =OP (SEND_LAST ); - } }/**
@@ -738,7 +703,7 @@ static void reset_psn(struct ipath_qp *q* @psn: the packet sequence number of the ACK * @opcode: the opcode of the request that resulted in the ACK * -* This is called from ipath_rc_rcv() to process an incoming RC ACK +* This is called from ipath_rc_rcv_resp() to process an incoming RC ACK * for the given QP. * Called at interrupt level with the QP s_lock held. * Returns 1 if OK, 0 if current operation should be aborted (NAK).
@@ -877,22 +842,12 @@ static int do_rc_ack(struct ipath_qp *qpif (qp->s_last == qp->s_tail) goto bail; -/* The last valid PSN seen is the previous request's. */ - qp->s_last_psn = wqe->psn -1 ; +/* The last valid PSN is the previous PSN. */ + qp->s_last_psn = psn -1 ; dev->n_rc_resends += (int )qp->s_psn - (int )psn; -/* -* If we are starting the request from the beginning, let -* the normal send code handle initialization. -*/ - qp->s_cur = qp->s_last; - wqe =get_swqe_ptr (qp, qp->s_cur); -if (ipath_cmp24 (psn, wqe->psn) <=0 ) { - qp->s_state =OP (SEND_LAST ); - qp->s_psn = wqe->psn; - }else -reset_psn (qp, psn); +reset_psn (qp, psn); qp->s_rnr_timeout = ib_ipath_rnr_table[(aeth >> IPS_AETH_CREDIT_SHIFT) &
@@ -1070,9 +1025,10 @@ static inline void ipath_rc_rcv_resp(str &dev->pending[dev->pending_index]);spin_unlock (&dev->pending_lock);/* -* Update the RDMA receive state but do the copy w/o holding the -* locks and blocking interrupts. XXX Yet another place that -* affects relaxed RDMA order since we don't want s_sge modified. +* Update the RDMA receive state but do the copy w/o +* holding the locks and blocking interrupts. +* XXX Yet another place that affects relaxed RDMA order +* since we don't want s_sge modified. */ qp->s_len -= pmtu; qp->s_last_psn = psn;
@@ -1119,9 +1075,12 @@ static inline void ipath_rc_rcv_resp(strif (do_rc_ack (qp, aeth, psn,OP (RDMA_READ_RESPONSE_LAST ))) {/* * Change the state so we contimue -* processing new requests. +* processing new requests and wake up the +* tasklet if there are posted sends. */ qp->s_state =OP (SEND_LAST ); +if (qp->s_tail != qp->s_head) +tasklet_hi_schedule (&qp->s_task); } goto ack_done; }
PATCH 1/1 IB/ipath - update some comments and fix typos
In reply to Bryan O'Sullivandrivers/infiniband/hw/ipath/ipath_kernel.h +2 -7
@@ -723,13 +723,8 @@ u64 ipath_read_kreg64_port(const struct* @port: port number * * Return the contents of a register that is virtualized to be per port. -* Prints a debug message and returns -1 on errors (not distinguishable from -* valid contents at runtime; we may add a separate error variable at some -* point). -* -* This is normally not used by the kernel, but may be for debugging, and -* has a different implementation than user mode, which is why it's not in -* _common.h. +* Returns -1 on errors (not distinguishable from valid contents at +* runtime; we may add a separate error variable at some point). */ static inline u32 ipath_read_ureg32 (const struct ipath_devdata *dd,ipath_ureg regno,int port)
drivers/infiniband/hw/ipath/ipath_layer.c +1 -1
@@ -885,7 +885,7 @@ static void copy_io(u32 __iomem *piobuf,/** * ipath_verbs_send - send a packet from the verbs layer * @dd: the infinipath device -* @hdrwords: the number of works in the header +* @hdrwords: the number of words in the header * @hdr: the packet header * @len: the length of the packet in bytes * @ss: the SGE to send
PATCH 1/1 IB/ipath - don't allow resources to be created with illegal values
In reply to Bryan O'Sullivandrivers/infiniband/hw/ipath/ipath_mr.c +5 -0
@@ -169,6 +169,11 @@ struct ib_mr *ipath_reg_user_mr(struct istruct ib_umem_chunk *chunk;int n, m, i;struct ib_mr *ret; + +if (region->length ==0 ) { + ret =ERR_PTR (-EINVAL ); + goto bail; + } n =0 ;list_for_each_entry (chunk, ®ion->chunk_list, list)
drivers/infiniband/hw/ipath/ipath_qp.c +8 -0
@@ -667,6 +667,14 @@ struct ib_qp *ipath_create_qp(struct ib_ goto bail; } +if (init_attr->cap.max_send_sge + + init_attr->cap.max_recv_sge + + init_attr->cap.max_send_wr + + init_attr->cap.max_recv_wr ==0 ) { + ret =ERR_PTR (-EINVAL ); + goto bail; + } +switch (init_attr->qp_type) {case IB_QPT_UC :case IB_QPT_RC :
drivers/infiniband/hw/ipath/ipath_verbs.c +11 -0
@@ -788,6 +788,17 @@ static struct ib_ah *ipath_create_ah(strif (ah_attr->dlid >=IPS_MULTICAST_LID_BASE && ah_attr->dlid !=IPS_PERMISSIVE_LID && !(ah_attr->ah_flags &IB_AH_GRH )) { + ret =ERR_PTR (-EINVAL ); + goto bail; + } + +if (ah_attr->dlid ==0 ) { + ret =ERR_PTR (-EINVAL ); + goto bail; + } + +if (ah_attr->port_num !=1 || + ah_attr->port_num > pd->device->phys_port_cnt) { ret =ERR_PTR (-EINVAL ); goto bail; }
PATCH 1/1 IB/ipath - fix some memory leaks on failure paths
In reply to Bryan O'Sullivandrivers/infiniband/hw/ipath/ipath_init_chip.c +1 -0
@@ -115,6 +115,7 @@ static int create_port0_egr(struct ipath "eager TID %u\n", e);while (e !=0 )dev_kfree_skb (skbs[--e]); +vfree (skbs); ret = -ENOMEM ; goto bail; }
drivers/infiniband/hw/ipath/ipath_qp.c +2 -0
@@ -692,6 +692,7 @@ struct ib_qp *ipath_create_qp(struct ib_case IB_QPT_GSI : qp =kmalloc (sizeof (*qp),GFP_KERNEL );if (!qp) { +vfree (swq); ret =ERR_PTR (-ENOMEM ); goto bail; }
@@ -702,6 +703,7 @@ struct ib_qp *ipath_create_qp(struct ib_ qp->r_rq.wq =vmalloc (qp->r_rq.size * sz);if (!qp->r_rq.wq) {kfree (qp); +vfree (swq); ret =ERR_PTR (-ENOMEM ); goto bail; }
PATCH 1/1 IB/ipath - return an error for unknown multicast GID
In reply to Bryan O'Sullivandrivers/infiniband/hw/ipath/ipath_verbs_mcast.c +1 -1
@@ -273,7 +273,7 @@ int ipath_multicast_detach(struct ib_qpwhile (1 ) {if (n ==NULL ) {spin_unlock_irqrestore (&mcast_lock, flags); - ret =0 ; + ret = -EINVAL ; goto bail; }
PATCH 1/1 IB/ipath - report correct device identification information in /sys
In reply to Bryan O'Sullivandrivers/infiniband/hw/ipath/ipath_layer.c +27 -12
@@ -341,18 +341,26 @@ u32 ipath_layer_get_nguid(struct ipath_dEXPORT_SYMBOL_GPL (ipath_layer_get_nguid); -int ipath_layer_query_device (struct ipath_devdata *dd,u32 * vendor, -u32 * boardrev,u32 * majrev,u32 * minrev) -{ - *vendor = dd->ipath_vendorid; - *boardrev = dd->ipath_boardrev; - *majrev = dd->ipath_majrev; - *minrev = dd->ipath_minrev; - -return 0 ; -} - -EXPORT_SYMBOL_GPL (ipath_layer_query_device); +u32 ipath_layer_get_majrev (struct ipath_devdata *dd) +{ +return dd->ipath_majrev; +} + +EXPORT_SYMBOL_GPL (ipath_layer_get_majrev); + +u32 ipath_layer_get_minrev (struct ipath_devdata *dd) +{ +return dd->ipath_minrev; +} + +EXPORT_SYMBOL_GPL (ipath_layer_get_minrev); + +u32 ipath_layer_get_pcirev (struct ipath_devdata *dd) +{ +return dd->ipath_pcirev; +} + +EXPORT_SYMBOL_GPL (ipath_layer_get_pcirev);u32 ipath_layer_get_flags (struct ipath_devdata *dd) {
@@ -374,6 +382,13 @@ u16 ipath_layer_get_deviceid(struct ipat }EXPORT_SYMBOL_GPL (ipath_layer_get_deviceid); + +u32 ipath_layer_get_vendorid (struct ipath_devdata *dd) +{ +return dd->ipath_vendorid; +} + +EXPORT_SYMBOL_GPL (ipath_layer_get_vendorid);u64 ipath_layer_get_lastibcstat (struct ipath_devdata *dd) {
drivers/infiniband/hw/ipath/ipath_layer.h +4 -2
@@ -144,11 +144,13 @@ int ipath_layer_set_guid(struct ipath_deint ipath_layer_set_guid (struct ipath_devdata *,__be64 guid);__be64 ipath_layer_get_guid (struct ipath_devdata *);u32 ipath_layer_get_nguid (struct ipath_devdata *); -int ipath_layer_query_device (struct ipath_devdata *,u32 * vendor, -u32 * boardrev,u32 * majrev,u32 * minrev); +u32 ipath_layer_get_majrev (struct ipath_devdata *); +u32 ipath_layer_get_minrev (struct ipath_devdata *); +u32 ipath_layer_get_pcirev (struct ipath_devdata *);u32 ipath_layer_get_flags (struct ipath_devdata *dd);struct device *ipath_layer_get_device (struct ipath_devdata *dd);u16 ipath_layer_get_deviceid (struct ipath_devdata *dd); +u32 ipath_layer_get_vendorid (struct ipath_devdata *);u64 ipath_layer_get_lastibcstat (struct ipath_devdata *dd);u32 ipath_layer_get_ibmtu (struct ipath_devdata *dd);int ipath_layer_enable_timer (struct ipath_devdata *dd);
drivers/infiniband/hw/ipath/ipath_mad.c +4 -2
@@ -85,7 +85,7 @@ static int recv_subn_get_nodeinfo(struct {struct nodeinfo *nip = (struct nodeinfo *)&smp->data;struct ipath_devdata *dd =to_idev (ibdev)->dd; -u32 vendor, boardid, majrev, minrev; +u32 vendor, majrev, minrev;if (smp->attr_mod) smp->status |=IB_SMP_INVALID_FIELD ;
@@ -105,9 +105,11 @@ static int recv_subn_get_nodeinfo(struct nip->port_guid = nip->sys_guid; nip->partition_cap =cpu_to_be16 (ipath_layer_get_npkeys (dd)); nip->device_id =cpu_to_be16 (ipath_layer_get_deviceid (dd)); -ipath_layer_query_device (dd, &vendor, &boardid, &majrev, &minrev); + majrev =ipath_layer_get_majrev (dd); + minrev =ipath_layer_get_minrev (dd); nip->revision =cpu_to_be32 ((majrev <<16 ) | minrev); nip->local_port_num = port; + vendor =ipath_layer_get_vendorid (dd); nip->vendor_id[0 ] =0 ; nip->vendor_id[1 ] = vendor >>8 ; nip->vendor_id[2 ] = vendor;
drivers/infiniband/hw/ipath/ipath_verbs.c +5 -11
@@ -568,18 +568,15 @@ static int ipath_query_device(struct ib_ struct ib_device_attr *props) {struct ipath_ibdev *dev =to_idev (ibdev); -u32 vendor, boardrev, majrev, minrev;memset (props,0 ,sizeof (*props)); props->device_cap_flags =IB_DEVICE_BAD_PKEY_CNTR |IB_DEVICE_BAD_QKEY_CNTR |IB_DEVICE_SHUTDOWN_PORT |IB_DEVICE_SYS_IMAGE_GUID ; -ipath_layer_query_device (dev->dd, &vendor, &boardrev, - &majrev, &minrev); - props->vendor_id = vendor; - props->vendor_part_id = boardrev; - props->hw_ver = boardrev <<16 | majrev <<8 | minrev; + props->vendor_id =ipath_layer_get_vendorid (dev->dd); + props->vendor_part_id =ipath_layer_get_deviceid (dev->dd); + props->hw_ver =ipath_layer_get_pcirev (dev->dd); props->sys_image_guid = dev->sys_image_guid;
@@ -1121,11 +1118,8 @@ static ssize_t show_rev(struct class_dev {struct ipath_ibdev *dev = container_of(cdev, struct ipath_ibdev, ibdev.class_dev); -int vendor, boardrev, majrev, minrev; - -ipath_layer_query_device (dev->dd, &vendor, &boardrev, - &majrev, &minrev); -return sprintf (buf,"%d.%d\n" , majrev, minrev); + +return sprintf (buf,"%x\n" ,ipath_layer_get_pcirev (dev->dd)); }static ssize_t show_hca (struct class_device *cdev,char *buf)
PATCH 1/1 IB/ipath - enforce device resource limits
In reply to Bryan O'SullivanThese limits are somewhat artificial in that we don't actually have any device limits. However, the verbs layer expects that such limits exist and are enforced, so we make up arbitrary (but sensible) limits.
drivers/infiniband/hw/ipath/ipath_cq.c +15 -0
@@ -158,9 +158,20 @@ struct ib_cq *ipath_create_cq(struct ib_struct ib_ucontext *context, struct ib_udata *udata) { + struct ipath_ibdev *dev = to_idev(ibdev);struct ipath_cq *cq;struct ib_wc *wc;struct ib_cq *ret; + +if (entries > ib_ipath_max_cqes) { + ret =ERR_PTR (-EINVAL ); + goto bail; + } + +if (dev->n_cqs_allocated == ib_ipath_max_cqs) { + ret =ERR_PTR (-ENOMEM ); + goto bail; + }/* * Need to use vmalloc() if we want to support large #s of
@@ -197,6 +208,8 @@ struct ib_cq *ipath_create_cq(struct ib_ ret = &cq->ibcq; + dev->n_cqs_allocated++; + bail:return ret; }
@@ -211,9 +224,11 @@ bail:*/ int ipath_destroy_cq (struct ib_cq *ibcq) { +struct ipath_ibdev *dev =to_idev (ibcq->device);struct ipath_cq *cq =to_icq (ibcq);tasklet_kill (&cq->comptask); + dev->n_cqs_allocated--;vfree (cq->queue);kfree (cq);
drivers/infiniband/hw/ipath/ipath_qp.c +4 -2
@@ -661,8 +661,10 @@ struct ib_qp *ipath_create_qp(struct ib_size_t sz;struct ib_qp *ret; -if (init_attr->cap.max_send_sge >255 || - init_attr->cap.max_recv_sge >255 ) { +if (init_attr->cap.max_send_sge > ib_ipath_max_sges || + init_attr->cap.max_recv_sge > ib_ipath_max_sges || + init_attr->cap.max_send_wr > ib_ipath_max_qp_wrs || + init_attr->cap.max_recv_wr > ib_ipath_max_qp_wrs) { ret =ERR_PTR (-ENOMEM ); goto bail; }
drivers/infiniband/hw/ipath/ipath_srq.c +38 -15
92 lines not on this page · raw message
drivers/infiniband/hw/ipath/ipath_verbs.c +96 -13
172 lines not on this page · raw message
drivers/infiniband/hw/ipath/ipath_verbs.h +24 -0
@@ -149,6 +149,7 @@ struct ipath_mcast {struct list_head qp_list;wait_queue_head_t wait;atomic_t refcount; +int n_attached; };/* Memory region */
@@ -432,6 +433,11 @@ struct ipath_ibdev {__be64 sys_image_guid;/* in network order */ __be64 gid_prefix;/* in network order */ __be64 mkey; +u32 n_pds_allocated;/* number of PDs allocated for device */ +u32 n_ahs_allocated;/* number of AHs allocated for device */ +u32 n_cqs_allocated;/* number of CQs allocated for device */ +u32 n_srqs_allocated;/* number of SRQs allocated for device */ +u32 n_mcast_grps_allocated;/* number of mcast groups allocated */ u64 ipath_sword;/* total dwords sent (sample result) */ u64 ipath_rword;/* total dwords received (sample result) */ u64 ipath_spkts;/* total packets sent (sample result) */
@@ -697,6 +703,24 @@ extern const int ib_ipath_state_ops[];extern unsigned int ib_ipath_lkey_table_size; +extern unsigned int ib_ipath_max_cqes; + +extern unsigned int ib_ipath_max_cqs; + +extern unsigned int ib_ipath_max_qp_wrs; + +extern unsigned int ib_ipath_max_sges; + +extern unsigned int ib_ipath_max_mcast_grps; + +extern unsigned int ib_ipath_max_mcast_qp_attached; + +extern unsigned int ib_ipath_max_srqs; + +extern unsigned int ib_ipath_max_srq_sges; + +extern unsigned int ib_ipath_max_srq_wrs; +extern const u32 ib_ipath_rnr_table[];#endif /* IPATH_VERBS_H */
drivers/infiniband/hw/ipath/ipath_verbs_mcast.c +31 -7
@@ -93,6 +93,7 @@ static struct ipath_mcast *ipath_mcast_aINIT_LIST_HEAD (&mcast->qp_list);init_waitqueue_head (&mcast->wait);atomic_set (&mcast->refcount,0 ); + mcast->n_attached =0 ; bail:return mcast;
@@ -158,7 +159,8 @@ bail:* the table but the QP was added. Return ESRCH if the QP was already * attached and neither structure was added. */ -static int ipath_mcast_add (struct ipath_mcast *mcast, +static int ipath_mcast_add (struct ipath_ibdev *dev, +struct ipath_mcast *mcast,struct ipath_mcast_qp *mqp) {struct rb_node **n = &mcast_tree.rb_node;
@@ -189,16 +191,28 @@ static int ipath_mcast_add(struct ipath_/* Search the QP list to see if this is already there. */ list_for_each_entry_rcu (p, &tmcast->qp_list, list) {if (p->qp == mqp->qp) { -spin_unlock_irqrestore (&mcast_lock, flags); ret =ESRCH ; goto bail; } } +if (tmcast->n_attached == ib_ipath_max_mcast_qp_attached) { + ret =ENOMEM ; + goto bail; + } + + tmcast->n_attached++; +list_add_tail_rcu (&mqp->list, &tmcast->qp_list); -spin_unlock_irqrestore (&mcast_lock, flags); ret =EEXIST ; goto bail; } + +if (dev->n_mcast_grps_allocated == ib_ipath_max_mcast_grps) { + ret =ENOMEM ; + goto bail; + } + + dev->n_mcast_grps_allocated++;list_add_tail_rcu (&mqp->list, &mcast->qp_list);
@@ -206,17 +220,18 @@ static int ipath_mcast_add(struct ipath_rb_link_node (&mcast->rb_node, pn, n);rb_insert_color (&mcast->rb_node, &mcast_tree); + ret =0 ; + +bail:spin_unlock_irqrestore (&mcast_lock, flags); - ret =0 ; - -bail:return ret; }int ipath_multicast_attach (struct ib_qp *ibqp,union ib_gid *gid,u16 lid) {struct ipath_qp *qp =to_iqp (ibqp); +struct ipath_ibdev *dev =to_idev (ibqp->device);struct ipath_mcast *mcast;struct ipath_mcast_qp *mqp;int ret;
@@ -236,7 +251,7 @@ int ipath_multicast_attach(struct ib_qp ret = -ENOMEM ; goto bail; } -switch (ipath_mcast_add (mcast, mqp)) { +switch (ipath_mcast_add (dev, mcast, mqp)) {case ESRCH :/* Neither was used: can't attach the same QP twice. */ ipath_mcast_qp_free (mqp);
@@ -246,6 +261,12 @@ int ipath_multicast_attach(struct ib_qpcase EEXIST :/* The mcast wasn't used */ ipath_mcast_free (mcast);break ; +case ENOMEM : +/* Exceeded the maximum number of mcast groups. */ +ipath_mcast_qp_free (mqp); +ipath_mcast_free (mcast); + ret = -ENOMEM ; + goto bail;default :break ; }
@@ -259,6 +280,7 @@ int ipath_multicast_detach(struct ib_qpint ipath_multicast_detach (struct ib_qp *ibqp,union ib_gid *gid,u16 lid) {struct ipath_qp *qp =to_iqp (ibqp); +struct ipath_ibdev *dev =to_idev (ibqp->device);struct ipath_mcast *mcast =NULL ;struct ipath_mcast_qp *p, *tmp;struct rb_node *n;
@@ -297,6 +319,7 @@ int ipath_multicast_detach(struct ib_qp* link until we are sure there are no list walkers. */ list_del_rcu (&p->list); + mcast->n_attached--;/* If this was the last attached QP, remove the GID too. */ if (list_empty (&mcast->qp_list)) {
@@ -320,6 +343,7 @@ int ipath_multicast_detach(struct ib_qpatomic_dec (&mcast->refcount);wait_event (mcast->wait, !atomic_read (&mcast->refcount));ipath_mcast_free (mcast); + dev->n_mcast_grps_allocated--; } ret =0 ;
PATCH 1/1 IB/ipath - removed unused field ipath_kregvirt from struct ipath_devdata
In reply to Bryan O'Sullivandrivers/infiniband/hw/ipath/ipath_driver.c +2 -5
@@ -496,10 +496,8 @@ static int __devinit ipath_init_one(stru ((void __iomem *)dd->ipath_kregbase + len); dd->ipath_physaddr = addr;/* used for io_remap, etc. */ /* for user mmap */ - dd->ipath_kregvirt = (u64 __iomem *)phys_to_virt (addr); -ipath_cdbg (VERBOSE ,"mapped io addr %llx to kregbase %p " -"kregvirt %p\n" , addr, dd->ipath_kregbase, - dd->ipath_kregvirt); +ipath_cdbg (VERBOSE ,"mapped io addr %llx to kregbase %p\n" , + addr, dd->ipath_kregbase);/* * clear ipath_flags here instead of in ipath_init_chip as it is set
@@ -1809,7 +1807,6 @@ static void cleanup_device(struct ipath_* re-init */ dd->ipath_kregbase =NULL ; - dd->ipath_kregvirt =NULL ; dd->ipath_uregbase =0 ; dd->ipath_sregbase =0 ; dd->ipath_cregbase =0 ;
drivers/infiniband/hw/ipath/ipath_kernel.h +0 -5
@@ -158,11 +158,6 @@ struct ipath_devdata {unsigned long ipath_physaddr;/* base of memory alloced for ipath_kregbase, for free */ u64 *ipath_kregalloc; -/* -* version of kregbase that doesn't have high bits set (for 32 bit -* programs, so mmap64 44 bit works) -*/ -u64 __iomem *ipath_kregvirt;/* * virtual address where port0 rcvhdrqtail updated for this unit. * only written to by the chip, not the driver.
PATCH 1/1 IB/ipath - print better debug info when handling 32/64-bit DMA mask problems
In reply to Bryan O'Sullivandrivers/infiniband/hw/ipath/ipath_driver.c +20 -3
@@ -425,12 +425,29 @@ static int __devinit ipath_init_one(stru*/ ret =pci_set_dma_mask (pdev,DMA_32BIT_MASK );if (ret) { -dev_info (&pdev->dev,"pci_set_dma_mask unit %u " -"fails: %d\n" , dd->ipath_unit, ret); +dev_info (&pdev->dev, +"Unable to set DMA mask for unit %u: %d\n" , + dd->ipath_unit, ret); goto bail_regions; } -else +else {ipath_dbg ("No 64bit DMA mask, used 32 bit mask\n" ); + ret =pci_set_consistent_dma_mask (pdev,DMA_32BIT_MASK ); +if (ret) +dev_info (&pdev->dev, +"Unable to set DMA consistent mask " +"for unit %u: %d\n" , + dd->ipath_unit, ret); + + } + } +else { + ret =pci_set_consistent_dma_mask (pdev,DMA_64BIT_MASK ); +if (ret) +dev_info (&pdev->dev, +"Unable to set DMA consistent mask " +"for unit %u: %d\n" , + dd->ipath_unit, ret); }pci_set_master (pdev);
PATCH 1/1 IB/ipath - enable freeze mode when shutting down device
In reply to Bryan O'Sullivandrivers/infiniband/hw/ipath/ipath_driver.c +1 -1
@@ -1656,7 +1656,7 @@ void ipath_shutdown_device(struct ipath_/* disable IBC */ dd->ipath_control &= ~INFINIPATH_C_LINKENABLE ;ipath_write_kreg (dd, dd->ipath_kregs->kr_control, - dd->ipath_control); + dd->ipath_control |INFINIPATH_C_FREEZEMODE );/* * clear SerdesEnable and turn the leds off; do this here because
PATCH 1/1 IB/ipath - use vmalloc to allocate struct ipath_devdata
In reply to Bryan O'SullivanThis is not a DMA target, so no need to use dma_alloc_coherent on it.
drivers/infiniband/hw/ipath/ipath_driver.c +3 -7
@@ -171,14 +171,13 @@ static void ipath_free_devdata(struct pclist_del (&dd->ipath_list);spin_unlock_irqrestore (&ipath_devs_lock, flags); } -dma_free_coherent (&pdev->dev,sizeof (*dd), dd, dd->ipath_dma_addr); +vfree (dd); }static struct ipath_devdata *ipath_alloc_devdata (struct pci_dev *pdev) {unsigned long flags;struct ipath_devdata *dd; -dma_addr_t dma_addr;int ret;if (!idr_pre_get (&unit_table,GFP_KERNEL )) {
@@ -186,15 +185,12 @@ static struct ipath_devdata *ipath_alloc goto bail; } - dd =dma_alloc_coherent (&pdev->dev,sizeof (*dd), &dma_addr, -GFP_KERNEL ); - + dd =vmalloc (sizeof (*dd));if (!dd) { dd =ERR_PTR (-ENOMEM ); goto bail; } - - dd->ipath_dma_addr = dma_addr; +memset (dd,0 ,sizeof (*dd)); dd->ipath_unit =-1 ;spin_lock_irqsave (&ipath_devs_lock, flags);
drivers/infiniband/hw/ipath/ipath_kernel.h +0 -1
@@ -163,7 +163,6 @@ struct ipath_devdata {* only written to by the chip, not the driver. */ volatile __le64 *ipath_hdrqtailptr; -dma_addr_t ipath_dma_addr;/* ipath_cfgports pointers */ struct ipath_portdata **ipath_pd;/* sk_buffs used by port 0 eager receive queue */
PATCH 1/1 IB/ipath - memory management cleanups
In reply to Bryan O'SullivanMade in-memory rcvhdrq tail update be in dma_alloc'ed memory, not random user or special kernel (needed for ppc, also "just the right thing to do").
Some cleanups to make unexpected link transitions less likely to produce complaints about packet errors, and also to not leave SMA packets stuck and unable to go out.
A few other random debug and comment cleanups.
Always init rcvhdrq head/tail registers to 0, to avoid race conditions (should have been that way some time ago).
drivers/infiniband/hw/ipath/ipath_common.h +4 -7
@@ -311,6 +311,9 @@ struct ipath_base_info {__u32 spi_rcv_egrchunksize;/* total size of mmap to cover full rcvegrbuffers */ __u32 spi_rcv_egrbuftotlen; +__u32 spi_filler_for_align; +/* address of readonly memory copy of the rcvhdrq tail register. */ +__u64 spi_rcvhdr_tailaddr; } __attribute__ ((aligned(8)));
@@ -380,13 +383,7 @@ struct ipath_user_info {*/ __u32 spu_rcvhdrsize; -/* -* cache line aligned (64 byte) user address to -* which the rcvhdrtail register will be written by infinipath -* whenever it changes, so that no chip registers are read in -* the performance path. -*/ -__u64 spu_rcvhdraddr; +__u64 spu_unused;/* kept for compatible layout */ /* * address of struct base_info to write to
drivers/infiniband/hw/ipath/ipath_driver.c +101 -142
345 lines not on this page · raw message
drivers/infiniband/hw/ipath/ipath_file_ops.c +117 -177
436 lines not on this page · raw message
drivers/infiniband/hw/ipath/ipath_init_chip.c +12 -33
72 lines not on this page · raw message
drivers/infiniband/hw/ipath/ipath_intr.c +54 -9
105 lines not on this page · raw message
drivers/infiniband/hw/ipath/ipath_kernel.h +3 -14
@@ -62,9 +62,7 @@ struct ipath_portdata {/* rcvhdrq base, needs mmap before useful */ void *port_rcvhdrq;/* kernel virtual address where hdrqtail is updated */ -u64 *port_rcvhdrtail_kvaddr; -/* page * used for uaddr */ -struct page *port_rcvhdrtail_pagep; +volatile __le64 *port_rcvhdrtail_kvaddr;/* * temp buffer for expected send setup, allocated at open, instead * of each setup call
@@ -79,11 +77,7 @@ struct ipath_portdata {dma_addr_t port_rcvegr_phys;/* mmap of hdrq, must fit in 44 bits */ dma_addr_t port_rcvhdrq_phys; -/* -* the actual user address that we ipath_mlock'ed, so we can -* ipath_munlock it at close -*/ -unsigned long port_rcvhdrtail_uaddr; +dma_addr_t port_rcvhdrqtailaddr_phys;/* * number of opens on this instance (0 or 1; ignoring forks, dup, * etc. for now)
@@ -515,11 +509,6 @@ struct ipath_devdata {u8 ipath_lmc; }; -extern volatile __le64 *ipath_port0_rcvhdrtail; -extern dma_addr_t ipath_port0_rcvhdrtail_dma; - -#define IPATH_PORT0_RCVHDRTAIL_SIZE PAGE_SIZE -extern struct list_head ipath_dev_list;extern spinlock_t ipath_devs_lock;extern struct ipath_devdata *ipath_lookup (int unit);
@@ -579,7 +568,7 @@ void ipath_disarm_piobufs(struct ipath_d unsigned cnt);int ipath_create_rcvhdrq (struct ipath_devdata *,struct ipath_portdata *); -void ipath_free_pddata (struct ipath_devdata *,u32 ,int ); +void ipath_free_pddata (struct ipath_devdata *,struct ipath_portdata *);int ipath_parse_ushort (const char *str,unsigned short *valp);
PATCH 1/1 IB/ipath - reduce overhead on receive interrupts
In reply to Bryan O'SullivanAlso count the number of interrupts where that works (fastrcvint). On any interrupt where the port0 head and tail registers are not equal, just call the ipath_kreceive code without reading the interrupt status, thus saving the approximately 0.25usec processor stall waiting for the read to return. If any other interrupt bits are set, or head==tail, take the normal path, but that has been reordered to handle read ahead of pioavail. Also no longer call ipath_kreceive() from ipath_qcheck(), because that just seems to make things worse, and isn't really buying us anything, these days.
Also no longer loop in ipath_kreceive(); better to not hold things off too long (I saw many cases where we would loop 4-8 times, and handle thousands (up to 3500) in a single call).
drivers/infiniband/hw/ipath/ipath_common.h +2 -2
@@ -97,8 +97,8 @@ struct infinipath_stats {__u64 sps_hwerrs;/* number of times IB link changed state unexpectedly */ __u64 sps_iblink; -/* no longer used; left for compatibility */ -__u64 sps_unused3; +/* kernel receive interrupts that didn't read intstat */ +__u64 sps_fastrcvint;/* number of kernel (port0) packets received */ __u64 sps_port0pkts;/* number of "ethernet" packets sent by driver */
drivers/infiniband/hw/ipath/ipath_driver.c +1 -10
@@ -888,12 +888,7 @@ void ipath_kreceive(struct ipath_devdata (u32)le64_to_cpu(*dd->ipath_hdrqtailptr)) goto done; -gotmore: -/* -* read only once at start. If in flood situation, this helps -* performance slightly. If more arrive while we are processing, -* we'll come back here and do them -*/ +/* read only once at start for performance */ hdrqtail = (u32 )le64_to_cpu (*dd->ipath_hdrqtailptr);for (i =0 , l = dd->ipath_port0head; l != hdrqtail; i++) {
@@ -1022,10 +1017,6 @@ gotmore: dd->ipath_port0head = l; -if (hdrqtail != (u32 )le64_to_cpu (*dd->ipath_hdrqtailptr)) -/* more arrived while we handled first batch */ - goto gotmore; -if (pkttot > ipath_stats.sps_maxpkts_call) ipath_stats.sps_maxpkts_call = pkttot; ipath_stats.sps_port0pkts += pkttot;
drivers/infiniband/hw/ipath/ipath_intr.c +105 -63
239 lines not on this page · raw message
drivers/infiniband/hw/ipath/ipath_stats.c +0 -1
@@ -186,7 +186,6 @@ static void ipath_qcheck(struct ipath_de dd->ipath_port0head, (unsigned long long ) ipath_stats.sps_port0pkts); -ipath_kreceive (dd); } dd->ipath_lastport0rcv_cnt = ipath_stats.sps_port0pkts; }
PATCH 1/1 IB/ipath - fixed bug 9776 for real. The problem was that I was updating
In reply to Bryan O'Sullivanthe head register multiple times in the rcvhdrq processing loop,
and setting the counter on each update. Since that meant that
the tail register was ahead of head for all but the last update,
we would get extra interrupts. The fix was to not write the
counter value except on the last update.
I also changed to update rcvhdrhead and rcvegrindexhead at most every 16 packets, if there were lots of packets in the queue (and of course, on the last packet, regardless).
I also made some small cleanups while debugging this.
With these changes, xeon/monty typically sees two openib packets per interrupt on sdp and ipoib, opteron/monty is about 1.25 pkts/intr.
I'm seeing about 3800 Mbit/s monty/xeon, and 5000-5100 opteron/monty with netperf sdp. Netpipe doesn't show as good as that, peaking
at about 4400 on opteron/monty sdp. Plain ipoib xeon is about 2100+
netperf, opteron 2900+, at 128KB
drivers/infiniband/hw/ipath/ipath_driver.c +22 -11
@@ -870,7 +870,7 @@ void ipath_kreceive(struct ipath_devdataconst u32 maxcnt = dd->ipath_rcvhdrcnt * rsize;/* words */ u32 etail =-1 , l, hdrqtail;struct ips_message_header *hdr; -u32 eflags, i, etype, tlen, pkttot =0 ; +u32 eflags, i, etype, tlen, pkttot =0 , updegr=0 ;static u64 totcalls;/* stats, may eventually remove */ char emsg[128 ];
@@ -884,14 +884,14 @@ void ipath_kreceive(struct ipath_devdataif (test_and_set_bit (0 , &dd->ipath_rcv_pending)) goto bail; -if (dd->ipath_port0head == - (u32 )le64_to_cpu (*dd->ipath_hdrqtailptr)) + l = dd->ipath_port0head; +if (l == (u32 )le64_to_cpu (*dd->ipath_hdrqtailptr)) goto done;/* read only once at start for performance */ hdrqtail = (u32 )le64_to_cpu (*dd->ipath_hdrqtailptr); -for (i =0 , l = dd->ipath_port0head; l != hdrqtail; i++) { +for (i =0 ; l != hdrqtail; i++) {u32 qp;u8 *bthbytes;
@@ -1002,15 +1002,26 @@ void ipath_kreceive(struct ipath_devdata l += rsize;if (l >= maxcnt) l =0 ; +if (etype !=RCVHQ_RCV_TYPE_EXPECTED ) + updegr =1 ;/* -* update for each packet, to help prevent overflows if we -* have lots of packets. +* update head regs on last packet, and every 16 packets. +* Reduce bus traffic, while still trying to prevent +* rcvhdrq overflows, for when the queue is nearly full */ - (void )ipath_write_ureg (dd, ur_rcvhdrhead, - dd->ipath_rhdrhead_intr_off | l,0 ); -if (etype !=RCVHQ_RCV_TYPE_EXPECTED ) - (void )ipath_write_ureg (dd, ur_rcvegrindexhead, - etail,0 ); +if (l == hdrqtail || (i && !(i&0xf ))) { +u64 lval; +if (l == hdrqtail)/* want interrupt only on last */ + lval = dd->ipath_rhdrhead_intr_off | l; +else + lval = l; + (void )ipath_write_ureg (dd, ur_rcvhdrhead, lval,0 ); +if (updegr) { + (void )ipath_write_ureg (dd, ur_rcvegrindexhead, + etail,0 ); + updegr =0 ; + } + } } pkttot += i;
drivers/infiniband/hw/ipath/ipath_intr.c +25 -25
109 lines not on this page · raw message
PATCH 1/1 IB/ipath - fix lost interrupts on HT-400
In reply to Bryan O'SullivanDo an extra check to see if in-memory tail changed while processing packets, and if so, going back through the loop again (but only once
per call to ipath_kreceive()). In practice, this seems to be enough
to guarantee that if we crossed the clearing of an interrupt at start of ipath_intr with a scheduled tail register update, that we'll process the "extra" packet that lost the interrupt because we cleared it just as it was about to arrive.
drivers/infiniband/hw/ipath/ipath_driver.c +22 -3
@@ -870,7 +870,7 @@ void ipath_kreceive(struct ipath_devdataconst u32 maxcnt = dd->ipath_rcvhdrcnt * rsize;/* words */ u32 etail =-1 , l, hdrqtail;struct ips_message_header *hdr; -u32 eflags, i, etype, tlen, pkttot =0 , updegr=0 ; +u32 eflags, i, etype, tlen, pkttot =0 , updegr=0 , reloop=0 ;static u64 totcalls;/* stats, may eventually remove */ char emsg[128 ];
@@ -885,9 +885,11 @@ void ipath_kreceive(struct ipath_devdata goto bail; l = dd->ipath_port0head; -if (l == (u32 )le64_to_cpu (*dd->ipath_hdrqtailptr)) + hdrqtail = (u32 )le64_to_cpu (*dd->ipath_hdrqtailptr); +if (l == hdrqtail) goto done; +reloop:/* read only once at start for performance */ hdrqtail = (u32 )le64_to_cpu (*dd->ipath_hdrqtailptr);
@@ -1011,7 +1013,7 @@ void ipath_kreceive(struct ipath_devdata*/ if (l == hdrqtail || (i && !(i&0xf ))) {u64 lval; -if (l == hdrqtail)/* want interrupt only on last */ +if (l == hdrqtail)/* PE-800 interrupt only on last */ lval = dd->ipath_rhdrhead_intr_off | l;else lval = l;
@@ -1021,6 +1023,23 @@ void ipath_kreceive(struct ipath_devdata etail, 0); updegr =0 ; } + } + } + +if (!dd->ipath_rhdrhead_intr_off && !reloop) { +/* HT-400 workaround; we can have a race clearing chip +* interrupt with another interrupt about to be delivered, +* and can clear it before it is delivered on the GPIO +* workaround. By doing the extra check here for the +* in-memory tail register updating while we were doing +* earlier packets, we "almost" guarantee we have covered +* that case. +*/ +u32 hqtail = (u32 )le64_to_cpu (*dd->ipath_hdrqtailptr); +if (hqtail != hdrqtail) { + hdrqtail = hqtail; + reloop =1 ;/* loop 1 extra time at most */ + goto reloop; } }
drivers/infiniband/hw/ipath/ipath_intr.c +16 -16
@@ -766,7 +766,7 @@ irqreturn_t ipath_intr(int irq, void *dau32 istat, chk0rcv =0 ;ipath_err_t estat =0 ;irqreturn_t ret; -u32 p0bits, oldhead; +u32 oldhead, curtail;static unsigned unexpected =0 ;static const u32 port0rbits = (1U <<INFINIPATH_I_RCVAVAIL_SHIFT ) | (1U <<INFINIPATH_I_RCVURG_SHIFT );
@@ -809,15 +809,16 @@ irqreturn_t ipath_intr(int irq, void *da* lose intr for later packets that arrive while we are processing. */ oldhead = dd->ipath_port0head; -if (oldhead != (u32 )le64_to_cpu (*dd->ipath_hdrqtailptr)) { + curtail = (u32 )le64_to_cpu (*dd->ipath_hdrqtailptr); +if (oldhead != curtail) {if (dd->ipath_flags &IPATH_GPIO_INTR ) {ipath_write_kreg (dd, dd->ipath_kregs->kr_gpio_clear, (u64) (1 <<2 )); - p0bits = port0rbits |INFINIPATH_I_GPIO ; + istat = port0rbits |INFINIPATH_I_GPIO ; }else - p0bits = port0rbits; -ipath_write_kreg (dd, dd->ipath_kregs->kr_intclear, p0bits); + istat = port0rbits; +ipath_write_kreg (dd, dd->ipath_kregs->kr_intclear, istat);ipath_kreceive (dd);if (oldhead != dd->ipath_port0head) { ipath_stats.sps_fastrcvint++;
@@ -827,7 +828,6 @@ irqreturn_t ipath_intr(int irq, void *da } istat =ipath_read_kreg32 (dd, dd->ipath_kregs->kr_intstatus); - p0bits = port0rbits;if (unlikely (!istat)) { ipath_stats.sps_nullintr++;
@@ -890,19 +890,19 @@ irqreturn_t ipath_intr(int irq, void *daelse {/* Clear GPIO status bit 2 */ ipath_write_kreg (dd, dd->ipath_kregs->kr_gpio_clear, - (u64) (1 <<2 )); - p0bits |=INFINIPATH_I_GPIO ; + (u64) (1 <<2 )); chk0rcv =1 ; } } - chk0rcv |= istat & p0bits; - -/* -* clear the ones we will deal with on this round -* We clear it early, mostly for receive interrupts, so we -* know the chip will have seen this by the time we process -* the queue, and will re-interrupt if necessary. The processor -* itself won't take the interrupt again until we return. + chk0rcv |= istat & port0rbits; + +/* +* Clear the interrupt bits we found set, unless they are receive +* related, in which case we already cleared them above, and don't +* want to clear them again, because we might lose an interrupt. +* Clear it early, so we "know" know the chip will have seen this by +* the time we process the queue, and will re-interrupt if necessary. +* The processor itself won't take the interrupt again until we return. */ ipath_write_kreg (dd, dd->ipath_kregs->kr_intclear, istat);
PATCH 1/1 IB/ipath - disallow send of invalid packet sizes over UD
In reply to Bryan O'Sullivandrivers/infiniband/hw/ipath/ipath_ud.c +5 -0
@@ -274,6 +274,11 @@ int ipath_post_ud_send(struct ipath_qp * } len += wr->sg_list[i].length; ss.num_sge++; + } +/* Check for invalid packet size. */ +if (len >ipath_layer_get_ibmtu (dev->dd)) { + ret = -EINVAL ; + goto bail; } extra_bytes = (4 - len) &3 ; nwords = (len + extra_bytes) >>2 ;
PATCH 1/1 IB/ipath - don't confuse the max message size with the MTU
In reply to Bryan O'Sullivandrivers/infiniband/hw/ipath/ipath_verbs.c +1 -1
@@ -695,7 +695,7 @@ static int ipath_query_port(struct ib_de ipath_layer_get_lastibcstat(dev->dd) & 0xf]; props->port_cap_flags = dev->port_cap_flags; props->gid_tbl_len =1 ; - props->max_msg_sz =4096 ; + props->max_msg_sz =0x80000000 ; props->pkey_tbl_len =ipath_layer_get_npkeys (dev->dd); props->bad_pkey_cntr =ipath_layer_get_cr_errpkey (dev->dd) - dev->z_pkey_violations;
PATCH 1/1 IB/ipath - removed redundant statements
In reply to Bryan O'SullivanThe tail register read became redundant as the result of earlier receive interrupt bug fixes.
Drop another unneeded register read.
And another line that got duplicated.
drivers/infiniband/hw/ipath/ipath_driver.c +0 -3
@@ -890,9 +890,6 @@ void ipath_kreceive(struct ipath_devdata goto done; reloop: -/* read only once at start for performance */ - hdrqtail = (u32 )le64_to_cpu (*dd->ipath_hdrqtailptr); -for (i =0 ; l != hdrqtail; i++) {u32 qp;u8 *bthbytes;
drivers/infiniband/hw/ipath/ipath_ht400.c +0 -1
@@ -1573,7 +1573,6 @@ void ipath_init_ht400_funcs(struct ipath dd->ipath_f_reset = ipath_setup_ht_reset; dd->ipath_f_get_boardname = ipath_ht_boardname; dd->ipath_f_init_hwerrors = ipath_ht_init_hwerrors; - dd->ipath_f_init_hwerrors = ipath_ht_init_hwerrors; dd->ipath_f_early_init = ipath_ht_early_init; dd->ipath_f_handle_hwerrors = ipath_ht_handle_hwerrors; dd->ipath_f_quiet_serdes = ipath_ht_quiet_serdes;
drivers/infiniband/hw/ipath/ipath_intr.c +0 -1
@@ -824,7 +824,6 @@ irqreturn_t ipath_intr(int irq, void *da ipath_stats.sps_fastrcvint++; goto done; } - istat =ipath_read_kreg32 (dd, dd->ipath_kregs->kr_intstatus); } istat =ipath_read_kreg32 (dd, dd->ipath_kregs->kr_intstatus);
PATCH 1/1 IB/ipath - check for valid LID and multicast LIDs
In reply to Bryan O'Sullivandrivers/infiniband/hw/ipath/ipath_sysfs.c +2 -2
@@ -280,7 +280,7 @@ static ssize_t store_lid(struct device *if (ret <0 ) goto invalid; -if (lid ==0 || lid >=0xc000 ) { +if (lid ==0 || lid >=IPS_MULTICAST_LID_BASE ) { ret = -EINVAL ; goto invalid; }
@@ -314,7 +314,7 @@ static ssize_t store_mlid(struct deviceint ret; ret =ipath_parse_ushort (buf, &mlid); -if (ret <0 ) +if (ret <0 || mlid <IPS_MULTICAST_LID_BASE ) goto invalid; unit = dd->ipath_unit;
PATCH 1/1 IB/ipath - Ignore receive queue size if SRQ is specified
In reply to Bryan O'SullivanThe receive work queue size should be ignored if the QP is created to use a shared receive queue according to the IB spec.
drivers/infiniband/hw/ipath/ipath_qp.c +16 -11
@@ -685,16 +685,22 @@ struct ib_qp *ipath_create_qp(struct ib_ ret =ERR_PTR (-ENOMEM ); goto bail; } - qp->r_rq.size = init_attr->cap.max_recv_wr +1 ; - sz =sizeof (struct ipath_sge ) * - init_attr->cap.max_recv_sge + -sizeof (struct ipath_rwqe ); - qp->r_rq.wq =vmalloc (qp->r_rq.size * sz); -if (!qp->r_rq.wq) { -kfree (qp); -vfree (swq); - ret =ERR_PTR (-ENOMEM ); - goto bail; +if (init_attr->srq) { + qp->r_rq.size =0 ; + qp->r_rq.max_sge =0 ; + qp->r_rq.wq =NULL ; + }else { + qp->r_rq.size = init_attr->cap.max_recv_wr +1 ; + qp->r_rq.max_sge = init_attr->cap.max_recv_sge; + sz = (sizeof (struct ipath_sge ) * qp->r_rq.max_sge) + +sizeof (struct ipath_rwqe ); + qp->r_rq.wq =vmalloc (qp->r_rq.size * sz); +if (!qp->r_rq.wq) { +kfree (qp); +vfree (swq); + ret =ERR_PTR (-ENOMEM ); + goto bail; + } }/*
@@ -713,7 +719,6 @@ struct ib_qp *ipath_create_qp(struct ib_ qp->s_wq = swq; qp->s_size = init_attr->cap.max_send_wr +1 ; qp->s_max_sge = init_attr->cap.max_send_sge; - qp->r_rq.max_sge = init_attr->cap.max_recv_sge; qp->s_flags = init_attr->sq_sig_type ==IB_SIGNAL_REQ_WR ?1 <<IPATH_S_SIGNAL_REQ_WR :0 ; dev =to_idev (ibpd->device);
PATCH 1/1 IB/ipath - use streaming copy in RDMA interrupt handler to reduce packet loss
In reply to Bryan O'SullivanIn cases where a large incoming RDMA is being received, we have to copy data inside the interrupt handler before we can ACK each packet. The source is DMAed to by the hardware, which means that the CPU won't have it cached. We only read the source this one time; using normal load instructions pollutes the dcache with useless data, reducing performance to the point where we can lose a significant number of packets.
Using a (memcpy-compatible) copy routine that loads with streaming instructions, we try to not fill the dcache with useless data. Avoiding the cache refill penalty lets us keep up better with the sender, resulting in many fewer dropped packets. We use normal stores to the destination, because the copied-to data will be used soon after the interrupt handler completes.
drivers/infiniband/hw/ipath/Makefile +2 -0
@@ -35,3 +35,5 @@ ib_ipath-y := \ ipath_ud.o \ ipath_verbs.o \ ipath_verbs_mcast.o + +ib_ipath-$(CONFIG_X86_64) += ipath_memcpy_x86_64.o
drivers/infiniband/hw/ipath/ipath_verbs.c +1 -1
@@ -159,7 +159,7 @@ void ipath_copy_sge(struct ipath_sge_staBUG_ON (len ==0 );if (len > length) len = length; -memcpy (sge->vaddr, data, len); +ipath_memcpy_nc (sge->vaddr, data, len); sge->vaddr += len; sge->length -= len; sge->sge_length -= len;
drivers/infiniband/hw/ipath/ipath_verbs.h +10 -0
@@ -728,4 +728,14 @@ extern unsigned int ib_ipath_max_srq_wrsextern const u32 ib_ipath_rnr_table[]; +/* +* Copy data. Try not to pollute the dcache with the source data, +* because we won't be reading it again. +*/ +#if defined(CONFIG_X86_64 ) +void *ipath_memcpy_nc (void *dest,const void *src,size_t n); +#else +#define ipath_memcpy_nc (dest, src, n) memcpy(dest, src, n) +#endif +#endif /* IPATH_VERBS_H */
drivers/infiniband/hw/ipath/ipath_memcpy_x86_64.S new file +157 -0
157 lines not on this page · raw message
David Miller
maintainerRe: [PATCH 39 of 39] IB/ipath - use streaming copy in RDMA interrupt handler to reduce packet loss
From: Bryan O'Sullivan <[email protected]>
Date: Thu, 29 Jun 2006 14:41:30 -0700
drivers/infiniband/hw/ipath/ipath_verbs.h extern unsigned int ib_ipath_max_srq_wrs · line 739
Quoted 9 lines
drivers/infiniband/hw/ipath/ipath_verbs.h +9
-0+/* +* Copy data. Try not to pollute the dcache with the source data, +* because we won't be reading it again. +*/ +#if defined(CONFIG_X86_64 ) +void *ipath_memcpy_nc (void *dest,const void *src,size_t n); +#else +#define ipath_memcpy_nc (dest, src, n) memcpy(dest, src, n) +#endif
A facility like this doesn't belong in some arbitrary driver layer. It belongs as a generic facility the whole kernel could make use of.
Please stop polluting the infiniband drivers with Opteron crap.
Re: [PATCH 39 of 39] IB/ipath - use streaming copy in RDMA interrupt handler to reduce packet loss
Quoted 3 lines · David Miller
A facility like this doesn't belong in some arbitrary driver layer. It belongs as a generic facility the whole kernel could make use of.
It could, indeed. In fact, we had that discussion here before I sent this patch in. It presumably wants to live in lib/, and acquire a more generic name. What name will capture the uncached-read-but-cached-write semantics in a useful fashion? memcpy_nc?
<b
David Miller
maintainerRe: [PATCH 39 of 39] IB/ipath - use streaming copy in RDMA interrupt handler to reduce packet loss
From: Bryan O'Sullivan <[email protected]>
Date: Thu, 29 Jun 2006 14:59:37 -0700
Quoted 4 lines
It could, indeed. In fact, we had that discussion here before I sent this patch in. It presumably wants to live in
lib/, and acquire a more generic name. What name will capture the uncached-read-but-cached-write semantics in a useful fashion?memcpy_nc?
I'm not good with names :-)
Note that there also might be cases where using such a memcpy variant might be the wrong thing to do. For example, for a very tightly coupled CMT cpu implementation which has the memory controller, L2 cache, PCI controller, etc. all on the same die and the PCI controller makes use of the L2 cache just like the cpu threads do, using this kind of memcpy would always be the wrong thing to do.
Re: [PATCH 39 of 39] IB/ipath - use streaming copy in RDMA interrupt handler to reduce packet loss
Quoted 1 line · David Miller
I'm not good with names :-)
Heh. I'll call it memcpy_nc for now, then, and people can retch all over the name as they please when I submit a more suitably generic patch.
Quoted 6 lines
Note that there also might be cases where using such a memcpy variant might be the wrong thing to do. For example, for a very tightly coupled CMT cpu implementation which has the memory controller, L2 cache, PCI controller, etc. all on the same die and the PCI controller makes use of the L2 cache just like the cpu threads do, using this kind of memcpy would always be the wrong thing to do.
I'm not quite following you, though I assume you're referring to Niagara or Rock :-) Are you saying a memcpy_nc would do worse than plain memcpy, or worse than some other memcpy-like routine?
<b
David Miller
maintainerRe: [PATCH 39 of 39] IB/ipath - use streaming copy in RDMA interrupt handler to reduce packet loss
From: Bryan O'Sullivan <[email protected]>
Date: Thu, 29 Jun 2006 16:34:23 -0700
Quoted 3 lines
I'm not quite following you, though I assume you're referring to Niagara or Rock :-) Are you saying a
memcpy_ncwould do worse than plain memcpy, or worse than some other memcpy-like routine?
It would do worse than memcpy.
If you bypass the L2 cache, it's pointless because the next agent (PCI controller, CPU thread, etc.) is going to need the data in the L2 cache.
It's better in that kind of setup to eat the L2 cache miss overhead in memcpy since memcpy can usually prefetch and store buffer in order to absorb some of the L2 miss costs.
Re: [openib-general] [PATCH 39 of 39] IB/ipath - use streaming copy in RDMA interrupt handler to reduce packet loss
This is intended to be an architecture specific function so if the CPU does support HW dma to the CPU's L2 cache, the architecture specific version of memcpy_nc() would not replace the default definition which maps memcpy_nc() to memcpy().
For CPUs like the vast majority currently available, there is a performance benefit by not reading data into the cache that won't be read a second time.
Quoted 24 lines · David Miller
From: Bryan O'Sullivan <[email protected]>
Date: Thu, 29 Jun 2006 16:34:23 -0700Quoted 3 lines
I'm not quite following you, though I assume you're referring to Niagara or Rock :-) Are you saying a
memcpy_ncwould do worse than plain memcpy, or worse than some other memcpy-like routine?It would do worse than memcpy.
If you bypass the L2 cache, it's pointless because the next agent (PCI controller, CPU thread, etc.) is going to need the data in the L2 cache.
It's better in that kind of setup to eat the L2 cache miss overhead in memcpy since memcpy can usually prefetch and store buffer in order to absorb some of the L2 miss costs.
_______________________________________________
openib-general mailing list
[email protected]
http://openib.org/mailman/listinfo/openib-generalTo unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general
Re: [PATCH 39 of 39] IB/ipath - use streaming copy in RDMA interrupt handler to reduce packet loss
In reply to David MillerQuoted 7 lines
If you bypass the L2 cache, it's pointless because the next agent (PCI controller, CPU thread, etc.) is going to need the data in the L2 cache.
It's better in that kind of setup to eat the L2 cache miss overhead in memcpy since memcpy can usually prefetch and store buffer in order to absorb some of the L2 miss costs.
I thought that most PCI controllers (that is to say the things bridging PCI to the rest of the system) could do prefetching and/or that PCI-X (if not PCI, no idea about PCI-e) cards could issue multiple transactions anyway?
rick jones
David Miller
maintainerRe: [PATCH 39 of 39] IB/ipath - use streaming copy in RDMA interrupt handler to reduce packet loss
From: Rick Jones <[email protected]>
Date: Thu, 29 Jun 2006 17:28:50 -0700
Quoted 4 lines
I thought that most PCI controllers (that is to say the things bridging PCI to the rest of the system) could do prefetching and/or that PCI-X (if not PCI, no idea about PCI-e) cards could issue multiple transactions anyway?
People doing deep CMT chips have found out that all of that prefetching and store buffering is unnecessary when everything is so tightly integrated.
All of the previous UltraSPARC boxes before Niagara had a streaming cache sitting on the PCI controller. It basically prefetched for reads and collected writes from PCI devices into cacheline sized chunks.
The PCI controller in the current Niagara systems has none of that stuff.
Re: [PATCH 39 of 39] IB/ipath - use streaming copy in RDMA interrupt handler to reduce packet loss
Quoted 10 lines · David Miller
From: Rick Jones <[email protected]>
Date: Thu, 29 Jun 2006 17:28:50 -0700Quoted 1 line
I thought that most PCI controllers (that is to say the things bridging PCI to the rest of the system) could do prefetching and/or that PCI-X (if not PCI, no idea about PCI-e) cards could issue multiple transactions anyway?
People doing deep CMT chips have found out that all of that prefetching and store buffering is unnecessary when everything is so tightly integrated.
Then is prefetching in memcpy really that important to them (BTW besides
Sun/Niagra who are doing "deep CMT"?)
Quoted 7 lines
All of the previous UltraSPARC boxes before Niagara had a streaming cache sitting on the PCI controller. It basically prefetched for reads and collected writes from PCI devices into cacheline sized chunks.
The PCI controller in the current Niagara systems has none of that stuff.
Relying on PCI-X devices to issue multiple requests then?
rick jones
David Miller
maintainerRe: [PATCH 39 of 39] IB/ipath - use streaming copy in RDMA interrupt handler to reduce packet loss
From: Rick Jones <[email protected]>
Date: Thu, 29 Jun 2006 17:44:05 -0700
Quoted 1 line
Then is prefetching in memcpy really that important to them.
Not really, the thread just blocks while waiting for memory. On stores they do a cacheline fill optimization similar to the powerpc.
Quoted 1 line
Relying on PCI-X devices to issue multiple requests then?
Perhaps :)
PATCH 1/1 IB/ipath - remove some duplicate code
In reply to Bryan O'Sullivandrivers/infiniband/hw/ipath/ipath_qp.c +0 -3
@@ -511,9 +511,6 @@ int ipath_modify_qp(struct ib_qp *ibqp,if (attr_mask &IB_QP_QKEY ) qp->qkey = attr->qkey; -if (attr_mask &IB_QP_PKEY_INDEX ) - qp->s_pkey_index = attr->pkey_index; - qp->state = new_state;spin_unlock (&qp->s_lock);spin_unlock_irqrestore (&qp->r_rq.lock, flags);
PATCH 1/1 IB/ipath - Allow diags on any unit
In reply to Bryan O'SullivanThere is no longer a /dev/ipath_diag file; instead, there's /dev/ipath_diag0, 1, etc.
It's still not possible to have diags run on more than one unit at a time, but that's easy to fix at some point.
drivers/infiniband/hw/ipath/ipath_diag.c +39 -68
@@ -67,18 +67,20 @@ static struct file_operations diag_file_ .release = ipath_diag_release }; -static struct cdev *diag_cdev; -static struct class_device *diag_class_dev; - -int ipath_diag_init (void ) -{ -return ipath_cdev_init (IPATH_DIAG_MINOR ,"ipath_diag" , - &diag_file_ops, &diag_cdev, &diag_class_dev); -} - -void ipath_diag_cleanup (void ) -{ -ipath_cdev_cleanup (&diag_cdev, &diag_class_dev); +int ipath_diag_add (struct ipath_devdata *dd) +{ +char name[16 ]; + +snprintf (name,sizeof (name),"ipath_diag%d" , dd->ipath_unit); + +return ipath_cdev_init (IPATH_DIAG_MINOR_BASE + dd->ipath_unit, name, + &diag_file_ops, &dd->diag_cdev, + &dd->diag_class_dev); +} + +void ipath_diag_remove (struct ipath_devdata *dd) +{ +ipath_cdev_cleanup (&dd->diag_cdev, &dd->diag_class_dev); }/**
@@ -102,8 +104,7 @@ static int ipath_read_umem64(struct ipatint ret;/* not very efficient, but it works for now */ -if (reg_addr < dd->ipath_kregbase || - reg_end > dd->ipath_kregend) { +if (reg_addr < dd->ipath_kregbase || reg_end > dd->ipath_kregend) { ret = -EINVAL ; goto bail; }
@@ -140,8 +141,7 @@ static int ipath_write_umem64(struct ipaint ret;/* not very efficient, but it works for now */ -if (reg_addr < dd->ipath_kregbase || - reg_end > dd->ipath_kregend) { +if (reg_addr < dd->ipath_kregbase || reg_end > dd->ipath_kregend) { ret = -EINVAL ; goto bail; }
@@ -240,59 +240,45 @@ bail:static int ipath_diag_open (struct inode *in,struct file *fp) { +int unit =iminor (in) -IPATH_DIAG_MINOR_BASE ;struct ipath_devdata *dd; -int unit =0 ;/* XXX this is bogus */ -unsigned long flags; -int ret; - - dd =ipath_lookup (unit); +int ret;mutex_lock (&ipath_mutex); -spin_lock_irqsave (&ipath_devs_lock, flags);if (ipath_diag_inuse) { ret = -EBUSY ; goto bail; } -list_for_each_entry (dd, &ipath_dev_list, ipath_list) { -/* -* we need at least one infinipath device to be present -* (don't use INITTED, because we want to be able to open -* even if device is in freeze mode, which cleared INITTED). -* There is a small amount of risk to this, which is why we -* also verify kregbase is set. -*/ - -if (!(dd->ipath_flags &IPATH_PRESENT ) || - !dd->ipath_kregbase) -continue ; - - ipath_diag_inuse =1 ; - diag_set_link =0 ; - ret =0 ; - goto bail; - } - - ret = -ENODEV ; - -bail: -spin_unlock_irqrestore (&ipath_devs_lock, flags); + dd =ipath_lookup (unit); + +if (dd ==NULL || !(dd->ipath_flags &IPATH_PRESENT ) || + !dd->ipath_kregbase) { + ret = -ENODEV ; + goto bail; + } + + fp->private_data = dd; + ipath_diag_inuse =1 ; + diag_set_link =0 ; + ret =0 ;/* Only expose a way to reset the device if we make it into diag mode. */ -if (ret ==0 ) -ipath_expose_reset (&dd->pcidev->dev); - +ipath_expose_reset (&dd->pcidev->dev); + +bail:mutex_unlock (&ipath_mutex);return ret; } -static int ipath_diag_release (struct inode *i,struct file *f) +static int ipath_diag_release (struct inode *in,struct file *fp) {mutex_lock (&ipath_mutex); ipath_diag_inuse =0 ; + fp->private_data =NULL ;mutex_unlock (&ipath_mutex);return 0 ; }
@@ -300,16 +286,9 @@ static ssize_t ipath_diag_read(struct fistatic ssize_t ipath_diag_read (struct file *fp,char __user *data,size_t count,loff_t *off) { -int unit =0 ;/* XXX provide for reads on other units some day */ -struct ipath_devdata *dd; +struct ipath_devdata *dd = fp->private_data;void __iomem *kreg_base;ssize_t ret; - - dd =ipath_lookup (unit); -if (!dd) { - ret = -ENODEV ; - goto bail; - } kreg_base = dd->ipath_kregbase;
@@ -329,23 +308,16 @@ static ssize_t ipath_diag_read(struct fi ret = count; } -bail:return ret; }static ssize_t ipath_diag_write (struct file *fp,const char __user *data,size_t count,loff_t *off) { -int unit =0 ;/* XXX this is bogus */ -struct ipath_devdata *dd; +struct ipath_devdata *dd = fp->private_data;void __iomem *kreg_base;ssize_t ret; - dd =ipath_lookup (unit); -if (!dd) { - ret = -ENODEV ; - goto bail; - } kreg_base = dd->ipath_kregbase;if (count ==0 )
@@ -364,6 +336,5 @@ static ssize_t ipath_diag_write(struct f ret = count; } -bail: -return ret; -} +return ret; +}
drivers/infiniband/hw/ipath/ipath_driver.c +4 -2
@@ -546,6 +546,7 @@ static int __devinit ipath_init_one(struipath_device_create_group (&pdev->dev, dd);ipathfs_add_device (dd);ipath_user_add (dd); +ipath_diag_add (dd);ipath_layer_add (dd); goto bail;
@@ -578,8 +579,9 @@ static void __devexit ipath_remove_one(sreturn ; dd =pci_get_drvdata (pdev); -ipath_layer_del (dd); -ipath_user_del (dd); +ipath_layer_remove (dd); +ipath_diag_remove (dd); +ipath_user_remove (dd);ipathfs_remove_device (dd);ipath_device_remove_group (&pdev->dev, dd); ipath_cdbg(VERBOSE, "Releasing pci memory regions, dd %p, "
drivers/infiniband/hw/ipath/ipath_file_ops.c +11 -21
@@ -1443,16 +1443,16 @@ done:static int ipath_open (struct inode *in,struct file *fp) { -int ret, minor; +int ret, user_minor;mutex_lock (&ipath_mutex); - minor =iminor (in); + user_minor =iminor (in) -IPATH_USER_MINOR_BASE ;ipath_cdbg (VERBOSE ,"open on dev %lx (minor %d)\n" , - (long )in->i_rdev, minor); - -if (minor) - ret =find_free_port (minor -1 , fp); + (long )in->i_rdev, user_minor); + +if (user_minor) + ret =find_free_port (user_minor -1 , fp);else ret =find_best_unit (fp);
@@ -1860,19 +1860,12 @@ int ipath_user_add(struct ipath_devdata "error %d\n", -ret); goto bail; } - ret =ipath_diag_init (); -if (ret <0 ) { -ipath_dev_err (dd,"Unable to set up diag support: " -"error %d\n" , -ret); - goto bail_sma; - } - ret =init_cdev (0 ,"ipath" , &ipath_file_ops, &wildcard_cdev, &wildcard_class_dev);if (ret <0 ) {ipath_dev_err (dd,"Could not create wildcard " "minor: error %d\n" , -ret); - goto bail_diag; + goto bail_sma; }atomic_set (&user_setup,1 );
@@ -1881,31 +1874,28 @@ int ipath_user_add(struct ipath_devdatasnprintf (name,sizeof (name),"ipath%d" , dd->ipath_unit); ret =init_cdev (dd->ipath_unit +1 , name, &ipath_file_ops, - &dd->cdev, &dd->class_dev); + &dd->user_cdev, &dd->user_class_dev);if (ret <0 )ipath_dev_err (dd,"Could not create user minor %d, %s\n" , dd->ipath_unit +1 , name); goto bail; -bail_diag: -ipath_diag_cleanup (); bail_sma:user_cleanup (); bail:return ret; } -void ipath_user_del (struct ipath_devdata *dd) -{ -cleanup_cdev (&dd->cdev, &dd->class_dev); +void ipath_user_remove (struct ipath_devdata *dd) +{ +cleanup_cdev (&dd->user_cdev, &dd->user_class_dev);if (atomic_dec_return (&user_count) ==0 ) {if (atomic_read (&user_setup) ==0 ) goto bail;cleanup_cdev (&wildcard_cdev, &wildcard_class_dev); -ipath_diag_cleanup ();user_cleanup ();atomic_set (&user_setup,0 );
drivers/infiniband/hw/ipath/ipath_kernel.h +11 -8
@@ -355,8 +355,10 @@ struct ipath_devdata {char *ipath_freezemsg;/* pci access data structure */ struct pci_dev *pcidev; -struct cdev *cdev; -struct class_device *class_dev; +struct cdev *user_cdev; +struct cdev *diag_cdev; +struct class_device *user_class_dev; +struct class_device *diag_class_dev;/* timer used to prevent stats overflow, error throttling, etc. */ struct timer_list ipath_stats_timer;/* check for stale messages in rcv queue */
@@ -538,7 +540,7 @@ extern int __ipath_verbs_rcv(struct ipatextern int __ipath_verbs_rcv (struct ipath_devdata *,void *,void *,u32 );void ipath_layer_add (struct ipath_devdata *); -void ipath_layer_del (struct ipath_devdata *); +void ipath_layer_remove (struct ipath_devdata *);int ipath_init_chip (struct ipath_devdata *,int );int ipath_enable_wc (struct ipath_devdata *dd);
@@ -552,14 +554,14 @@ void ipath_cdev_cleanup(struct cdev **cdvoid ipath_cdev_cleanup (struct cdev **cdevp,struct class_device **class_devp); -int ipath_diag_init (void ); -void ipath_diag_cleanup (void ); +int ipath_diag_add (struct ipath_devdata *); +void ipath_diag_remove (struct ipath_devdata *);void ipath_diag_bringup_link (struct ipath_devdata *);extern wait_queue_head_t ipath_sma_state_wait;int ipath_user_add (struct ipath_devdata *dd); -void ipath_user_del (struct ipath_devdata *dd); +void ipath_user_remove (struct ipath_devdata *dd);struct sk_buff *ipath_alloc_skb (struct ipath_devdata *dd,gfp_t );
@@ -843,9 +845,10 @@ extern struct mutex ipath_mutex;#define IPATH_DRV_NAME "ipath_core"#define IPATH_MAJOR 233 +#define IPATH_USER_MINOR_BASE 0#define IPATH_SMA_MINOR 128 -#define IPATH_DIAG_MINOR 129 -#define IPATH_NMINORS 130 +#define IPATH_DIAG_MINOR_BASE 129 +#define IPATH_NMINORS 255#define ipath_dev_err (dd,fmt,...) \ do { \
drivers/infiniband/hw/ipath/ipath_layer.c +1 -1
@@ -404,7 +404,7 @@ void ipath_layer_add(struct ipath_devdatmutex_unlock (&ipath_layer_mutex); } -void ipath_layer_del (struct ipath_devdata *dd) +void ipath_layer_remove (struct ipath_devdata *dd) {mutex_lock (&ipath_layer_mutex);
PATCH 1/1 IB/ipath - use more appropriate gfp flags
In reply to Bryan O'SullivanThis helps us to survive better when memory is fragmented.
drivers/infiniband/hw/ipath/ipath_file_ops.c +14 -12
@@ -705,6 +705,15 @@ static int ipath_create_user_egr(structunsigned e, egrcnt, alloced, egrperchunk, chunk, egrsize, egroff;size_t size;int ret; +gfp_t gfp_flags; + +/* +* GFP_USER, but without GFP_FS, so buffer cache can be +* coalesced (we hope); otherwise, even at order 4, +* heavy filesystem activity makes these fail, and we can +* use compound pages. +*/ + gfp_flags = __GFP_WAIT | __GFP_IO | __GFP_COMP; egrcnt = dd->ipath_rcvegrcnt;/* TID number offset for this port */
@@ -721,10 +730,8 @@ static int ipath_create_user_egr(struct* memory pressure (creating large files and then copying them over * NFS while doing lots of MPI jobs), we hit some allocation * failures, even though we can sleep... (2.6.10) Still get -* failures at 64K. 32K is the lowest we can go without waiting -* more memory again. It seems likely that the coalescing in -* free_pages, etc. still has issues (as it has had previously -* during 2.6.x development). +* failures at 64K. 32K is the lowest we can go without wasting +* additional memory. */ size =0x8000 ; alloced =ALIGN (egrsize * egrcnt, size);
@@ -745,12 +752,6 @@ static int ipath_create_user_egr(struct goto bail_rcvegrbuf; }for (e =0 ; e < pd->port_rcvegrbuf_chunks; e++) { -/* -* GFP_USER, but without GFP_FS, so buffer cache can be -* coalesced (we hope); otherwise, even at order 4, -* heavy filesystem activity makes these fail -*/ -gfp_t gfp_flags = __GFP_WAIT | __GFP_IO | __GFP_COMP; pd->port_rcvegrbuf[e] = dma_alloc_coherent( &dd->pcidev->dev, size, &pd->port_rcvegrbuf_phys[e],
@@ -1167,9 +1168,10 @@ static int ipath_mmap(struct file *fp, s ureg = dd->ipath_uregbase + dd->ipath_palign * pd->port_port; -ipath_cdbg (MM ,"ushare: pgaddr %llx vm_start=%lx, vmlen %lx\n" , +ipath_cdbg (MM ,"pgaddr %llx vm_start=%lx len %lx port %u:%u\n" , (unsigned long long ) pgaddr, vma->vm_start, - vma->vm_end - vma->vm_start); + vma->vm_end - vma->vm_start, dd->ipath_unit, + pd->port_port);if (pgaddr == ureg) ret =mmap_ureg (vma, dd, ureg);
Re: [PATCH 17 of 39] IB/ipath - use more appropriate gfp flags
Quoted 7 lines · Bryan O'Sullivan
diff -r
fd5e733f02ac-r9d943b828776drivers/infiniband/hw/ipath/ipath_file_ops.cdrivers/infiniband/hw/ipath/ipath_file_ops.c +0
-0@@ -705,6 +705,15 @@ static int ipath_create_user_egr(structunsigned e, egrcnt, alloced, egrperchunk, chunk, egrsize, egroff;size_t size;
drivers/infiniband/hw/ipath/ipath_file_ops.c static int ipath_create_user_egr(struct · line 716
Quoted 10 lines
drivers/infiniband/hw/ipath/ipath_file_ops.c +9
-0int ret; +gfp_t gfp_flags; + +/* +* GFP_USER, but without GFP_FS, so buffer cache can be +* coalesced (we hope); otherwise, even at order 4, +* heavy filesystem activity makes these fail, and we can +* use compound pages. +*/ + gfp_flags = __GFP_WAIT | __GFP_IO | __GFP_COMP;
Yes, GFP_NOFS|_GFP_COMP is reasonably strong - we can do swapout but not file pageout.
I expect you'll find that a full GFP_KERNEL is OK here. The ~__GFP_FS is used to prevent the vm scanner from calling into ->writepage() and getting stuck on locks which the __alloc_pages() caller already holds.
But ipathfs doesn't even implement ->writepage(), so I don't see any problem with setting __GFP_FS. If you're getting into trouble there then I'd recommend giving it a try - it will make memory reclaim more successful, especially with ext3, where a ->writepage often cleans the page synchronously without doing any IO.
That being said, order-4 allocations will be fairly reliably unreliable.
PATCH 1/1 IB/ipath - RC receive interrupt performance changes
In reply to Bryan O'SullivanThis patch separates QP state used for sending and receiving RC packets so the processing in the receive interrupt handler can be done mostly without locks being held. ACK packets are now sent without requiring synchronization with the send tasklet.
drivers/infiniband/hw/ipath/ipath_keys.c +30 -24
@@ -121,6 +121,7 @@ int ipath_lkey_ok(struct ipath_lkey_tabl struct ib_sge *sge, int acc) {struct ipath_mregion *mr; +unsigned n, m;size_t off;int ret;
@@ -152,20 +153,22 @@ int ipath_lkey_ok(struct ipath_lkey_tabl } off += mr->offset; + m =0 ; + n =0 ; +while (off >= mr->map[m]->segs[n].length) { + off -= mr->map[m]->segs[n].length; + n++; +if (n >=IPATH_SEGSZ ) { + m++; + n =0 ; + } + } isge->mr = mr; - isge->m =0 ; - isge->n =0 ; -while (off >= mr->map[isge->m]->segs[isge->n].length) { - off -= mr->map[isge->m]->segs[isge->n].length; - isge->n++; -if (isge->n >=IPATH_SEGSZ ) { - isge->m++; - isge->n =0 ; - } - } - isge->vaddr = mr->map[isge->m]->segs[isge->n].vaddr + off; - isge->length = mr->map[isge->m]->segs[isge->n].length - off; + isge->vaddr = mr->map[m]->segs[n].vaddr + off; + isge->length = mr->map[m]->segs[n].length - off; isge->sge_length = sge->length; + isge->m = m; + isge->n = n; ret =1 ;
@@ -190,6 +193,7 @@ int ipath_rkey_ok(struct ipath_ibdev *destruct ipath_lkey_table *rkt = &dev->lk_table;struct ipath_sge *sge = &ss->sge;struct ipath_mregion *mr; +unsigned n, m;size_t off;int ret;
@@ -207,20 +211,22 @@ int ipath_rkey_ok(struct ipath_ibdev *de } off += mr->offset; + m =0 ; + n =0 ; +while (off >= mr->map[m]->segs[n].length) { + off -= mr->map[m]->segs[n].length; + n++; +if (n >=IPATH_SEGSZ ) { + m++; + n =0 ; + } + } sge->mr = mr; - sge->m =0 ; - sge->n =0 ; -while (off >= mr->map[sge->m]->segs[sge->n].length) { - off -= mr->map[sge->m]->segs[sge->n].length; - sge->n++; -if (sge->n >=IPATH_SEGSZ ) { - sge->m++; - sge->n =0 ; - } - } - sge->vaddr = mr->map[sge->m]->segs[sge->n].vaddr + off; - sge->length = mr->map[sge->m]->segs[sge->n].length - off; + sge->vaddr = mr->map[m]->segs[n].vaddr + off; + sge->length = mr->map[m]->segs[n].length - off; sge->sge_length = len; + sge->m = m; + sge->n = n; ss->sg_list =NULL ; ss->num_sge =1 ;
drivers/infiniband/hw/ipath/ipath_qp.c +19 -32
120 lines not on this page · raw message
drivers/infiniband/hw/ipath/ipath_rc.c +207 -196
645 lines not on this page · raw message
drivers/infiniband/hw/ipath/ipath_ruc.c +18 -21
@@ -113,20 +113,23 @@ void ipath_insert_rnr_queue(struct ipath* * Return 0 if no RWQE is available, otherwise return 1. * -* Called at interrupt level with the QP r_rq.lock held. +* Can be called from interrupt level. */ int ipath_get_rwqe (struct ipath_qp *qp,int wr_id_only) { +unsigned long flags;struct ipath_rq *rq;struct ipath_srq *srq;struct ipath_rwqe *wqe; -int ret; +int ret =1 ;if (!qp->ibqp.srq) { rq = &qp->r_rq; +spin_lock_irqsave (&rq->lock, flags); +if (unlikely (rq->tail == rq->head)) { ret =0 ; - goto bail; + goto done; } wqe =get_rwqe_ptr (rq, rq->tail); qp->r_wr_id = wqe->wr_id;
@@ -138,17 +141,16 @@ int ipath_get_rwqe(struct ipath_qp *qp, }if (++rq->tail >= rq->size) rq->tail =0 ; - ret =1 ; - goto bail; + goto done; } srq =to_isrq (qp->ibqp.srq); rq = &srq->rq; -spin_lock (&rq->lock); +spin_lock_irqsave (&rq->lock, flags); +if (unlikely (rq->tail == rq->head)) { -spin_unlock (&rq->lock); ret =0 ; - goto bail; + goto done; } wqe =get_rwqe_ptr (rq, rq->tail); qp->r_wr_id = wqe->wr_id;
@@ -170,18 +172,18 @@ int ipath_get_rwqe(struct ipath_qp *qp, n = rq->head - rq->tail;if (n < srq->limit) { srq->limit =0 ; -spin_unlock (&rq->lock); +spin_unlock_irqrestore (&rq->lock, flags); ev.device = qp->ibqp.device; ev.element.srq = qp->ibqp.srq; ev.event =IB_EVENT_SRQ_LIMIT_REACHED ; srq->ibsrq.event_handler (&ev, srq->ibsrq.srq_context); - }else -spin_unlock (&rq->lock); - }else -spin_unlock (&rq->lock); - ret =1 ; - + goto bail; + } + } + +done: +spin_unlock_irqrestore (&rq->lock, flags); bail:return ret; }
@@ -248,10 +250,8 @@ again: wc.imm_data = wqe->wr.imm_data;/* FALLTHROUGH */ case IB_WR_SEND : -spin_lock_irqsave (&qp->r_rq.lock, flags);if (!ipath_get_rwqe (qp,0 )) { rnr_nak: -spin_unlock_irqrestore (&qp->r_rq.lock, flags);/* Handle RNR NAK */ if (qp->ibqp.qp_type ==IB_QPT_UC ) goto send_comp;
@@ -263,20 +263,17 @@ again: sqp->s_rnr_retry--; dev->n_rnr_naks++; sqp->s_rnr_timeout = - ib_ipath_rnr_table[sqp->s_min_rnr_timer]; + ib_ipath_rnr_table[sqp->r_min_rnr_timer];ipath_insert_rnr_queue (sqp); goto done; } -spin_unlock_irqrestore (&qp->r_rq.lock, flags);break ;case IB_WR_RDMA_WRITE_WITH_IMM : wc.wc_flags =IB_WC_WITH_IMM ; wc.imm_data = wqe->wr.imm_data; -spin_lock_irqsave (&qp->r_rq.lock, flags);if (!ipath_get_rwqe (qp,1 )) goto rnr_nak; -spin_unlock_irqrestore (&qp->r_rq.lock, flags);/* FALLTHROUGH */ case IB_WR_RDMA_WRITE :if (wqe->length ==0 )
drivers/infiniband/hw/ipath/ipath_uc.c +1 -8
@@ -241,7 +241,6 @@ void ipath_uc_rcv(struct ipath_ibdev *deu32 hdrsize;u32 psn;u32 pad; -unsigned long flags;struct ib_wc wc;u32 pmtu =ib_mtu_enum_to_int (qp->path_mtu);struct ib_reth *reth;
@@ -279,8 +278,6 @@ void ipath_uc_rcv(struct ipath_ibdev *de wc.imm_data =0 ; wc.wc_flags =0 ; -spin_lock_irqsave (&qp->r_rq.lock, flags); -/* Compare the PSN verses the expected PSN. */ if (unlikely (ipath_cmp24 (psn, qp->r_psn) !=0 )) {/*
@@ -537,15 +534,11 @@ void ipath_uc_rcv(struct ipath_ibdev *dedefault :/* Drop packet for unknown opcodes. */ -spin_unlock_irqrestore (&qp->r_rq.lock, flags); dev->n_pkt_drops++; - goto bail; + goto done; } qp->r_psn++; qp->r_state = opcode; done: -spin_unlock_irqrestore (&qp->r_rq.lock, flags); - -bail:return ; }
drivers/infiniband/hw/ipath/ipath_verbs.h +7 -5
@@ -307,32 +307,34 @@ struct ipath_qp {u32 s_next_psn;/* PSN for next request */ u32 s_last_psn;/* last response PSN processed */ u32 s_psn;/* current packet sequence number */ +u32 s_ack_psn;/* PSN for RDMA_READ */ u32 s_rnr_timeout;/* number of milliseconds for RNR timeout */ -u32 s_ack_psn;/* PSN for next ACK or RDMA_READ */ -u64 s_ack_atomic;/* data for atomic ACK */ +u32 r_ack_psn;/* PSN for next ACK or atomic ACK */ u64 r_wr_id;/* ID for current receive WQE */ u64 r_atomic_data;/* data for last atomic op */ u32 r_atomic_psn;/* PSN of last atomic op */ u32 r_len;/* total length of r_sge */ u32 r_rcv_len;/* receive data len processed */ u32 r_psn;/* expected rcv packet sequence number */ +u32 r_msn;/* message sequence number */ u8 state;/* QP state */ u8 s_state;/* opcode of last packet sent */ u8 s_ack_state;/* opcode of packet to ACK */ u8 s_nak_state;/* non-zero if NAK is pending */ u8 r_state;/* opcode of last packet received */ +u8 r_ack_state;/* opcode of packet to ACK */ +u8 r_nak_state;/* non-zero if NAK is pending */ +u8 r_min_rnr_timer;/* retry timeout value for RNR NAKs */ u8 r_reuse_sge;/* for UC receive errors */ u8 r_sge_inx;/* current index into sg_list */ +u8 qp_access_flags;u8 s_max_sge;/* size of s_wq->sg_list */ -u8 qp_access_flags;u8 s_retry_cnt;/* number of times to retry */ u8 s_rnr_retry_cnt; -u8 s_min_rnr_timer;u8 s_retry;/* requester retry counter */ u8 s_rnr_retry;/* requester RNR retry counter */ u8 s_pkey_index;/* PKEY index to use */ enum ib_mtu path_mtu; -atomic_t msn;/* message sequence number */ u32 remote_qpn;u32 qkey;/* QKEY for this QP (for UD or RD) */ u32 s_size;/* send work queue size */
PATCH 1/1 IB/ipath - drop the "stats" sysfs attribute group
In reply to Bryan O'SullivanThis attribute group made it into the original driver, but should not have.
drivers/infiniband/hw/ipath/ipath_sysfs.c +1 -84
@@ -84,81 +84,6 @@ static ssize_t show_num_units(struct devreturn scnprintf (buf,PAGE_SIZE ,"%d\n" ,ipath_count_units (NULL ,NULL ,NULL )); } - -#define DRIVER_STAT (name, attr) \ - static ssize_t show_stat_##name(struct device_driver *dev, \ - char *buf) \ - { \ - return scnprintf( \ - buf, PAGE_SIZE, "%llu\n", \ - (unsigned long long) ipath_stats.sps_ ##attr); \ - } \ - static DRIVER_ATTR(name, S_IRUGO, show_stat_##name, NULL) - -DRIVER_STAT (intrs, ints); -DRIVER_STAT (err_intrs, errints); -DRIVER_STAT (errs, errs); -DRIVER_STAT (pkt_errs, pkterrs); -DRIVER_STAT (crc_errs, crcerrs); -DRIVER_STAT (hw_errs, hwerrs); -DRIVER_STAT (ib_link, iblink); -DRIVER_STAT (port0_pkts, port0pkts); -DRIVER_STAT (ether_spkts, ether_spkts); -DRIVER_STAT (ether_rpkts, ether_rpkts); -DRIVER_STAT (sma_spkts, sma_spkts); -DRIVER_STAT (sma_rpkts, sma_rpkts); -DRIVER_STAT (hdrq_full, hdrqfull); -DRIVER_STAT (etid_full, etidfull); -DRIVER_STAT (no_piobufs, nopiobufs); -DRIVER_STAT (ports, ports); -DRIVER_STAT (pkey0, pkeys[0 ]); -DRIVER_STAT (pkey1, pkeys[1 ]); -DRIVER_STAT (pkey2, pkeys[2 ]); -DRIVER_STAT (pkey3, pkeys[3 ]); - -DRIVER_STAT (nports, nports); -DRIVER_STAT (null_intr, nullintr); -DRIVER_STAT (max_pkts_call, maxpkts_call); -DRIVER_STAT (avg_pkts_call, avgpkts_call); -DRIVER_STAT (page_locks, pagelocks); -DRIVER_STAT (page_unlocks, pageunlocks); -DRIVER_STAT (krdrops, krdrops); - -static struct attribute *driver_stat_attributes[] = { - &driver_attr_intrs.attr, - &driver_attr_err_intrs.attr, - &driver_attr_errs.attr, - &driver_attr_pkt_errs.attr, - &driver_attr_crc_errs.attr, - &driver_attr_hw_errs.attr, - &driver_attr_ib_link.attr, - &driver_attr_port0_pkts.attr, - &driver_attr_ether_spkts.attr, - &driver_attr_ether_rpkts.attr, - &driver_attr_sma_spkts.attr, - &driver_attr_sma_rpkts.attr, - &driver_attr_hdrq_full.attr, - &driver_attr_etid_full.attr, - &driver_attr_no_piobufs.attr, - &driver_attr_ports.attr, - &driver_attr_pkey0.attr, - &driver_attr_pkey1.attr, - &driver_attr_pkey2.attr, - &driver_attr_pkey3.attr, - &driver_attr_nports.attr, - &driver_attr_null_intr.attr, - &driver_attr_max_pkts_call.attr, - &driver_attr_avg_pkts_call.attr, - &driver_attr_page_locks.attr, - &driver_attr_page_unlocks.attr, - &driver_attr_krdrops.attr, -NULL -}; - -static struct attribute_group driver_stat_attr_group = { - .name ="stats" , - .attrs = driver_stat_attributes -}; static ssize_t show_status(struct device *dev, struct device_attribute *attr,
@@ -716,20 +641,12 @@ int ipath_driver_create_group(struct devint ret; ret =sysfs_create_group (&drv->kobj, &driver_attr_group); -if (ret) - goto bail; - - ret =sysfs_create_group (&drv->kobj, &driver_stat_attr_group); -if (ret) -sysfs_remove_group (&drv->kobj, &driver_attr_group); - -bail: +return ret; }void ipath_driver_remove_group (struct device_driver *drv) { -sysfs_remove_group (&drv->kobj, &driver_stat_attr_group);sysfs_remove_group (&drv->kobj, &driver_attr_group); }
PATCH 1/1 IB/ipath - namespace cleanup: replace ips with ipath
In reply to Bryan O'SullivanRemove ips namespace from infinipath drivers. This renames ips_common.h to ipath_common.h. Definitions, data structures, etc. that were not used by kernel modules have moved to user-only headers. All names including ips have been renamed to ipath. Some names have had an ipath prefix added.
drivers/infiniband/hw/ipath/ipath_common.h +114 -9
@@ -39,7 +39,8 @@* to communicate between kernel and user code. */ -/* This is the IEEE-assigned OUI for QLogic, Inc. InfiniPath */ + +/* This is the IEEE-assigned OUI for QLogic Inc. InfiniPath */ #define IPATH_SRC_OUI_1 0x00#define IPATH_SRC_OUI_2 0x11#define IPATH_SRC_OUI_3 0x75
@@ -343,9 +344,9 @@ struct ipath_base_info {/* * Similarly, this is the kernel version going back to the user. It's * slightly different, in that we want to tell if the driver was built as -* part of a QLogic release, or from the driver from OpenIB, kernel.org, -* or a standard distribution, for support reasons. The high bit is 0 for -* non-QLogic, and 1 for QLogic-built/supplied. +* part of a QLogic release, or from the driver from openfabrics.org, +* kernel.org, or a standard distribution, for support reasons. +* The high bit is 0 for non-QLogic and 1 for QLogic-built/supplied. * * It's returned by the driver to the user code during initialization in the * spi_sw_version field of ipath_base_info, so the user code can in turn
@@ -600,14 +601,118 @@ struct infinipath_counters {#define INFINIPATH_KPF_INTR 0x1/* SendPIO per-buffer control */ -#define INFINIPATH_SP_LENGTHP1_MASK 0x3FF -#define INFINIPATH_SP_LENGTHP1_SHIFT 0 -#define INFINIPATH_SP_INTR 0x80000000 -#define INFINIPATH_SP_TEST 0x40000000 -#define INFINIPATH_SP_TESTEBP 0x20000000 +#define INFINIPATH_SP_TEST 0x40 +#define INFINIPATH_SP_TESTEBP 0x20/* SendPIOAvail bits */ #define INFINIPATH_SENDPIOAVAIL_BUSY_SHIFT 1#define INFINIPATH_SENDPIOAVAIL_CHECK_SHIFT 0 +/* infinipath header format */ +struct ipath_header { +/* +* Version - 4 bits, Port - 4 bits, TID - 10 bits and Offset - +* 14 bits before ECO change ~28 Dec 03. After that, Vers 4, +* Port 3, TID 11, offset 14. +*/ +__le32 ver_port_tid_offset; +__le16 chksum; +__le16 pkt_flags; +}; + +/* infinipath user message header format. +* This structure contains the first 4 fields common to all protocols +* that employ infinipath. +*/ +struct ipath_message_header { +__be16 lrh[4 ]; +__be32 bth[3 ]; +/* fields below this point are in host byte order */ +struct ipath_header iph; +__u8 sub_opcode; +}; + +/* infinipath ethernet header format */ +struct ether_header { +__be16 lrh[4 ]; +__be32 bth[3 ]; +struct ipath_header iph; +__u8 sub_opcode; +__u8 cmd; +__be16 lid; +__u16 mac[3 ]; +__u8 frag_num; +__u8 seq_num; +__le32 len; +/* MUST be of word size due to PIO write requirements */ +__le32 csum; +__le16 csum_offset; +__le16 flags; +__u16 first_2_bytes; +__u8 unused[2 ];/* currently unused */ +}; + + +/* IB - LRH header consts */ +#define IPATH_LRH_GRH 0x0003/* 1. word of IB LRH - next header: GRH */ +#define IPATH_LRH_BTH 0x0002/* 1. word of IB LRH - next header: BTH */ + +/* misc. */ +#define SIZE_OF_CRC 1 + +#define IPATH_DEFAULT_P_KEY 0xFFFF +#define IPATH_PERMISSIVE_LID 0xFFFF +#define IPATH_AETH_CREDIT_SHIFT 24 +#define IPATH_AETH_CREDIT_MASK 0x1F +#define IPATH_AETH_CREDIT_INVAL 0x1F +#define IPATH_PSN_MASK 0xFFFFFF +#define IPATH_MSN_MASK 0xFFFFFF +#define IPATH_QPN_MASK 0xFFFFFF +#define IPATH_MULTICAST_LID_BASE 0xC000 +#define IPATH_MULTICAST_QPN 0xFFFFFF + +/* Receive Header Queue: receive type (from infinipath) */ +#define RCVHQ_RCV_TYPE_EXPECTED 0 +#define RCVHQ_RCV_TYPE_EAGER 1 +#define RCVHQ_RCV_TYPE_NON_KD 2 +#define RCVHQ_RCV_TYPE_ERROR 3 + + +/* sub OpCodes - ith4x */ +#define IPATH_ITH4X_OPCODE_ENCAP 0x81 +#define IPATH_ITH4X_OPCODE_LID_ARP 0x82 + +#define IPATH_HEADER_QUEUE_WORDS 9 + +/* functions for extracting fields from rcvhdrq entries for the driver. +*/ +static inline __u32 ipath_hdrget_err_flags (const __le32 * rbuf) +{ +return __le32_to_cpu (rbuf[1 ]); +} + +static inline __u32 ipath_hdrget_rcv_type (const __le32 * rbuf) +{ +return (__le32_to_cpu (rbuf[0 ]) >>INFINIPATH_RHF_RCVTYPE_SHIFT ) + &INFINIPATH_RHF_RCVTYPE_MASK ; +} + +static inline __u32 ipath_hdrget_length_in_bytes (const __le32 * rbuf) +{ +return ((__le32_to_cpu (rbuf[0 ]) >>INFINIPATH_RHF_LENGTH_SHIFT ) + &INFINIPATH_RHF_LENGTH_MASK ) <<2 ; +} + +static inline __u32 ipath_hdrget_index (const __le32 * rbuf) +{ +return (__le32_to_cpu (rbuf[0 ]) >>INFINIPATH_RHF_EGRINDEX_SHIFT ) + &INFINIPATH_RHF_EGRINDEX_MASK ; +} + +static inline __u32 ipath_hdrget_ipath_ver (__le32 hdrword) +{ +return (__le32_to_cpu (hdrword) >>INFINIPATH_I_VERS_SHIFT ) + &INFINIPATH_I_VERS_MASK ; +} +#endif /* _IPATH_COMMON_H */
drivers/infiniband/hw/ipath/ipath_diag.c +2 -3
@@ -44,10 +44,9 @@#include <linux/pci.h> #include <asm/uaccess.h> +#include "ipath_kernel.h" +#include "ipath_layer.h" #include "ipath_common.h" -#include "ipath_kernel.h" -#include "ips_common.h" -#include "ipath_layer.h" int ipath_diag_inuse;static int diag_set_link;
drivers/infiniband/hw/ipath/ipath_driver.c +12 -11
@@ -39,8 +39,8 @@#include <linux/vmalloc.h> #include "ipath_kernel.h" -#include "ips_common.h" #include "ipath_layer.h" +#include "ipath_common.h" static void ipath_update_pio_bufs (struct ipath_devdata *);
@@ -823,7 +823,8 @@ static void ipath_rcv_layer(struct ipathu8 pad, *bthbytes;struct sk_buff *skb, *nskb; -if (dd->ipath_port0_skbs && hdr->sub_opcode ==OPCODE_ENCAP ) { +if (dd->ipath_port0_skbs && + hdr->sub_opcode ==IPATH_ITH4X_OPCODE_ENCAP ) {/* * Allocate a new sk_buff to replace the one we give * to the network stack.
@@ -854,7 +855,7 @@ static void ipath_rcv_layer(struct ipath/* another ether packet received */ ipath_stats.sps_ether_rpkts++; } -else if (hdr->sub_opcode ==OPCODE_LID_ARP ) +else if (hdr->sub_opcode ==IPATH_ITH4X_OPCODE_LID_ARP )__ipath_layer_rcv_lid (dd, hdr); }
@@ -871,7 +872,7 @@ void ipath_kreceive(struct ipath_devdataconst u32 rsize = dd->ipath_rcvhdrentsize;/* words */ const u32 maxcnt = dd->ipath_rcvhdrcnt * rsize;/* words */ u32 etail =-1 , l, hdrqtail; -struct ips_message_header *hdr; +struct ipath_message_header *hdr;u32 eflags, i, etype, tlen, pkttot =0 , updegr=0 , reloop=0 ;static u64 totcalls;/* stats, may eventually remove */ char emsg[128 ];
@@ -897,7 +898,7 @@ reloop:u8 *bthbytes; rc = (u64 *) (dd->ipath_pd[0 ]->port_rcvhdrq + (l <<2 )); - hdr = (struct ips_message_header *)&rc[1 ]; + hdr = (struct ipath_message_header *)&rc[1 ];/* * could make a network order version of IPATH_KD_QP, and * do the obvious shift before masking to speed this up.
@@ -905,10 +906,10 @@ reloop: qp =ntohl (hdr->bth[1 ]) &0xffffff ; bthbytes = (u8 *) hdr->bth; - eflags =ips_get_hdr_err_flags ((__le32 *) rc); - etype =ips_get_rcv_type ((__le32 *) rc); + eflags =ipath_hdrget_err_flags ((__le32 *) rc); + etype =ipath_hdrget_rcv_type ((__le32 *) rc);/* total length */ - tlen =ips_get_length_in_bytes ((__le32 *) rc); + tlen =ipath_hdrget_length_in_bytes ((__le32 *) rc); ebuf =NULL ;if (etype !=RCVHQ_RCV_TYPE_EXPECTED ) {/*
@@ -918,7 +919,7 @@ reloop:* set ebuf (so we try to copy data) unless the * length requires it. */ - etail =ips_get_index ((__le32 *) rc); + etail =ipath_hdrget_index ((__le32 *) rc);if (tlen >sizeof (*hdr) || etype ==RCVHQ_RCV_TYPE_NON_KD ) ebuf =ipath_get_egrbuf (dd, etail,0 );
@@ -930,7 +931,7 @@ reloop:*/ if (etype !=RCVHQ_RCV_TYPE_NON_KD && etype != -RCVHQ_RCV_TYPE_ERROR &&ips_get_ipath_ver ( +RCVHQ_RCV_TYPE_ERROR &&ipath_hdrget_ipath_ver ( hdr->iph.ver_port_tid_offset) !=IPS_PROTO_VERSION ) { ipath_cdbg(PKT, "Bad InfiniPath protocol version "
@@ -943,7 +944,7 @@ reloop:ipath_cdbg (PKT ,"RHFerrs %x hdrqtail=%x typ=%u " "tlen=%x opcode=%x egridx=%x: %s\n" , eflags, l, etype, tlen, bthbytes[0 ], -ips_get_index ((__le32 *) rc), emsg); +ipath_hdrget_index ((__le32 *) rc), emsg);/* Count local link integrity errors. */ if (eflags & (INFINIPATH_RHF_H_ICRCERR |INFINIPATH_RHF_H_VCRCERR )) {
drivers/infiniband/hw/ipath/ipath_file_ops.c +2 -2
@@ -39,8 +39,8 @@#include <asm/pgtable.h> #include "ipath_kernel.h" -#include "ips_common.h" #include "ipath_layer.h" +#include "ipath_common.h" static int ipath_open (struct inode *,struct file *);static int ipath_close (struct inode *,struct file *);
@@ -458,7 +458,7 @@ static int ipath_set_part_key(struct ipau16 lkey = key &0x7FFF ;int ret; -if (lkey == (IPS_DEFAULT_P_KEY &0x7FFF )) { +if (lkey == (IPATH_DEFAULT_P_KEY &0x7FFF )) {/* nothing to do; this key always valid */ ret =0 ; goto bail;
drivers/infiniband/hw/ipath/ipath_init_chip.c +2 -2
@@ -36,7 +36,7 @@#include <linux/vmalloc.h> #include "ipath_kernel.h" -#include "ips_common.h" +#include "ipath_common.h" /* * min buffers we want to have per port, after driver
@@ -277,7 +277,7 @@ static int init_chip_first(struct ipath_ pd->port_port =0 ; pd->port_cnt =1 ;/* The port 0 pkey table is used by the layer interface. */ - pd->port_pkeys[0 ] =IPS_DEFAULT_P_KEY ; + pd->port_pkeys[0 ] =IPATH_DEFAULT_P_KEY ; dd->ipath_rcvtidcnt =ipath_read_kreg32 (dd, dd->ipath_kregs->kr_rcvtidcnt); dd->ipath_rcvtidbase =
drivers/infiniband/hw/ipath/ipath_intr.c +1 -1
@@ -34,8 +34,8 @@#include <linux/pci.h> #include "ipath_kernel.h" -#include "ips_common.h" #include "ipath_layer.h" +#include "ipath_common.h" /* These are all rcv-related errors which we want to count for stats */ #define E_SUM_PKTERRS \
drivers/infiniband/hw/ipath/ipath_layer.c +4 -4
@@ -41,8 +41,8 @@#include <asm/byteorder.h> #include "ipath_kernel.h" -#include "ips_common.h" #include "ipath_layer.h" +#include "ipath_common.h" /* Acquire before ipath_devs_lock. */ static DEFINE_MUTEX (ipath_layer_mutex);
@@ -622,7 +622,7 @@ int ipath_layer_open(struct ipath_devdat goto bail; } - ret =ipath_setrcvhdrsize (dd,NUM_OF_EXTRA_WORDS_IN_HEADER_QUEUE ); + ret =ipath_setrcvhdrsize (dd,IPATH_HEADER_QUEUE_WORDS );if (ret <0 ) goto bail;
@@ -1106,10 +1106,10 @@ int ipath_layer_send_hdr(struct ipath_de } vlsllnh = *((__be16 *) hdr); -if (vlsllnh !=htons (IPS_LRH_BTH )) { +if (vlsllnh !=htons (IPATH_LRH_BTH )) {ipath_dbg ("Warning: lrh[0] wrong (%x, not %x); " "not sending\n" ,be16_to_cpu (vlsllnh), -IPS_LRH_BTH ); +IPATH_LRH_BTH ); ret = -EINVAL ; }if (ret)
drivers/infiniband/hw/ipath/ipath_mad.c +3 -3
@@ -35,7 +35,7 @@#include "ipath_kernel.h" #include "ipath_verbs.h" -#include "ips_common.h" +#include "ipath_common.h" #define IB_SMP_UNSUP_VERSION __constant_htons(0x0004)#define IB_SMP_UNSUP_METHOD __constant_htons(0x0008)
@@ -306,7 +306,7 @@ static int recv_subn_set_portinfo(struct lid =be16_to_cpu (pip->lid);if (lid !=ipath_layer_get_lid (dev->dd)) {/* Must be a valid unicast LID address. */ -if (lid ==0 || lid >=IPS_MULTICAST_LID_BASE ) +if (lid ==0 || lid >=IPATH_MULTICAST_LID_BASE ) goto err;ipath_set_lid (dev->dd, lid, pip->mkeyprot_resv_lmc &7 ); event.event =IB_EVENT_LID_CHANGE ;
@@ -316,7 +316,7 @@ static int recv_subn_set_portinfo(struct smlid =be16_to_cpu (pip->sm_lid);if (smlid != dev->sm_lid) {/* Must be a valid unicast LID address. */ -if (smlid ==0 || smlid >=IPS_MULTICAST_LID_BASE ) +if (smlid ==0 || smlid >=IPATH_MULTICAST_LID_BASE ) goto err; dev->sm_lid = smlid; event.event =IB_EVENT_SM_CHANGE ;
drivers/infiniband/hw/ipath/ipath_qp.c +8 -8
@@ -35,7 +35,7 @@#include <linux/vmalloc.h> #include "ipath_verbs.h" -#include "ips_common.h" +#include "ipath_common.h" #define BITS_PER_PAGE (PAGE_SIZE*BITS_PER_BYTE)#define BITS_PER_PAGE_MASK (BITS_PER_PAGE-1)
@@ -450,7 +450,7 @@ int ipath_modify_qp(struct ib_qp *ibqp,if (attr_mask &IB_QP_AV )if (attr->ah_attr.dlid ==0 || - attr->ah_attr.dlid >=IPS_MULTICAST_LID_BASE ) + attr->ah_attr.dlid >=IPATH_MULTICAST_LID_BASE ) goto inval;if (attr_mask &IB_QP_PKEY_INDEX )
@@ -585,14 +585,14 @@ int ipath_query_qp(struct ib_qp *ibqp, s*/ __be32 ipath_compute_aeth (struct ipath_qp *qp) { -u32 aeth = qp->r_msn &IPS_MSN_MASK ; +u32 aeth = qp->r_msn &IPATH_MSN_MASK ;if (qp->ibqp.srq) {/* * Shared receive queues don't generate credits. * Set the credit field to the invalid value. */ - aeth |=IPS_AETH_CREDIT_INVAL <<IPS_AETH_CREDIT_SHIFT ; + aeth |=IPATH_AETH_CREDIT_INVAL <<IPATH_AETH_CREDIT_SHIFT ; }else {u32 min, max, x;u32 credits;
@@ -622,7 +622,7 @@ __be32 ipath_compute_aeth(struct ipath_qelse min = x; } - aeth |= x <<IPS_AETH_CREDIT_SHIFT ; + aeth |= x <<IPATH_AETH_CREDIT_SHIFT ; }return cpu_to_be32 (aeth); }
@@ -888,18 +888,18 @@ void ipath_sqerror_qp(struct ipath_qp *q*/ void ipath_get_credit (struct ipath_qp *qp,u32 aeth) { -u32 credit = (aeth >>IPS_AETH_CREDIT_SHIFT ) &IPS_AETH_CREDIT_MASK ; +u32 credit = (aeth >>IPATH_AETH_CREDIT_SHIFT ) &IPATH_AETH_CREDIT_MASK ;/* * If the credit is invalid, we can send * as many packets as we like. Otherwise, we have to * honor the credit field. */ -if (credit ==IPS_AETH_CREDIT_INVAL ) +if (credit ==IPATH_AETH_CREDIT_INVAL ) qp->s_lsn = (u32) -1 ;else if (qp->s_lsn != (u32) -1 ) {/* Compute new LSN (i.e., MSN + credit) */ - credit = (aeth + credit_table[credit]) &IPS_MSN_MASK ; + credit = (aeth + credit_table[credit]) &IPATH_MSN_MASK ;if (ipath_cmp24 (credit, qp->s_lsn) >0 ) qp->s_lsn = credit; }
drivers/infiniband/hw/ipath/ipath_rc.c +20 -20
@@ -32,7 +32,7 @@*/ #include "ipath_verbs.h" -#include "ips_common.h" +#include "ipath_common.h" /* cut down ridiculously long IB macro names */ #define OP (x) IB_OPCODE_RC_##x
@@ -49,7 +49,7 @@ static void ipath_init_restart(struct ipstruct ipath_ibdev *dev;u32 len; - len = ((qp->s_psn - wqe->psn) &IPS_PSN_MASK ) * + len = ((qp->s_psn - wqe->psn) &IPATH_PSN_MASK ) *ib_mtu_enum_to_int (qp->path_mtu); qp->s_sge.sge = wqe->sg_list[0 ]; qp->s_sge.sg_list = wqe->sg_list +1 ;
@@ -159,9 +159,9 @@ u32 ipath_make_rc_ack(struct ipath_qp *q qp->s_ack_state =OP (RDMA_READ_RESPONSE_LAST ); bth0 =OP (ACKNOWLEDGE ) <<24 ;if (qp->s_nak_state) - ohdr->u.aeth =cpu_to_be32 ((qp->r_msn &IPS_MSN_MASK ) | + ohdr->u.aeth =cpu_to_be32 ((qp->r_msn &IPATH_MSN_MASK ) | (qp->s_nak_state << -IPS_AETH_CREDIT_SHIFT )); +IPATH_AETH_CREDIT_SHIFT ));else ohdr->u.aeth =ipath_compute_aeth (qp); hwords++;
@@ -361,7 +361,7 @@ int ipath_make_rc_req(struct ipath_qp *qif (qp->s_tail >= qp->s_size) qp->s_tail =0 ; } - bth2 |= qp->s_psn++ &IPS_PSN_MASK ; + bth2 |= qp->s_psn++ &IPATH_PSN_MASK ;if ((int )(qp->s_psn - qp->s_next_psn) >0 ) qp->s_next_psn = qp->s_psn;/*
@@ -387,7 +387,7 @@ int ipath_make_rc_req(struct ipath_qp *q qp->s_state =OP (SEND_MIDDLE );/* FALLTHROUGH */ case OP (SEND_MIDDLE ): - bth2 = qp->s_psn++ &IPS_PSN_MASK ; + bth2 = qp->s_psn++ &IPATH_PSN_MASK ;if ((int )(qp->s_psn - qp->s_next_psn) >0 ) qp->s_next_psn = qp->s_psn; ss = &qp->s_sge;
@@ -429,7 +429,7 @@ int ipath_make_rc_req(struct ipath_qp *q qp->s_state =OP (RDMA_WRITE_MIDDLE );/* FALLTHROUGH */ case OP (RDMA_WRITE_MIDDLE ): - bth2 = qp->s_psn++ &IPS_PSN_MASK ; + bth2 = qp->s_psn++ &IPATH_PSN_MASK ;if ((int )(qp->s_psn - qp->s_next_psn) >0 ) qp->s_next_psn = qp->s_psn; ss = &qp->s_sge;
@@ -466,7 +466,7 @@ int ipath_make_rc_req(struct ipath_qp *q* See ipath_restart_rc(). */ ipath_init_restart (qp, wqe); - len = ((qp->s_psn - wqe->psn) &IPS_PSN_MASK ) * pmtu; + len = ((qp->s_psn - wqe->psn) &IPATH_PSN_MASK ) * pmtu; ohdr->u.rc.reth.vaddr =cpu_to_be64 (wqe->wr.wr.rdma.remote_addr + len); ohdr->u.rc.reth.rkey =
@@ -474,7 +474,7 @@ int ipath_make_rc_req(struct ipath_qp *q ohdr->u.rc.reth.length =cpu_to_be32 (qp->s_len); qp->s_state =OP (RDMA_READ_REQUEST ); hwords +=sizeof (ohdr->u.rc.reth) /4 ; - bth2 = qp->s_psn++ &IPS_PSN_MASK ; + bth2 = qp->s_psn++ &IPATH_PSN_MASK ;if ((int )(qp->s_psn - qp->s_next_psn) >0 ) qp->s_next_psn = qp->s_psn; ss =NULL ;
@@ -529,7 +529,7 @@ static void send_rc_ack(struct ipath_qp/* Construct the header. */ ohdr = &hdr.u.oth; - lrh0 =IPS_LRH_BTH ; + lrh0 =IPATH_LRH_BTH ;/* header size in 32-bit words LRH+BTH+AETH = (8+12+4)/4. */ hwords =6 ;if (unlikely (qp->remote_ah_attr.ah_flags &IB_AH_GRH )) {
@@ -537,14 +537,14 @@ static void send_rc_ack(struct ipath_qp &qp->remote_ah_attr.grh, hwords, 0); ohdr = &hdr.u.l.oth; - lrh0 =IPS_LRH_GRH ; + lrh0 =IPATH_LRH_GRH ; }/* read pkey_index w/o lock (its atomic) */ bth0 =ipath_layer_get_pkey (dev->dd, qp->s_pkey_index);if (qp->r_nak_state) - ohdr->u.aeth =cpu_to_be32 ((qp->r_msn &IPS_MSN_MASK ) | + ohdr->u.aeth =cpu_to_be32 ((qp->r_msn &IPATH_MSN_MASK ) | (qp->r_nak_state << -IPS_AETH_CREDIT_SHIFT )); +IPATH_AETH_CREDIT_SHIFT ));else ohdr->u.aeth =ipath_compute_aeth (qp);if (qp->r_ack_state >=OP (COMPARE_SWAP )) {
@@ -560,7 +560,7 @@ static void send_rc_ack(struct ipath_qp hdr.lrh[3 ] =cpu_to_be16 (ipath_layer_get_lid (dev->dd)); ohdr->bth[0 ] =cpu_to_be32 (bth0); ohdr->bth[1 ] =cpu_to_be32 (qp->remote_qpn); - ohdr->bth[2 ] =cpu_to_be32 (qp->r_ack_psn &IPS_PSN_MASK ); + ohdr->bth[2 ] =cpu_to_be32 (qp->r_ack_psn &IPATH_PSN_MASK );/* * If we can send the ACK, clear the ACK state.
@@ -890,8 +890,8 @@ static int do_rc_ack(struct ipath_qp *qpreset_psn (qp, psn); qp->s_rnr_timeout = - ib_ipath_rnr_table[(aeth >>IPS_AETH_CREDIT_SHIFT ) & -IPS_AETH_CREDIT_MASK ]; + ib_ipath_rnr_table[(aeth >>IPATH_AETH_CREDIT_SHIFT ) & +IPATH_AETH_CREDIT_MASK ];ipath_insert_rnr_queue (qp); goto bail;
@@ -899,8 +899,8 @@ static int do_rc_ack(struct ipath_qp *qp/* The last valid PSN seen is the previous request's. */ if (qp->s_last != qp->s_tail) qp->s_last_psn = wqe->psn -1 ; -switch ((aeth >>IPS_AETH_CREDIT_SHIFT ) & -IPS_AETH_CREDIT_MASK ) { +switch ((aeth >>IPATH_AETH_CREDIT_SHIFT ) & +IPATH_AETH_CREDIT_MASK ) {case 0 :/* PSN sequence error */ dev->n_seq_naks++;/*
@@ -1268,7 +1268,7 @@ static inline int ipath_rc_rcv_error(str* Check for the PSN of the last atomic operation * performed and resend the result if found. */ -if ((psn &IPS_PSN_MASK ) != qp->r_atomic_psn) +if ((psn &IPATH_PSN_MASK ) != qp->r_atomic_psn) goto done;break ; }
@@ -1638,7 +1638,7 @@ void ipath_rc_rcv(struct ipath_ibdev *de *(u64 *) qp->r_sge.sge.vaddr = sdata;spin_unlock_irq (&dev->pending_lock); qp->r_msn++; - qp->r_atomic_psn = psn &IPS_PSN_MASK ; + qp->r_atomic_psn = psn &IPATH_PSN_MASK ; psn |=1 <<31 ;break ; }
drivers/infiniband/hw/ipath/ipath_ruc.c +4 -4
@@ -32,7 +32,7 @@*/ #include "ipath_verbs.h" -#include "ips_common.h" +#include "ipath_common.h" /* * Convert the AETH RNR timeout code into the number of milliseconds.
@@ -632,7 +632,7 @@ again:/* Sending responses has higher priority over sending requests. */ if (qp->s_ack_state !=IB_OPCODE_RC_ACKNOWLEDGE && (bth0 =ipath_make_rc_ack (qp, ohdr, pmtu)) !=0 ) - bth2 = qp->s_ack_psn++ &IPS_PSN_MASK ; + bth2 = qp->s_ack_psn++ &IPATH_PSN_MASK ;else if (!((qp->ibqp.qp_type ==IB_QPT_RC ) ?ipath_make_rc_req (qp, ohdr, pmtu, &bth0, &bth2) :ipath_make_uc_req (qp, ohdr, pmtu, &bth0, &bth2))) {
@@ -651,12 +651,12 @@ again:/* Construct the header. */ extra_bytes = (4 - qp->s_cur_size) &3 ; nwords = (qp->s_cur_size + extra_bytes) >>2 ; - lrh0 =IPS_LRH_BTH ; + lrh0 =IPATH_LRH_BTH ;if (unlikely (qp->remote_ah_attr.ah_flags &IB_AH_GRH )) { qp->s_hdrwords +=ipath_make_grh (dev, &qp->s_hdr.u.l.grh, &qp->remote_ah_attr.grh, qp->s_hdrwords, nwords); - lrh0 =IPS_LRH_GRH ; + lrh0 =IPATH_LRH_GRH ; } lrh0 |= qp->remote_ah_attr.sl <<4 ; qp->s_hdr.lrh[0 ] =cpu_to_be16 (lrh0);
drivers/infiniband/hw/ipath/ipath_sysfs.c +3 -3
@@ -35,8 +35,8 @@#include <linux/pci.h> #include "ipath_kernel.h" -#include "ips_common.h" #include "ipath_layer.h" +#include "ipath_common.h" /** * ipath_parse_ushort - parse an unsigned short value in an arbitrary base
@@ -187,7 +187,7 @@ static ssize_t store_lid(struct device *if (ret <0 ) goto invalid; -if (lid ==0 || lid >=IPS_MULTICAST_LID_BASE ) { +if (lid ==0 || lid >=IPATH_MULTICAST_LID_BASE ) { ret = -EINVAL ; goto invalid; }
@@ -221,7 +221,7 @@ static ssize_t store_mlid(struct deviceint ret; ret =ipath_parse_ushort (buf, &mlid); -if (ret <0 || mlid <IPS_MULTICAST_LID_BASE ) +if (ret <0 || mlid <IPATH_MULTICAST_LID_BASE ) goto invalid; unit = dd->ipath_unit;
drivers/infiniband/hw/ipath/ipath_uc.c +2 -2
@@ -32,7 +32,7 @@*/ #include "ipath_verbs.h" -#include "ips_common.h" +#include "ipath_common.h" /* cut down ridiculously long IB macro names */ #define OP (x) IB_OPCODE_UC_##x
@@ -213,7 +213,7 @@ int ipath_make_uc_req(struct ipath_qp *q qp->s_cur_sge = &qp->s_sge; qp->s_cur_size = len; *bth0p = bth0 | (qp->s_state <<24 ); - *bth2p = qp->s_next_psn++ &IPS_PSN_MASK ; + *bth2p = qp->s_next_psn++ &IPATH_PSN_MASK ;return 1 ; done:
drivers/infiniband/hw/ipath/ipath_ud.c +12 -12
@@ -34,7 +34,7 @@#include <rdma/ib_smi.h> #include "ipath_verbs.h" -#include "ips_common.h" +#include "ipath_common.h" /** * ipath_ud_loopback - handle send on loopback QPs
@@ -289,8 +289,8 @@ int ipath_post_ud_send(struct ipath_qp * ret = -EINVAL ; goto bail; } -if (ah_attr->dlid >=IPS_MULTICAST_LID_BASE ) { -if (ah_attr->dlid !=IPS_PERMISSIVE_LID ) +if (ah_attr->dlid >=IPATH_MULTICAST_LID_BASE ) { +if (ah_attr->dlid !=IPATH_PERMISSIVE_LID ) dev->n_multicast_xmit++;else dev->n_unicast_xmit++;
@@ -310,7 +310,7 @@ int ipath_post_ud_send(struct ipath_qp *if (ah_attr->ah_flags &IB_AH_GRH ) {/* Header size in 32-bit words. */ hwords =17 ; - lrh0 =IPS_LRH_GRH ; + lrh0 =IPATH_LRH_GRH ; ohdr = &qp->s_hdr.u.l.oth; qp->s_hdr.u.l.grh.version_tclass_flow = cpu_to_be32((6 << 28) |
@@ -336,7 +336,7 @@ int ipath_post_ud_send(struct ipath_qp * }else {/* Header size in 32-bit words. */ hwords =7 ; - lrh0 =IPS_LRH_BTH ; + lrh0 =IPATH_LRH_BTH ; ohdr = &qp->s_hdr.u.oth; }if (wr->opcode ==IB_WR_SEND_WITH_IMM ) {
@@ -367,18 +367,18 @@ int ipath_post_ud_send(struct ipath_qp *if (wr->send_flags &IB_SEND_SOLICITED ) bth0 |=1 <<23 ; bth0 |= extra_bytes <<20 ; - bth0 |= qp->ibqp.qp_type ==IB_QPT_SMI ?IPS_DEFAULT_P_KEY : + bth0 |= qp->ibqp.qp_type ==IB_QPT_SMI ?IPATH_DEFAULT_P_KEY :ipath_layer_get_pkey (dev->dd, qp->s_pkey_index); ohdr->bth[0 ] =cpu_to_be32 (bth0);/* * Use the multicast QP if the destination LID is a multicast LID. */ - ohdr->bth[1 ] = ah_attr->dlid >=IPS_MULTICAST_LID_BASE && - ah_attr->dlid !=IPS_PERMISSIVE_LID ? -__constant_cpu_to_be32 (IPS_MULTICAST_QPN ) : + ohdr->bth[1 ] = ah_attr->dlid >=IPATH_MULTICAST_LID_BASE && + ah_attr->dlid !=IPATH_PERMISSIVE_LID ? +__constant_cpu_to_be32 (IPATH_MULTICAST_QPN ) :cpu_to_be32 (wr->wr.ud.remote_qpn);/* XXX Could lose a PSN count but not worth locking */ - ohdr->bth[2 ] =cpu_to_be32 (qp->s_next_psn++ &IPS_PSN_MASK ); + ohdr->bth[2 ] =cpu_to_be32 (qp->s_next_psn++ &IPATH_PSN_MASK );/* * Qkeys with the high order bit set mean use the * qkey from the QP context instead of the WR (see 10.2.5).
@@ -469,7 +469,7 @@ void ipath_ud_rcv(struct ipath_ibdev *de src_qp =be32_to_cpu (ohdr->u.ud.deth[1 ]); } } - src_qp &=IPS_QPN_MASK ; + src_qp &=IPATH_QPN_MASK ;/* * Check that the permissive LID is only used on QP0
@@ -627,7 +627,7 @@ void ipath_ud_rcv(struct ipath_ibdev *de/* * Save the LMC lower bits if the destination LID is a unicast LID. */ - wc.dlid_path_bits = dlid >=IPS_MULTICAST_LID_BASE ?0 : + wc.dlid_path_bits = dlid >=IPATH_MULTICAST_LID_BASE ?0 : dlid & ((1 << (dev->mkeyprot_resv_lmc &7 )) -1 );/* Signal completion event if the solicited bit is set. */ ipath_cq_enter(to_icq(qp->ibqp.recv_cq), &wc,
drivers/infiniband/hw/ipath/ipath_verbs.c +10 -10
@@ -37,7 +37,7 @@#include "ipath_kernel.h" #include "ipath_verbs.h" -#include "ips_common.h" +#include "ipath_common.h" /* Not static, because we don't want the compiler removing it */ const char ipath_verbs_version[] ="ipath_verbs " IPATH_IDSTR ;
@@ -429,7 +429,7 @@ static void ipath_ib_rcv(void *arg, void/* Check for a valid destination LID (see ch. 7.11.1). */ lid =be16_to_cpu (hdr->lrh[1 ]); -if (lid <IPS_MULTICAST_LID_BASE ) { +if (lid <IPATH_MULTICAST_LID_BASE ) { lid &= ~((1 << (dev->mkeyprot_resv_lmc &7 )) -1 );if (unlikely (lid !=ipath_layer_get_lid (dev->dd))) { dev->rcv_errors++;
@@ -439,9 +439,9 @@ static void ipath_ib_rcv(void *arg, void/* Check for GRH */ lnh =be16_to_cpu (hdr->lrh[0 ]) &3 ; -if (lnh ==IPS_LRH_BTH ) +if (lnh ==IPATH_LRH_BTH ) ohdr = &hdr->u.oth; -else if (lnh ==IPS_LRH_GRH ) +else if (lnh ==IPATH_LRH_GRH ) ohdr = &hdr->u.l.oth;else { dev->rcv_errors++;
@@ -453,8 +453,8 @@ static void ipath_ib_rcv(void *arg, void dev->opstats[opcode].n_packets++;/* Get the destination QP number. */ - qp_num =be32_to_cpu (ohdr->bth[1 ]) &IPS_QPN_MASK ; -if (qp_num ==IPS_MULTICAST_QPN ) { + qp_num =be32_to_cpu (ohdr->bth[1 ]) &IPATH_QPN_MASK ; +if (qp_num ==IPATH_MULTICAST_QPN ) {struct ipath_mcast *mcast;struct ipath_mcast_qp *p;
@@ -465,7 +465,7 @@ static void ipath_ib_rcv(void *arg, void } dev->n_multicast_rcv++;list_for_each_entry_rcu (p, &mcast->qp_list, list) -ipath_qp_rcv (dev, hdr, lnh ==IPS_LRH_GRH , data, +ipath_qp_rcv (dev, hdr, lnh ==IPATH_LRH_GRH , data, tlen, p->qp);/* * Notify ipath_multicast_detach() if it is waiting for us
@@ -477,7 +477,7 @@ static void ipath_ib_rcv(void *arg, void qp =ipath_lookup_qpn (&dev->qp_table, qp_num);if (qp) { dev->n_unicast_rcv++; -ipath_qp_rcv (dev, hdr, lnh ==IPS_LRH_GRH , data, +ipath_qp_rcv (dev, hdr, lnh ==IPATH_LRH_GRH , data, tlen, qp);/* * Notify ipath_destroy_qp() if it is waiting
@@ -860,8 +860,8 @@ static struct ib_ah *ipath_create_ah(str }/* A multicast address requires a GRH (see ch. 8.4.1). */ -if (ah_attr->dlid >=IPS_MULTICAST_LID_BASE && - ah_attr->dlid !=IPS_PERMISSIVE_LID && +if (ah_attr->dlid >=IPATH_MULTICAST_LID_BASE && + ah_attr->dlid !=IPATH_PERMISSIVE_LID && !(ah_attr->ah_flags &IB_AH_GRH )) { ret =ERR_PTR (-EINVAL ); goto bail;
drivers/infiniband/hw/ipath/ips_common.h deleted +0 -264
264 lines not on this page · raw message
PATCH 1/1 IB/ipath - purge sps_lid and sps_mlid arrays
In reply to Bryan O'SullivanThe two arrays only had space for 4 units.
Also changed from ipath_set_sps_lid() to ipath_set_lid(); the sps was leftover.
drivers/infiniband/hw/ipath/ipath_common.h +2 -5
@@ -122,8 +122,7 @@ struct infinipath_stats {__u64 sps_ports;/* list of pkeys (other than default) accepted (0 means not set) */ __u16 sps_pkeys[4 ]; -/* lids for up to 4 infinipaths, indexed by infinipath # */ -__u16 sps_lid[4 ]; +__u16 sps_unused16[4 ];/* available; maintaining compatible layout */ /* number of user ports per chip (not IB ports) */ __u32 sps_nports;/* not our interrupt, or already handled */
@@ -141,10 +140,8 @@ struct infinipath_stats {* packets if ipath not configured, sma/mad, etc.) */ __u64 sps_krdrops; -/* mlids for up to 4 infinipaths, indexed by infinipath # */ -__u16 sps_mlid[4 ];/* pad for future growth */ -__u64 __sps_pad[45 ]; +__u64 __sps_pad[46 ]; };/*
drivers/infiniband/hw/ipath/ipath_init_chip.c +0 -2
@@ -811,8 +811,6 @@ int ipath_init_chip(struct ipath_devdata/* clear any interrups up to this point (ints still not enabled) */ ipath_write_kreg (dd, dd->ipath_kregs->kr_intclear,-1LL ); - ipath_stats.sps_lid[dd->ipath_unit] = dd->ipath_lid; -/* * Set up the port 0 (kernel) rcvhdr q and egr TIDs. If doing * re-init, the simplest way to handle this is to free
drivers/infiniband/hw/ipath/ipath_layer.c +5 -6
@@ -300,9 +300,8 @@ bail:EXPORT_SYMBOL_GPL (ipath_layer_set_mtu); -int ipath_set_sps_lid (struct ipath_devdata *dd,u32 arg,u8 lmc) -{ - ipath_stats.sps_lid[dd->ipath_unit] = arg; +int ipath_set_lid (struct ipath_devdata *dd,u32 arg,u8 lmc) +{ dd->ipath_lid = arg; dd->ipath_lmc = lmc;
@@ -316,7 +315,7 @@ int ipath_set_sps_lid(struct ipath_devdareturn 0 ; } -EXPORT_SYMBOL_GPL (ipath_set_sps_lid); +EXPORT_SYMBOL_GPL (ipath_set_lid);int ipath_layer_set_guid (struct ipath_devdata *dd,__be64 guid) {
@@ -632,9 +631,9 @@ int ipath_layer_open(struct ipath_devdatif (*dd->ipath_statusp &IPATH_STATUS_IB_READY ) intval |=IPATH_LAYER_INT_IF_UP ; -if (ipath_stats.sps_lid[dd->ipath_unit]) +if (dd->ipath_lid) intval |=IPATH_LAYER_INT_LID ; -if (ipath_stats.sps_mlid[dd->ipath_unit]) +if (dd->ipath_mlid) intval |=IPATH_LAYER_INT_BCAST ;/* * do this on open, in case low level is already up and
drivers/infiniband/hw/ipath/ipath_layer.h +1 -1
@@ -129,7 +129,7 @@ u32 ipath_layer_get_cr_errpkey(struct ipu32 ipath_layer_get_cr_errpkey (struct ipath_devdata *dd);int ipath_layer_set_linkstate (struct ipath_devdata *dd,u8 state);int ipath_layer_set_mtu (struct ipath_devdata *,u16 ); -int ipath_set_sps_lid (struct ipath_devdata *,u32 ,u8 ); +int ipath_set_lid (struct ipath_devdata *,u32 ,u8 );int ipath_layer_send_hdr (struct ipath_devdata *dd,struct ether_header *hdr); int ipath_verbs_send(struct ipath_devdata *dd, u32 hdrwords,
drivers/infiniband/hw/ipath/ipath_mad.c +1 -1
@@ -308,7 +308,7 @@ static int recv_subn_set_portinfo(struct/* Must be a valid unicast LID address. */ if (lid ==0 || lid >=IPS_MULTICAST_LID_BASE ) goto err; -ipath_set_sps_lid (dev->dd, lid, pip->mkeyprot_resv_lmc &7 ); +ipath_set_lid (dev->dd, lid, pip->mkeyprot_resv_lmc &7 ); event.event =IB_EVENT_LID_CHANGE ;ib_dispatch_event (&event); }
drivers/infiniband/hw/ipath/ipath_sysfs.c +3 -22
@@ -115,11 +115,6 @@ DRIVER_STAT(pkey1, pkeys[1]);DRIVER_STAT (pkey1, pkeys[1 ]);DRIVER_STAT (pkey2, pkeys[2 ]);DRIVER_STAT (pkey3, pkeys[3 ]); -/* XXX fix the following when dynamic table of devices used */ -DRIVER_STAT (lid0, lid[0 ]); -DRIVER_STAT (lid1, lid[1 ]); -DRIVER_STAT (lid2, lid[2 ]); -DRIVER_STAT (lid3, lid[3 ]);DRIVER_STAT (nports, nports);DRIVER_STAT (null_intr, nullintr);
@@ -128,11 +123,6 @@ DRIVER_STAT(page_locks, pagelocks);DRIVER_STAT (page_locks, pagelocks);DRIVER_STAT (page_unlocks, pageunlocks);DRIVER_STAT (krdrops, krdrops); -/* XXX fix the following when dynamic table of devices used */ -DRIVER_STAT (mlid0, mlid[0 ]); -DRIVER_STAT (mlid1, mlid[1 ]); -DRIVER_STAT (mlid2, mlid[2 ]); -DRIVER_STAT (mlid3, mlid[3 ]);static struct attribute *driver_stat_attributes[] = { &driver_attr_intrs.attr,
@@ -155,10 +145,6 @@ static struct attribute *driver_stat_att &driver_attr_pkey1.attr, &driver_attr_pkey2.attr, &driver_attr_pkey3.attr, - &driver_attr_lid0.attr, - &driver_attr_lid1.attr, - &driver_attr_lid2.attr, - &driver_attr_lid3.attr, &driver_attr_nports.attr, &driver_attr_null_intr.attr, &driver_attr_max_pkts_call.attr,
@@ -166,10 +152,6 @@ static struct attribute *driver_stat_att &driver_attr_page_locks.attr, &driver_attr_page_unlocks.attr, &driver_attr_krdrops.attr, - &driver_attr_mlid0.attr, - &driver_attr_mlid1.attr, - &driver_attr_mlid2.attr, - &driver_attr_mlid3.attr, NULL };
@@ -273,7 +255,7 @@ static ssize_t store_lid(struct device * size_t count) {struct ipath_devdata *dd =dev_get_drvdata (dev); -u16 lid; +u16 lid =0 ;int ret; ret =ipath_parse_ushort (buf, &lid);
@@ -285,11 +267,11 @@ static ssize_t store_lid(struct device * goto invalid; } -ipath_set_sps_lid (dd, lid,0 ); +ipath_set_lid (dd, lid,0 ); goto bail; invalid: -ipath_dev_err (dd,"attempt to set invalid LID\n" ); +ipath_dev_err (dd,"attempt to set invalid LID 0x%x\n" , lid); bail:return ret; }
@@ -320,7 +302,6 @@ static ssize_t store_mlid(struct device unit = dd->ipath_unit; dd->ipath_mlid = mlid; - ipath_stats.sps_mlid[unit] = mlid;ipath_layer_intr (dd,IPATH_LAYER_INT_BCAST ); goto bail;
PATCH 1/1 IB/ipath - Fixes a bug where our delay for EEPROM no longer works due to compiler reordering
In reply to Bryan O'SullivanThe mb() prevents the compiler from reordering on this function, with some versions
of gcc and -Os optimization. The result is random failures in the EEPROM read
without this change.
drivers/infiniband/hw/ipath/ipath_eeprom.c +1 -0
@@ -186,6 +186,7 @@ bail:*/ static void i2c_wait_for_writes (struct ipath_devdata *dd) { +mb (); (void )ipath_read_kreg32 (dd, dd->ipath_kregs->kr_scratch); }
Re: [PATCH 28 of 39] IB/ipath - Fixes a bug where our delay for EEPROM no longer works due to compiler reordering
Quoted 13 lines · Bryan O'Sullivan
The
mb()prevents the compiler from reordering on this function, with some versions
of gcc and -Os optimization. The result is random failures in the EEPROM read
without this change.Signed-off-by Dave Olson <[email protected]>Signed-off-by Bryan O'Sullivan <[email protected]>diff -r
7d22a8963bda-r5f3c0b2d446ddrivers/infiniband/hw/ipath/ipath_eeprom.c
drivers/infiniband/hw/ipath/ipath_eeprom.c bail: · line 192
Quoted 7 lines
drivers/infiniband/hw/ipath/ipath_eeprom.c +1
-0@@ -186,6 +186,7 @@ bail:*/ static void i2c_wait_for_writes (struct ipath_devdata *dd) { +mb (); (void )ipath_read_kreg32 (dd, dd->ipath_kregs->kr_scratch); }
That's a bit weird. I wouldn't have expected the compiler to muck around with a readl().
Re: [PATCH 28 of 39] IB/ipath - Fixes a bug where our delay for EEPROM no longer works due to compiler reordering
Quoted 8 lines
drivers/infiniband/hw/ipath/ipath_eeprom.c bail: · line 191
Quoted 5 lines
static void
i2c_wait_for_writes(struct ipath_devdata *dd){drivers/infiniband/hw/ipath/ipath_eeprom.c +1
-0+mb (); (void )ipath_read_kreg32 (dd, dd->ipath_kregs->kr_scratch); }That's a bit weird. I wouldn't have expected the compiler to muck around with a
readl().
I never liked this patch. The last time it came up there were conflicting answers about whether it was a code generation bug or a real issue talking to hardware or what. At the least I think this merits a big comment explain what's going on -- and even better would be really understanding the bug that's being fixed so that we're confident it is indeed a real fix.
- R.
PATCH 1/1 IB/ipath - fixes to performance get counters for IB compliance
In reply to Bryan O'SullivanThis patch fixes some problems uncovered during IB compliance testing to return the right values for error counters returned by the Performance Get Counters packet.
drivers/infiniband/hw/ipath/ipath_driver.c +17 -0
@@ -460,6 +460,8 @@ static int __devinit ipath_init_one(stru* by ipath_setup_htconfig. */ dd->ipath_flags =0 ; + dd->ipath_lli_counter =0 ; + dd->ipath_lli_errors =0 ;if (dd->ipath_f_bus (dd, pdev)) ipath_dev_err(dd, "Failed to setup config space; "
@@ -942,6 +944,18 @@ reloop:"tlen=%x opcode=%x egridx=%x: %s\n" , eflags, l, etype, tlen, bthbytes[0 ], ips_get_index((__le32 *) rc), emsg); +/* Count local link integrity errors. */ +if (eflags & (INFINIPATH_RHF_H_ICRCERR | +INFINIPATH_RHF_H_VCRCERR )) { +u8 n = (dd->ipath_ibcctrl >> +INFINIPATH_IBCC_PHYERRTHRESHOLD_SHIFT ) & +INFINIPATH_IBCC_PHYERRTHRESHOLD_MASK ; + +if (++dd->ipath_lli_counter > n) { + dd->ipath_lli_counter =0 ; + dd->ipath_lli_errors++; + } + } }else if (etype ==RCVHQ_RCV_TYPE_NON_KD ) {int ret =__ipath_verbs_rcv (dd, rc +1 , ebuf, tlen);
@@ -949,6 +963,9 @@ reloop:ipath_cdbg (VERBOSE ,"received IB packet, " "not SMA (QP=%x)\n" , qp); +if (dd->ipath_lli_counter) + dd->ipath_lli_counter--; + }else if (etype ==RCVHQ_RCV_TYPE_EAGER ) { if (qp == IPATH_KD_QP && bthbytes[0] == ipath_layer_rcv_opcode &&
drivers/infiniband/hw/ipath/ipath_intr.c +1 -0
@@ -262,6 +262,7 @@ static void handle_e_ibstatuschanged(str | IPATH_LINKACTIVE | IPATH_LINKARMED); *dd->ipath_statusp &= ~IPATH_STATUS_IB_READY ; + dd->ipath_lli_counter =0 ;if (!noprint) { if (((dd->ipath_lastibcstat >> INFINIPATH_IBCS_LINKSTATE_SHIFT) &
drivers/infiniband/hw/ipath/ipath_kernel.h +5 -0
@@ -507,6 +507,11 @@ struct ipath_devdata {u8 ipath_pci_cacheline;/* LID mask control */ u8 ipath_lmc; + +/* local link integrity counter */ +u32 ipath_lli_counter; +/* local link integrity errors */ +u32 ipath_lli_errors; };extern struct list_head ipath_dev_list;
drivers/infiniband/hw/ipath/ipath_layer.c +7 -2
@@ -1032,19 +1032,22 @@ int ipath_layer_get_counters(struct ipatipath_snap_cntr (dd, dd->ipath_cregs->cr_ibsymbolerrcnt); cntrs->link_error_recovery_counter =ipath_snap_cntr (dd, dd->ipath_cregs->cr_iblinkerrrecovcnt); +/* +* The link downed counter counts when the other side downs the +* connection. We add in the number of times we downed the link +* due to local link integrity errors to compensate. +*/ cntrs->link_downed_counter =ipath_snap_cntr (dd, dd->ipath_cregs->cr_iblinkdowncnt); cntrs->port_rcv_errors =ipath_snap_cntr (dd, dd->ipath_cregs->cr_rxdroppktcnt) +ipath_snap_cntr (dd, dd->ipath_cregs->cr_rcvovflcnt) +ipath_snap_cntr (dd, dd->ipath_cregs->cr_portovflcnt) + -ipath_snap_cntr (dd, dd->ipath_cregs->cr_errrcvflowctrlcnt) +ipath_snap_cntr (dd, dd->ipath_cregs->cr_err_rlencnt) +ipath_snap_cntr (dd, dd->ipath_cregs->cr_invalidrlencnt) +ipath_snap_cntr (dd, dd->ipath_cregs->cr_erricrccnt) +ipath_snap_cntr (dd, dd->ipath_cregs->cr_errvcrccnt) +ipath_snap_cntr (dd, dd->ipath_cregs->cr_errlpcrccnt) + -ipath_snap_cntr (dd, dd->ipath_cregs->cr_errlinkcnt) +ipath_snap_cntr (dd, dd->ipath_cregs->cr_badformatcnt); cntrs->port_rcv_remphys_errors =ipath_snap_cntr (dd, dd->ipath_cregs->cr_rcvebpcnt);
@@ -1058,6 +1061,8 @@ int ipath_layer_get_counters(struct ipatipath_snap_cntr (dd, dd->ipath_cregs->cr_pktsendcnt); cntrs->port_rcv_packets =ipath_snap_cntr (dd, dd->ipath_cregs->cr_pktrcvcnt); + cntrs->local_link_integrity_errors = dd->ipath_lli_errors; + cntrs->excessive_buffer_overrun_errors =0 ;/* XXX */ ret =0 ;
drivers/infiniband/hw/ipath/ipath_layer.h +2 -0
@@ -55,6 +55,8 @@ struct ipath_layer_counters {u64 port_rcv_data;u64 port_xmit_packets;u64 port_rcv_packets; +u32 local_link_integrity_errors; +u32 excessive_buffer_overrun_errors; };/*
drivers/infiniband/hw/ipath/ipath_mad.c +28 -24
84 lines not on this page · raw message
drivers/infiniband/hw/ipath/ipath_ud.c +10 -1
@@ -560,7 +560,16 @@ void ipath_ud_rcv(struct ipath_ibdev *despin_lock_irqsave (&rq->lock, flags);if (rq->tail == rq->head) {spin_unlock_irqrestore (&rq->lock, flags); - dev->n_pkt_drops++; +/* +* Count VL15 packets dropped due to no receive buffer. +* Otherwise, count them as buffer overruns since usually, +* the HW will be able to receive packets even if there are +* no QPs with posted receive buffers. +*/ +if (qp->ibqp.qp_num ==0 ) + dev->n_vl15_dropped++; +else + dev->rcv_errors++; goto bail; }/* Silently drop packets which are too big. */
drivers/infiniband/hw/ipath/ipath_verbs.c +20 -0
@@ -981,6 +981,7 @@ static int ipath_verbs_register_sysfs(st*/ static void *ipath_register_ib_device (int unit,struct ipath_devdata *dd) { +struct ipath_layer_counters cntrs;struct ipath_ibdev *idev;struct ib_device *dev;int ret;
@@ -1030,6 +1031,25 @@ static void *ipath_register_ib_device(in idev->pma_counter_select[3 ] =IB_PMA_PORT_RCV_PKTS ; idev->pma_counter_select[5 ] =IB_PMA_PORT_XMIT_WAIT ; idev->link_width_enabled =3 ;/* 1x or 4x */ + +/* Snapshot current HW counters to "clear" them. */ +ipath_layer_get_counters (dd, &cntrs); + idev->z_symbol_error_counter = cntrs.symbol_error_counter; + idev->z_link_error_recovery_counter = + cntrs.link_error_recovery_counter; + idev->z_link_downed_counter = cntrs.link_downed_counter; + idev->z_port_rcv_errors = cntrs.port_rcv_errors; + idev->z_port_rcv_remphys_errors = + cntrs.port_rcv_remphys_errors; + idev->z_port_xmit_discards = cntrs.port_xmit_discards; + idev->z_port_xmit_data = cntrs.port_xmit_data; + idev->z_port_rcv_data = cntrs.port_rcv_data; + idev->z_port_xmit_packets = cntrs.port_xmit_packets; + idev->z_port_rcv_packets = cntrs.port_rcv_packets; + idev->z_local_link_integrity_errors = + cntrs.local_link_integrity_errors; + idev->z_excessive_buffer_overrun_errors = + cntrs.excessive_buffer_overrun_errors;/* * The system image GUID is supposed to be the same for all
drivers/infiniband/hw/ipath/ipath_verbs.h +3 -0
@@ -460,6 +460,8 @@ struct ipath_ibdev {u64 z_port_xmit_packets;/* starting count for PMA */ u64 z_port_rcv_packets;/* starting count for PMA */ u32 z_pkey_violations;/* starting count for PMA */ +u32 z_local_link_integrity_errors;/* starting count for PMA */ +u32 z_excessive_buffer_overrun_errors;/* starting count for PMA */ u32 n_rc_resends;u32 n_rc_acks;u32 n_rc_qacks;
@@ -469,6 +471,7 @@ struct ipath_ibdev {u32 n_other_naks;u32 n_timeouts;u32 n_pkt_drops; +u32 n_vl15_dropped;u32 n_wqe_errs;u32 n_rdma_dup_busy;u32 n_piowait;
PATCH 1/1 IB/ipath - support more models of InfiniPath hardware
In reply to Bryan O'SullivanWe do a few more explicit checks for specific models, and now also support the old PathScale serial number style, or new QLogic style.
This is backwards compatible with previous versions of software and hardware. That is, older software will see a plausible serial number and correct GUID when used with a new board, while newer software will correctly handle an older board.
drivers/infiniband/hw/ipath/ipath_common.h +7 -5
@@ -476,7 +476,7 @@ struct ipath_sma_pkt* Data layout in I2C flash (for GUID, etc.) * All fields are little-endian binary unless otherwise stated */ -#define IPATH_FLASH_VERSION 1 +#define IPATH_FLASH_VERSION 2struct ipath_flash {/* flash layout version (IPATH_FLASH_VERSION) */ __u8 if_fversion;
@@ -484,14 +484,14 @@ struct ipath_flash {__u8 if_csum;/* * valid length (in use, protected by if_csum), including -* if_fversion and if_sum themselves) +* if_fversion and if_csum themselves) */ __u8 if_length;/* the GUID, in network order */ __u8 if_guid[8 ];/* number of GUIDs to use, starting from if_guid */ __u8 if_numguid; -/* the board serial number, in ASCII */ +/* the (last 10 characters of) board serial number, in ASCII */ char if_serial[12 ];/* board mfg date (YYYYMMDD ASCII) */ char if_mfgdate[8 ];
@@ -503,8 +503,10 @@ struct ipath_flash {__u8 if_powerhour[2 ];/* ASCII free-form comment field */ char if_comment[32 ]; -/* 78 bytes used, min flash size is 128 bytes */ -__u8 if_future[50 ]; +/* Backwards compatible prefix for longer QLogic Serial Numbers */ +char if_sprefix[4 ]; +/* 82 bytes used, min flash size is 128 bytes */ +__u8 if_future[46 ]; };/*
drivers/infiniband/hw/ipath/ipath_eeprom.c +25 -2
@@ -602,8 +602,31 @@ void ipath_get_eeprom_info(struct ipath_ guid = *(__be64 *) ifp->if_guid; dd->ipath_guid = guid; dd->ipath_nguid = ifp->if_numguid; -memcpy (dd->ipath_serial, ifp->if_serial, -sizeof (ifp->if_serial)); +/* +* Things are slightly complicated by the desire to transparently +* support both the Pathscale 10-digit serial number and the QLogic +* 13-character version. +*/ +if ((ifp->if_fversion >1 ) && ifp->if_sprefix[0 ] + && ((u8 *)ifp->if_sprefix)[0 ] !=0xFF ) { +/* This board has a Serial-prefix, which is stored +* elsewhere for backward-compatibility. +*/ +char *snp = dd->ipath_serial; +int len; +memcpy (snp, ifp->if_sprefix,sizeof ifp->if_sprefix); + snp[sizeof ifp->if_sprefix] ='\0' ; + len =strlen (snp); + snp += len; + len = (sizeof dd->ipath_serial) - len; +if (len >sizeof ifp->if_serial) { + len =sizeof ifp->if_serial; + } +memcpy (snp, ifp->if_serial, len); + }else +memcpy (dd->ipath_serial, ifp->if_serial, +sizeof ifp->if_serial); +ipath_cdbg (VERBOSE ,"Initted GUID to %llx from eeprom\n" , (unsigned long long )be64_to_cpu (dd->ipath_guid));
drivers/infiniband/hw/ipath/ipath_kernel.h +5 -2
@@ -491,8 +491,11 @@ struct ipath_devdata {u16 ipath_lid;/* list of pkeys programmed; 0 if not set */ u16 ipath_pkeys[4 ]; -/* ASCII serial number, from flash */ -u8 ipath_serial[12 ]; +/* +* ASCII serial number, from flash, large enough for original +* all digit strings, and longer QLogic serial number format +*/ +u8 ipath_serial[16 ];/* human readable board version */ u8 ipath_boardversion[80 ];/* chip major rev, from ipath_revision */
drivers/infiniband/hw/ipath/ipath_pe800.c +1 -1
@@ -533,7 +533,7 @@ static int ipath_pe_boardname(struct ipaif (n)snprintf (name, namelen,"%s" , n); -if (dd->ipath_majrev !=4 || dd->ipath_minrev !=1 ) { +if (dd->ipath_majrev !=4 || !dd->ipath_minrev || dd->ipath_minrev>2 ) {ipath_dev_err (dd,"Unsupported PE-800 revision %u.%u!\n" , dd->ipath_majrev, dd->ipath_minrev); ret =1 ;
PATCH 1/1 IB/ipath - remove some #if 0 code related to lockable memory
In reply to Bryan O'Sullivandrivers/infiniband/hw/ipath/ipath_user_pages.c +0 -11
@@ -57,17 +57,6 @@ static int __get_user_pages(unsigned lonunsigned long lock_limit;size_t got;int ret; - -#if 0 -/* -* XXX - causes MPI programs to fail, haven't had time to check -* yet -*/ -if (!capable (CAP_IPC_LOCK )) { - ret = -EPERM ; - goto bail; - } -#endif lock_limit = current->signal->rlim[RLIMIT_MEMLOCK ].rlim_cur >>PAGE_SHIFT ;
PATCH 1/1 IB/ipath - read/write correct sizes through diag interface
In reply to Bryan O'SullivanWe must increment uaddr by size we are reading or writing, since it's passed as a char *, not a pointer to the appropriate size.
drivers/infiniband/hw/ipath/ipath_diag.c +5 -4
@@ -115,7 +115,7 @@ static int ipath_read_umem64(struct ipat goto bail; } reg_addr++; - uaddr++; + uaddr +=sizeof (u64); } ret =0 ; bail:
@@ -154,7 +154,7 @@ static int ipath_write_umem64(struct ipawriteq (data, reg_addr); reg_addr++; - uaddr++; + uaddr +=sizeof (u64); } ret =0 ; bail:
@@ -192,7 +192,8 @@ static int ipath_read_umem32(struct ipat } reg_addr++; - uaddr++; + uaddr +=sizeof (u32); + } ret =0 ; bail:
@@ -231,7 +232,7 @@ static int ipath_write_umem32(struct ipawritel (data, reg_addr); reg_addr++; - uaddr++; + uaddr +=sizeof (u32); } ret =0 ; bail:
PATCH 1/1 IB/ipath - fix a bug that results in addresses near 0 being written via DMA
In reply to Bryan O'SullivanWe can't tell for sure if any packets are in the infinipath receive buffer
when we shut down a chip port. Normally this is taken care of by orderly
shutdown, but when processes are terminated, or sending process has a bug,
we can continue to receive packets. So rather than writing zero to the
address registers for the closing port, we point it at a dummy memory.
drivers/infiniband/hw/ipath/ipath_driver.c +6 -0
@@ -1824,6 +1824,12 @@ static void cleanup_device(struct ipath_ dd->ipath_pioavailregs_phys); dd->ipath_pioavailregs_dma =NULL ; } +if (dd->ipath_dummy_hdrq) { +dma_free_coherent (&dd->pcidev->dev, + dd->ipath_pd[0 ]->port_rcvhdrq_size, + dd->ipath_dummy_hdrq, dd->ipath_dummy_hdrq_phys); + dd->ipath_dummy_hdrq =NULL ; + }if (dd->ipath_pageshadow) {struct page **tmpp = dd->ipath_pageshadow;
drivers/infiniband/hw/ipath/ipath_file_ops.c +36 -27
77 lines not on this page · raw message
drivers/infiniband/hw/ipath/ipath_init_chip.c +17 -0
@@ -647,6 +647,7 @@ int ipath_init_chip(struct ipath_devdatau32 val32, kpiobufs;u64 val;struct ipath_portdata *pd =NULL ;/* keep gcc4 happy */ +gfp_t gfp_flags =GFP_USER | __GFP_COMP; ret =init_housekeeping (dd, &pd, reinit);if (ret)
@@ -833,6 +834,22 @@ int ipath_init_chip(struct ipath_devdata "rcvhdrq and/or egr bufs\n"); elseenable_chip (dd ,pd ,reinit ); + + +if (!ret && !reinit) { +/* used when we close a port, for DMA already in flight at close */ + dd->ipath_dummy_hdrq =dma_alloc_coherent ( + &dd->pcidev->dev, pd->port_rcvhdrq_size, + &dd->ipath_dummy_hdrq_phys, + gfp_flags); +if (!dd->ipath_dummy_hdrq ) { +dev_info (&dd->pcidev->dev, +"Couldn't allocate 0x%lx bytes for dummy hdrq\n" , + pd->port_rcvhdrq_size); +/* fallback to just 0'ing */ + dd->ipath_dummy_hdrq_phys =0UL ; + } + }/* * cause retrigger of pending interrupts ignored during init,
drivers/infiniband/hw/ipath/ipath_kernel.h +2 -0
@@ -352,6 +352,8 @@ struct ipath_devdata {/* check for stale messages in rcv queue */ /* only allow one intr at a time. */ unsigned long ipath_rcv_pending; +void *ipath_dummy_hdrq;/* used after port close */ +dma_addr_t ipath_dummy_hdrq_phys;/* * Shadow copies of registers; size indicates read access size.
PATCH 1/1 IB/ipath - More changes to support InfiniPath on PowerPC 970 systems
In reply to Bryan O'SullivanOrdering of writethrough store buffers needs to be forced, and we need to use ifdef to get writethrough behavior to InfiniPath buffers, because there is no generic way to specify that at this time (similar to code in char/drm/drm_vm.c and block/z2ram.c).
drivers/infiniband/hw/ipath/Makefile +1 -0
@@ -20,6 +20,7 @@ ipath_core-y := \ ipath_user_pages.o ipath_core-$(CONFIG_X86_64) += ipath_wc_x86_64.o +ipath_core-$(CONFIG_PPC64) += ipath_wc_ppc64.o ib_ipath-y := \ ipath_cq.o \
drivers/infiniband/hw/ipath/ipath_driver.c +6 -0
@@ -440,7 +440,13 @@ static int __devinit ipath_init_one(stru } dd->ipath_pcirev = rev; +#if defined(__powerpc__) +/* There isn't a generic way to specify writethrough mappings */ + dd->ipath_kregbase =__ioremap (addr, len, + (_PAGE_NO_CACHE|_PAGE_WRITETHRU)); +#else dd->ipath_kregbase =ioremap_nocache (addr, len); +#endif if (!dd->ipath_kregbase) { ipath_dbg("Unable to map io addr %llx to kvirt, failing\n",
drivers/infiniband/hw/ipath/ipath_file_ops.c +7 -0
@@ -985,6 +985,13 @@ static int mmap_piobufs(struct vm_area_s* write combining behavior we want on the PIO buffers! */ +#if defined(__powerpc__) +/* There isn't a generic way to specify writethrough mappings */ +pgprot_val (vma->vm_page_prot) |= _PAGE_NO_CACHE; +pgprot_val (vma->vm_page_prot) |= _PAGE_WRITETHRU; +pgprot_val (vma->vm_page_prot) &= ~_PAGE_GUARDED; +#endif +if (vma->vm_flags &VM_READ ) { dev_info(&dd->pcidev->dev, "Can't map piobufs as readable (flags=%lx)\n",
drivers/infiniband/hw/ipath/ipath_wc_ppc64.c new file +52 -0
52 lines not on this page · raw message
David Miller
maintainerRe: [PATCH 38 of 39] IB/ipath - More changes to support InfiniPath on PowerPC 970 systems
From: Bryan O'Sullivan <[email protected]>
Date: Thu, 29 Jun 2006 14:41:29 -0700
Quoted 2 lines
ipath_core-$(CONFIG_X86_64) += ipath_wc_x86_64.o
+ipath_core-$(CONFIG_PPC64) += ipath_wc_ppc64.o
Again, don't put these kinds of cpu specific functions into the infiniband driver. They are potentially globally useful, not something only Infiniband might want to do.
Re: [PATCH 38 of 39] IB/ipath - More changes to support InfiniPath on PowerPC 970 systems
Quoted 9 lines · David Miller
From: Bryan O'Sullivan <[email protected]>
Date: Thu, 29 Jun 2006 14:41:29 -0700Quoted 2 lines
ipath_core-$(CONFIG_X86_64) += ipath_wc_x86_64.o
+ipath_core-$(CONFIG_PPC64) += ipath_wc_ppc64.oAgain, don't put these kinds of cpu specific functions into the infiniband driver. They are potentially globally useful, not something only Infiniband might want to do.
The support for write combining in the kernel is not in a state where that makes any sense at the moment. Also, this is a single-statement function.
<b
David Miller
maintainerRe: [PATCH 38 of 39] IB/ipath - More changes to support InfiniPath on PowerPC 970 systems
From: Bryan O'Sullivan <[email protected]>
Date: Thu, 29 Jun 2006 15:01:39 -0700
Quoted 2 lines
The support for write combining in the kernel is not in a state where that makes any sense at the moment.
Please fix the generic code if it doesn't provide the facility you need at the moment. Don't shoe horn it into your driver just to make up for that.
Re: [PATCH 38 of 39] IB/ipath - More changes to support InfiniPath on PowerPC 970 systems
Hi,
Quoted 3 lines
Please fix the generic code if it doesn't provide the facility you need at the moment. Don't shoe horn it into your driver just to make up for that.
Ive had 3 drivers asking for write combining recently so I agree this is a good idea. How about ioremap_wc as suggested by Willy:
http://marc.theaimsgroup.com/?l=linux-kernel&m=114374741828040&w=2
Anton
Re: [PATCH 38 of 39] IB/ipath - More changes to support InfiniPath on PowerPC 970 systems
Quoting r. Anton Blanchard <[email protected]>:
Quoted 5 lines
Subject: Re: [PATCH 38 of 39] IB/ipath - More changes to support InfiniPath on PowerPC 970 systems
Hi,
Quoted 8 lines
Quoted 3 lines
Please fix the generic code if it doesn't provide the facility you need at the moment. Don't shoe horn it into your driver just to make up for that.
Ive had 3 drivers asking for write combining recently so I agree this is a good idea. How about
ioremap_wcas suggested by Willy:http://marc.theaimsgroup.com/?l=linux-kernel&m=114374741828040&w=2
Hmm ... I think ioremap_wc isn't sufficient by itself to make drivers using write-combined memory, portable. Here's another thread on a related subject:
http://lkml.org/lkml/2006/2/24/347
Signature · 1 line
MST
Re: [PATCH 38 of 39] IB/ipath - More changes to support InfiniPath on PowerPC 970 systems
In reply to Bryan O'Sullivandrivers/infiniband/hw/ipath/ipath_file_ops.c static int mmap_piobufs(struct vm_area_s · line 993
Quoted 7 lines
drivers/infiniband/hw/ipath/ipath_file_ops.c +6
-0+#if defined(__powerpc__) +/* There isn't a generic way to specify writethrough mappings */ +pgprot_val (vma->vm_page_prot) |= _PAGE_NO_CACHE; +pgprot_val (vma->vm_page_prot) |= _PAGE_WRITETHRU; +pgprot_val (vma->vm_page_prot) &= ~_PAGE_GUARDED; +#endif
I don't see any case where having both NO_CACHE and WRITE_THRU can be legal... It's one or the other.
drivers/infiniband/hw/ipath/ipath_wc_ppc64.c line 52
Quoted 13 lines
drivers/infiniband/hw/ipath/ipath_wc_ppc64.c new file +13
-0+/** +* ipath_unordered_wc - indicate whether write combining is ordered +* +* PowerPC systems (at least those in the 970 processor family) +* write partially filled store buffers in address order, but will write +* completely filled store buffers in "random" order, and therefore must +* have serialization for correctness with current InfiniPath chips. +* +*/ +int ipath_unordered_wc (void ) +{ +return 1 ; +}
How is the above providing any kind of serialisation ?
Ben.
Re: [PATCH 38 of 39] IB/ipath - More changes to support InfiniPath on PowerPC 970 systems
Quoted 6 lines · Benjamin Herrenschmidt
drivers/infiniband/hw/ipath/ipath_wc_ppc64.c line 52
Quoted 4 lines
drivers/infiniband/hw/ipath/ipath_wc_ppc64.c new file +4
-0+int ipath_unordered_wc (void ) +{ +return 1 ; +}How is the above providing any kind of serialisation ?
It's not intended to; it tells the *caller* whether to do it.
<b
Re: [PATCH 38 of 39] IB/ipath - More changes to support InfiniPath on PowerPC 970 systems
Quoted 10 lines · Bryan O'Sullivan
Quoted 6 lines · Benjamin Herrenschmidt
drivers/infiniband/hw/ipath/ipath_wc_ppc64.c line 52
Quoted 4 lines
drivers/infiniband/hw/ipath/ipath_wc_ppc64.c new file +4
-0+int ipath_unordered_wc (void ) +{ +return 1 ; +}How is the above providing any kind of serialisation ?
It's not intended to; it tells the *caller* whether to do it.
Ah ok. What barrier do you use for that ?
Ben.
Re: [PATCH 0 of 39] ipath - bug fixes, performance enhancements,and portability improvements
In reply to Bryan O'SullivanQuoting r. Bryan O'Sullivan <[email protected]>:
Quoted 4 lines
Subject: [PATCH 0 of 39] ipath - bug fixes, performance enhancements,and portability improvements
Hi, Andrew -
Quoted 8 lines
These patches bring the ipath driver up to date with a number of bug fixes, performance improvements, and better PowerPC support. There are a few whitespace and formatting patches in the series, but they're all self- contained. The patches have been tested internally, and shouldn't contain anything controversial.
My hope is that they'll sit in -mm for a little bit, and make it into an early 2.6.18 -rc kernel.
OK, next week I'll put these into my tree, too.
Bryan, as far as I can see there were some comments with regard to patches 38 and 39 in the series. Will you be sending updated revisions of these?
Signature · 1 line
MST
Re: [PATCH 0 of 39] ipath - bug fixes, performance enhancements,and portability improvements
Quoted 1 line · Michael S. Tsirkin
OK, next week I'll put these into my tree, too.
Thanks. The first 37 are in -mm; the last two you can drop until I sort them out.
<b
Re: [PATCH 0 of 39] ipath - bug fixes, performanceenhancements,and portability improvements
Quoting r. Bryan O'Sullivan <[email protected]>:
Quoted 8 lines
Subject: Re: [PATCH 0 of 39] ipath - bug fixes, performanceenhancements,and portability improvements
Quoted 1 line · Michael S. Tsirkin
OK, next week I'll put these into my tree, too.
Thanks. The first 37 are in -mm; the last two you can drop until I sort them out.
What about patch 28?
Signature · 1 line
MST
Re: [PATCH 0 of 39] ipath - bug fixes, performanceenhancements,and portability improvements
Quoted 12 lines · On Sat, 1 Jul 2006 22:43:23 +0300 "Michael S. Tsirkin" <[email protected]>…
Quoting r. Bryan O'Sullivan <[email protected]>:
Quoted 8 lines
Subject: Re: [PATCH 0 of 39] ipath - bug fixes, performanceenhancements,and portability improvements
Quoted 1 line · Michael S. Tsirkin
OK, next week I'll put these into my tree, too.
Thanks. The first 37 are in -mm; the last two you can drop until I sort them out.
What about patch 28?
I sent 1-27,29-37 to Linus and he has merged them. But I held #28 back based on Roland's concerns.