From 5a872217452946a62ff79cf425eecd749fa2dfb6 Mon Sep 17 00:00:00 2001 From: ftillier Date: Mon, 17 Oct 2005 04:07:31 +0000 Subject: [PATCH] [SRP] Properly format and cap the number of memory descriptors in IDBD information units. Signed-off-by: Fab Tillier (ftillier@silverstorm.com) git-svn-id: svn://openib.tc.cornell.edu/gen1@118 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- trunk/ulp/srp/kernel/srp_connection.c | 2 +- trunk/ulp/srp/kernel/srp_data_path.c | 18 +++++++++++++++--- trunk/ulp/srp/kernel/srp_descriptors.c | 2 ++ trunk/ulp/srp/kernel/srp_hba.c | 5 ++++- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/trunk/ulp/srp/kernel/srp_connection.c b/trunk/ulp/srp/kernel/srp_connection.c index 821aa93a..f8f2c11d 100644 --- a/trunk/ulp/srp/kernel/srp_connection.c +++ b/trunk/ulp/srp/kernel/srp_connection.c @@ -438,7 +438,7 @@ __srp_cm_reply_cb( if (( p_connection->descriptor_format & DBDF_INDIRECT_DATA_BUFFER_DESCRIPTORS ) == DBDF_INDIRECT_DATA_BUFFER_DESCRIPTORS ) { p_connection->max_scatter_gather_entries = - ( MAX( SRP_MAX_IU_SIZE, p_connection->init_to_targ_iu_sz ) - offsetof( srp_cmd_t, additional_cdb )- sizeof(srp_memory_table_descriptor_t)) / sizeof( srp_memory_descriptor_t ); + ( MIN( SRP_MAX_IU_SIZE, p_connection->init_to_targ_iu_sz ) - offsetof( srp_cmd_t, additional_cdb )- sizeof(srp_memory_table_descriptor_t)) / sizeof( srp_memory_descriptor_t ); } else if (( p_connection->descriptor_format & DBDF_DIRECT_DATA_BUFFER_DESCRIPTOR ) == DBDF_DIRECT_DATA_BUFFER_DESCRIPTOR ) { diff --git a/trunk/ulp/srp/kernel/srp_data_path.c b/trunk/ulp/srp/kernel/srp_data_path.c index 56364d3d..aca2b49e 100644 --- a/trunk/ulp/srp/kernel/srp_data_path.c +++ b/trunk/ulp/srp/kernel/srp_data_path.c @@ -580,7 +580,13 @@ __srp_build_cmd( p_scatter_gather_list = StorPortGetScatterGatherList( p_dev_ext, p_srb ); CL_ASSERT( p_scatter_gather_list != NULL ); scatter_gather_count = (uint8_t)p_scatter_gather_list->NumberOfElements; - CL_ASSERT( scatter_gather_count <= p_srp_conn_info->max_scatter_gather_entries ); + } + + /* Cap the length of the inline descriptors to the maximum IU size. */ + if( p_srp_conn_info->max_scatter_gather_entries < scatter_gather_count ) + { + scatter_gather_count = + (uint8_t)p_srp_conn_info->max_scatter_gather_entries; } if ( scsi_direction == SRB_FLAGS_DATA_IN ) @@ -612,10 +618,14 @@ __srp_build_cmd( /* we don't swap rkey - it is already in network order*/ p_table_descriptor->descriptor.virtual_address = cl_hton64( buf_addr ); p_table_descriptor->descriptor.memory_handle = p_srp_conn_info->rkey; - p_table_descriptor->descriptor.data_length = cl_hton32( sizeof(srp_memory_descriptor_t) * scatter_gather_count ); + + p_table_descriptor->descriptor.data_length = + cl_hton32( sizeof(srp_memory_descriptor_t) * + p_scatter_gather_list->NumberOfElements ); for ( i = 0, totalLength = 0, p_sg_element = p_scatter_gather_list->List; - i < scatter_gather_count; i++, p_memory_descriptor++, p_sg_element++ ) + i < p_scatter_gather_list->NumberOfElements; + i++, p_memory_descriptor++, p_sg_element++ ) { buf_addr = p_srp_conn_info->vaddr + p_sg_element->PhysicalAddress.QuadPart; @@ -628,6 +638,8 @@ __srp_build_cmd( } else if ( format == DBDF_DIRECT_DATA_BUFFER_DESCRIPTOR ) { + CL_ASSERT( scatter_gather_count == + p_scatter_gather_list->NumberOfElements ); for ( i = 0, p_sg_element = p_scatter_gather_list->List; i < scatter_gather_count; i++, p_memory_descriptor++, p_sg_element++ ) { diff --git a/trunk/ulp/srp/kernel/srp_descriptors.c b/trunk/ulp/srp/kernel/srp_descriptors.c index d6def787..81cb0e96 100644 --- a/trunk/ulp/srp/kernel/srp_descriptors.c +++ b/trunk/ulp/srp/kernel/srp_descriptors.c @@ -385,6 +385,8 @@ srp_post_send_descriptor( p_descriptor->ds[0].length = get_srp_tsk_mgmt_length( (srp_tsk_mgmt_t *)p_descriptor->data_segment ); } + ASSERT( p_descriptor->ds[0].length <= p_connection->init_to_targ_iu_sz ); + srp_add_send_descriptor( p_descriptors, p_descriptor ); status = p_ifc->post_send( diff --git a/trunk/ulp/srp/kernel/srp_hba.c b/trunk/ulp/srp/kernel/srp_hba.c index eec6c0b4..ba8949da 100644 --- a/trunk/ulp/srp/kernel/srp_hba.c +++ b/trunk/ulp/srp/kernel/srp_hba.c @@ -683,7 +683,10 @@ __srp_connect_sessions( { any_ioc_connected = TRUE; - if ( p_hba->max_sg > p_session->connection.max_scatter_gather_entries ) + if ( (p_hba->max_sg > + p_session->connection.max_scatter_gather_entries) + && !(p_session->connection.descriptor_format & + DBDF_INDIRECT_DATA_BUFFER_DESCRIPTORS) ) { p_hba->max_sg = p_session->connection.max_scatter_gather_entries; } -- 2.41.0