[Linux1394-cvslog] rev 623 - trunk
Brought to you by:
aeb,
bencollins
From: SVN U. <ben...@li...> - 2002-10-20 06:46:46
|
Author: bencollins Date: 2002-10-20 02:46:43 -0400 (Sun, 20 Oct 2002) New Revision: 623 Modified: trunk/TODO trunk/ieee1394_core.c trunk/ieee1394_transactions.c trunk/ieee1394_transactions.h trunk/sbp2.c trunk/sbp2.h Log: Last two fill_* functions are now static to ieee1394_transactions.c. This was somewhat of a major change to sbp2. No longer is there a packet pool. I suspect that since we allocate packets out of a kmemcache anyway, this wont be a performance hit. It seems faster for me anyway. Modified: trunk/ieee1394_core.c ============================================================================== --- trunk/ieee1394_core.c (original) +++ trunk/ieee1394_core.c 2002-10-20 02:46:44.000000000 -0400 @@ -1223,8 +1223,6 @@ /** ieee1394_transactions.c **/ EXPORT_SYMBOL(hpsb_get_tlabel); EXPORT_SYMBOL(hpsb_free_tlabel); -EXPORT_SYMBOL(fill_async_writequad); -EXPORT_SYMBOL(fill_async_writeblock); EXPORT_SYMBOL(hpsb_make_readpacket); EXPORT_SYMBOL(hpsb_make_lockpacket); EXPORT_SYMBOL(hpsb_make_lock64packet); Modified: trunk/ieee1394_transactions.c ============================================================================== --- trunk/ieee1394_transactions.c (original) +++ trunk/ieee1394_transactions.c 2002-10-20 02:46:44.000000000 -0400 @@ -47,7 +47,7 @@ packet->expect_response = 1; } -void fill_async_writequad(struct hpsb_packet *packet, u64 addr, quadlet_t data) +static void fill_async_writequad(struct hpsb_packet *packet, u64 addr, quadlet_t data) { PREP_ASYNC_HEAD_ADDRESS(TCODE_WRITEQ); packet->header[3] = data; @@ -56,7 +56,7 @@ packet->expect_response = 1; } -void fill_async_writeblock(struct hpsb_packet *packet, u64 addr, int length) +static void fill_async_writeblock(struct hpsb_packet *packet, u64 addr, int length) { PREP_ASYNC_HEAD_ADDRESS(TCODE_WRITEB); packet->header[3] = length << 16; Modified: trunk/ieee1394_transactions.h ============================================================================== --- trunk/ieee1394_transactions.h (original) +++ trunk/ieee1394_transactions.h 2002-10-20 02:46:44.000000000 -0400 @@ -5,12 +5,6 @@ /* - * Utility functions to fill out packet headers. - */ -void fill_async_writequad(struct hpsb_packet *packet, u64 addr, quadlet_t data); -void fill_async_writeblock(struct hpsb_packet *packet, u64 addr, int length); - -/* * Get and free transaction labels. */ int hpsb_get_tlabel(struct hpsb_packet *packet, int wait); Modified: trunk/sbp2.c ============================================================================== --- trunk/sbp2.c (original) +++ trunk/sbp2.c 2002-10-20 02:46:44.000000000 -0400 @@ -661,91 +661,11 @@ return ((i > 0) ? 0:1); } -/* - * This function is called to initially create a packet pool for use in - * sbp2 I/O requests. This packet pool is used when sending out sbp2 - * command and agent reset requests, and allows us to remove all - * kmallocs/kfrees from the critical I/O paths. - */ -static int sbp2util_create_request_packet_pool(struct sbp2scsi_host_info *hi) +/* Free's an allocated packet */ +static void sbp2_free_packet(struct hpsb_packet *packet) { - struct hpsb_packet *packet; - int i; - - hi->request_packet = kmalloc(sizeof(struct sbp2_request_packet) * SBP2_MAX_REQUEST_PACKETS, - GFP_KERNEL); - - if (!hi->request_packet) { - SBP2_ERR("sbp2util_create_request_packet_pool - packet allocation failed!"); - return(-ENOMEM); - } - memset(hi->request_packet, 0, sizeof(struct sbp2_request_packet) * SBP2_MAX_REQUEST_PACKETS); - - /* - * Create a pool of request packets. Just take the max supported - * concurrent commands and multiply by two to be safe... - */ - for (i=0; i<SBP2_MAX_REQUEST_PACKETS; i++) { - - /* - * Max payload of 8 bytes since the sbp2 command request - * uses a payload of 8 bytes, and agent reset is a quadlet - * write request. Bump this up if we plan on using this - * pool for other stuff. - */ - packet = alloc_hpsb_packet(8); - - if (!packet) { - SBP2_ERR("sbp2util_create_request_packet_pool - packet allocation failed!"); - return(-ENOMEM); - } - - /* - * Put these request packets into a free list - */ - INIT_LIST_HEAD(&hi->request_packet[i].list); - hi->request_packet[i].packet = packet; - - list_add_tail(&hi->request_packet[i].list, &hi->sbp2_req_free); - - } - - return(0); -} - -/* - * This function is called to remove the packet pool. It is called when - * the sbp2 driver is unloaded. - */ -static void sbp2util_remove_request_packet_pool(struct sbp2scsi_host_info *hi) -{ - struct list_head *lh; - struct sbp2_request_packet *request_packet; - unsigned long flags; - - /* - * Go through free list releasing packets - */ - sbp2_spin_lock(&hi->sbp2_request_packet_lock, flags); - while (!list_empty(&hi->sbp2_req_free)) { - - lh = hi->sbp2_req_free.next; - list_del(lh); - - request_packet = list_entry(lh, struct sbp2_request_packet, list); - - /* - * Free the hpsb packets that we allocated for the pool - */ - if (request_packet) { - free_hpsb_packet(request_packet->packet); - } - - } - kfree(hi->request_packet); - sbp2_spin_unlock(&hi->sbp2_request_packet_lock, flags); - - return; + hpsb_free_tlabel(packet); + free_hpsb_packet(packet); } /* @@ -755,93 +675,28 @@ * out a free request packet and re-initialize values in it. I'm sure this * can still stand some more optimization. */ -static struct sbp2_request_packet * -sbp2util_allocate_write_request_packet(struct sbp2scsi_host_info *hi, - struct node_entry *ne, u64 addr, - size_t data_size, - quadlet_t data) { - struct list_head *lh; - struct sbp2_request_packet *request_packet = NULL; +static struct hpsb_packet * +sbp2util_allocate_write_packet(struct sbp2scsi_host_info *hi, + struct node_entry *ne, u64 addr, + size_t data_size, + quadlet_t *data) +{ struct hpsb_packet *packet; - unsigned long flags; - - sbp2_spin_lock(&hi->sbp2_request_packet_lock, flags); - if (!list_empty(&hi->sbp2_req_free)) { - - /* - * Pull out a free request packet - */ - lh = hi->sbp2_req_free.next; - list_del(lh); - - request_packet = list_entry(lh, struct sbp2_request_packet, list); - packet = request_packet->packet; - /* - * Initialize the packet (this is really initialization - * the core 1394 stack should do, but I'm doing it myself - * to avoid the overhead). - */ - packet->data_size = data_size; - INIT_LIST_HEAD(&packet->list); - sema_init(&packet->state_change, 0); - packet->state = hpsb_unused; - packet->data_be = 1; - - hpsb_node_fill_packet(ne, packet); + packet = hpsb_make_writepacket(hi->host, ne->nodeid, + addr, data, data_size); - if (hpsb_get_tlabel(packet, 0)) { - list_add_tail(&request_packet->list, &hi->sbp2_req_free); - SBP2_ERR("sbp2util_allocate_request_packet - no tlabels available!"); - sbp2_spin_unlock(&hi->sbp2_request_packet_lock, flags); - return NULL; - } + if (!packet) + return NULL; - if (!data_size) { - fill_async_writequad(packet, addr, data); - } else { - fill_async_writeblock(packet, addr, data_size); - } + hpsb_set_packet_complete_task(packet, (void (*)(void*))sbp2_free_packet, + packet); - request_packet->hi_context = hi; + hpsb_node_fill_packet(ne, packet); - /* Calls the packet completion to return this to the free list */ - hpsb_set_packet_complete_task(packet, (void (*)(void*))sbp2util_free_request_packet, - request_packet); - - /* - * Now, put the packet on the in-use list. - */ - list_add_tail(&request_packet->list, &hi->sbp2_req_inuse); - - } else { - SBP2_ERR("sbp2util_allocate_request_packet - no packets available!"); - } - sbp2_spin_unlock(&hi->sbp2_request_packet_lock, flags); - - return(request_packet); + return packet; } -/* - * This function is called to return a packet to our packet pool. It is - * also called as a completion routine when a request packet is completed. - */ -static void sbp2util_free_request_packet(struct sbp2_request_packet *request_packet) -{ - unsigned long flags; - struct sbp2scsi_host_info *hi = request_packet->hi_context; - - /* - * Free the tlabel, and return the packet to the free pool. - */ - sbp2_spin_lock(&hi->sbp2_request_packet_lock, flags); - hpsb_free_tlabel(request_packet->packet); - list_del(&request_packet->list); - list_add_tail(&request_packet->list, &hi->sbp2_req_free); - sbp2_spin_unlock(&hi->sbp2_request_packet_lock, flags); - - return; -} /* * This function is called to create a pool of command orbs used for @@ -1189,17 +1044,8 @@ /* Initialize some host stuff */ memset(hi, 0, sizeof(struct sbp2scsi_host_info)); INIT_LIST_HEAD(&hi->list); - INIT_LIST_HEAD(&hi->sbp2_req_inuse); - INIT_LIST_HEAD(&hi->sbp2_req_free); hi->host = host; hi->sbp2_command_lock = SPIN_LOCK_UNLOCKED; - hi->sbp2_request_packet_lock = SPIN_LOCK_UNLOCKED; - - /* Create our request packet pool (pool of packets for use in I/O) */ - if (sbp2util_create_request_packet_pool(hi)) { - SBP2_ERR("sbp2util_create_request_packet_pool failed!"); - return; - } sbp2_spin_lock(&sbp2_host_info_lock, flags); list_add_tail(&hi->list, &sbp2_host_info_list); @@ -1266,7 +1112,6 @@ hi = sbp2_find_host_info(host); if (hi != NULL) { - sbp2util_remove_request_packet_pool(hi); list_del(&hi->list); kfree(hi); } @@ -2014,33 +1859,33 @@ */ static int sbp2_agent_reset(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id, u32 flags) { - struct sbp2_request_packet *agent_reset_request_packet; + struct hpsb_packet *packet; + static quadlet_t data = ntohl(SBP2_AGENT_RESET_DATA) SBP2_DEBUG("sbp2_agent_reset"); /* * Ok, let's write to the target's management agent register */ - agent_reset_request_packet = - sbp2util_allocate_write_request_packet(hi, scsi_id->ne, - scsi_id->sbp2_command_block_agent_addr + - SBP2_AGENT_RESET_OFFSET, - 0, ntohl(SBP2_AGENT_RESET_DATA)); + packet = sbp2util_allocate_write_packet(hi, scsi_id->ne, + scsi_id->sbp2_command_block_agent_addr + + SBP2_AGENT_RESET_OFFSET, + 4, &data); - if (!agent_reset_request_packet) { - SBP2_ERR("sbp2util_allocate_write_request_packet failed"); - return(-EIO); + if (!packet) { + SBP2_ERR("sbp2util_allocate_write_packet failed"); + return(-ENOMEM); } - if (!hpsb_send_packet(agent_reset_request_packet->packet)) { + if (!hpsb_send_packet(packet)) { SBP2_ERR("hpsb_send_packet failed"); - sbp2util_free_request_packet(agent_reset_request_packet); + sbp2_free_packet(packet); return(-EIO); } if (!(flags & SBP2_SEND_NO_WAIT)) { - down(&agent_reset_request_packet->packet->state_change); - down(&agent_reset_request_packet->packet->state_change); + down(&packet->state_change); + down(&packet->state_change); } /* @@ -2049,7 +1894,6 @@ scsi_id->last_orb = NULL; return(0); - } /* @@ -2310,7 +2154,7 @@ static int sbp2_link_orb_command(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id, struct sbp2_command_info *command) { - struct sbp2_request_packet *command_request_packet; + struct hpsb_packet *packet; struct sbp2_command_orb *command_orb = &command->command_orb; outstanding_orb_incr; @@ -2333,25 +2177,24 @@ */ if (hpsb_node_entry_valid(scsi_id->ne)) { - command_request_packet = - sbp2util_allocate_write_request_packet(hi, scsi_id->ne, + packet = sbp2util_allocate_write_packet(hi, scsi_id->ne, scsi_id->sbp2_command_block_agent_addr + - SBP2_ORB_POINTER_OFFSET, 8, 0); + SBP2_ORB_POINTER_OFFSET, 8, NULL); - if (!command_request_packet) { - SBP2_ERR("sbp2util_allocate_write_request_packet failed"); - return(-EIO); + if (!packet) { + SBP2_ERR("sbp2util_allocate_write_packet failed"); + return(-ENOMEM); } - command_request_packet->packet->data[0] = ORB_SET_NODE_ID(hi->host->node_id); - command_request_packet->packet->data[1] = command->command_orb_dma; - sbp2util_cpu_to_be32_buffer(command_request_packet->packet->data, 8); + packet->data[0] = ORB_SET_NODE_ID(hi->host->node_id); + packet->data[1] = command->command_orb_dma; + sbp2util_cpu_to_be32_buffer(packet->data, 8); SBP2_ORB_DEBUG("write command agent, command orb %p", command_orb); - if (!hpsb_send_packet(command_request_packet->packet)) { + if (!hpsb_send_packet(packet)) { SBP2_ERR("hpsb_send_packet failed"); - sbp2util_free_request_packet(command_request_packet); + sbp2_free_packet(packet); return(-EIO); } @@ -2382,22 +2225,22 @@ * Ring the doorbell */ if (hpsb_node_entry_valid(scsi_id->ne)) { + quadlet_t data = cpu_to_be32(command->command_orb_dma); - command_request_packet = sbp2util_allocate_write_request_packet(hi, - scsi_id->ne, - scsi_id->sbp2_command_block_agent_addr + SBP2_DOORBELL_OFFSET, - 0, cpu_to_be32(command->command_orb_dma)); + packet = sbp2util_allocate_write_packet(hi, scsi_id->ne, + scsi_id->sbp2_command_block_agent_addr + + SBP2_DOORBELL_OFFSET, 4, &data); - if (!command_request_packet) { - SBP2_ERR("sbp2util_allocate_write_request_packet failed"); - return(-EIO); + if (!packet) { + SBP2_ERR("sbp2util_allocate_write_packet failed"); + return(-ENOMEM); } SBP2_ORB_DEBUG("ring doorbell, command orb %p", command_orb); - if (!hpsb_send_packet(command_request_packet->packet)) { + if (!hpsb_send_packet(packet)) { SBP2_ERR("hpsb_send_packet failed"); - sbp2util_free_request_packet(command_request_packet); + sbp2_free_packet(packet); return(-EIO); } } Modified: trunk/sbp2.h ============================================================================== --- trunk/sbp2.h (original) +++ trunk/sbp2.h 2002-10-20 02:46:44.000000000 -0400 @@ -317,17 +317,6 @@ #define SBP2_MAX_REQUEST_PACKETS (sbp2_max_outstanding_cmds * 2) #define SBP2_MAX_COMMAND_ORBS (sbp2_max_cmds_per_lun * 2) -/* - * Request packets structure (used for sending command and agent reset packets) - */ -struct sbp2_request_packet { - - struct list_head list; - struct hpsb_packet *packet; - void *hi_context; - -}; - /* This is the two dma types we use for cmd_dma below */ #define CMD_DMA_NONE 0x0 @@ -432,10 +421,9 @@ struct hpsb_host *host; /* - * Spin locks for command processing and packet pool management + * Spin locks for command processing */ spinlock_t sbp2_command_lock; - spinlock_t sbp2_request_packet_lock; /* * This is the scsi host we register with the scsi mid level. @@ -445,21 +433,6 @@ struct Scsi_Host *scsi_host; /* - * Lists keeping track of inuse/free sbp2_request_packets. These structures are - * used for sending out sbp2 command and agent reset packets. We initially create - * a pool of request packets so that we don't have to do any kmallocs while in critical - * I/O paths. - */ - struct list_head sbp2_req_inuse; - struct list_head sbp2_req_free; - - /* - * Here is the pool of request packets. All the hpsb packets (for 1394 bus transactions) - * are allocated at init and simply re-initialized when needed. - */ - struct sbp2_request_packet *request_packet; - - /* * SCSI ID instance data (one for each sbp2 device instance possible) */ struct scsi_id_instance_data *scsi_id[SBP2SCSI_MAX_SCSI_IDS]; @@ -473,13 +446,6 @@ /* * Various utility prototypes */ -static int sbp2util_create_request_packet_pool(struct sbp2scsi_host_info *hi); -static void sbp2util_remove_request_packet_pool(struct sbp2scsi_host_info *hi); -static struct sbp2_request_packet *sbp2util_allocate_write_request_packet(struct sbp2scsi_host_info *hi, - struct node_entry *ne, u64 addr, - size_t data_size, - quadlet_t data); -static void sbp2util_free_request_packet(struct sbp2_request_packet *request_packet); static int sbp2util_create_command_orb_pool(struct scsi_id_instance_data *scsi_id, struct sbp2scsi_host_info *hi); static void sbp2util_remove_command_orb_pool(struct scsi_id_instance_data *scsi_id, struct sbp2scsi_host_info *hi); static struct sbp2_command_info *sbp2util_find_command_for_orb(struct scsi_id_instance_data *scsi_id, dma_addr_t orb); Modified: trunk/TODO ============================================================================== --- trunk/TODO (original) +++ trunk/TODO 2002-10-20 02:46:44.000000000 -0400 @@ -1,3 +1 @@ - Cleanup headers. Things really need to be reorged. -- Label function groups exported in ieee1384_core.c as to which file each - group comes from. |