[SCSI] zfcp: code cleanup

improve code for buffer enqueue. easy readability and maintainability.

Signed-off-by: Swen Schillig <swen@vnet.ibm.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>

authored by

Swen Schillig and committed by
James Bottomley
b4e44590 aa551daf

+38 -86
+1
drivers/s390/scsi/zfcp_def.h
··· 126 126 #define ZFCP_MIN_OUTPUT_THRESHOLD 1 /* ignored by QDIO layer */ 127 127 128 128 #define QDIO_SCSI_QFMT 1 /* 1 for FSF */ 129 + #define QBUFF_PER_PAGE (PAGE_SIZE / sizeof(struct qdio_buffer)) 129 130 130 131 /********************* FSF SPECIFIC DEFINES *********************************/ 131 132
+37 -86
drivers/s390/scsi/zfcp_qdio.c
··· 47 47 #define ZFCP_LOG_AREA ZFCP_LOG_AREA_QDIO 48 48 49 49 /* 50 - * Allocates BUFFER memory to each of the pointers of the qdio_buffer_t 51 - * array in the adapter struct. 52 - * Cur_buf is the pointer array and count can be any number of required 53 - * buffers, the page-fitting arithmetic is done entirely within this funciton. 54 - * 55 - * returns: number of buffers allocated 56 - * locks: must only be called with zfcp_data.config_sema taken 57 - */ 58 - static int 59 - zfcp_qdio_buffers_enqueue(struct qdio_buffer **cur_buf, int count) 60 - { 61 - int buf_pos; 62 - int qdio_buffers_per_page; 63 - int page_pos = 0; 64 - struct qdio_buffer *first_in_page = NULL; 65 - 66 - qdio_buffers_per_page = PAGE_SIZE / sizeof (struct qdio_buffer); 67 - ZFCP_LOG_TRACE("buffers_per_page=%d\n", qdio_buffers_per_page); 68 - 69 - for (buf_pos = 0; buf_pos < count; buf_pos++) { 70 - if (page_pos == 0) { 71 - cur_buf[buf_pos] = (struct qdio_buffer *) 72 - get_zeroed_page(GFP_KERNEL); 73 - if (cur_buf[buf_pos] == NULL) { 74 - ZFCP_LOG_INFO("error: allocation of " 75 - "QDIO buffer failed \n"); 76 - goto out; 77 - } 78 - first_in_page = cur_buf[buf_pos]; 79 - } else { 80 - cur_buf[buf_pos] = first_in_page + page_pos; 81 - 82 - } 83 - /* was initialised to zero */ 84 - page_pos++; 85 - page_pos %= qdio_buffers_per_page; 86 - } 87 - out: 88 - return buf_pos; 89 - } 90 - 91 - /* 92 50 * Frees BUFFER memory for each of the pointers of the struct qdio_buffer array 93 - * in the adapter struct cur_buf is the pointer array and count can be any 94 - * number of buffers in the array that should be freed starting from buffer 0 51 + * in the adapter struct sbuf is the pointer array. 95 52 * 96 53 * locks: must only be called with zfcp_data.config_sema taken 97 54 */ 98 55 static void 99 - zfcp_qdio_buffers_dequeue(struct qdio_buffer **cur_buf, int count) 56 + zfcp_qdio_buffers_dequeue(struct qdio_buffer **sbuf) 100 57 { 101 - int buf_pos; 102 - int qdio_buffers_per_page; 58 + int pos; 103 59 104 - qdio_buffers_per_page = PAGE_SIZE / sizeof (struct qdio_buffer); 105 - ZFCP_LOG_TRACE("buffers_per_page=%d\n", qdio_buffers_per_page); 60 + for (pos = 0; pos < QDIO_MAX_BUFFERS_PER_Q; pos += QBUFF_PER_PAGE) 61 + free_page((unsigned long) sbuf[pos]); 62 + } 106 63 107 - for (buf_pos = 0; buf_pos < count; buf_pos += qdio_buffers_per_page) 108 - free_page((unsigned long) cur_buf[buf_pos]); 109 - return; 64 + /* 65 + * Allocates BUFFER memory to each of the pointers of the qdio_buffer_t 66 + * array in the adapter struct. 67 + * Cur_buf is the pointer array 68 + * 69 + * returns: zero on success else -ENOMEM 70 + * locks: must only be called with zfcp_data.config_sema taken 71 + */ 72 + static int 73 + zfcp_qdio_buffers_enqueue(struct qdio_buffer **sbuf) 74 + { 75 + int pos; 76 + 77 + for (pos = 0; pos < QDIO_MAX_BUFFERS_PER_Q; pos += QBUFF_PER_PAGE) { 78 + sbuf[pos] = (struct qdio_buffer *) get_zeroed_page(GFP_KERNEL); 79 + if (!sbuf[pos]) { 80 + zfcp_qdio_buffers_dequeue(sbuf); 81 + return -ENOMEM; 82 + } 83 + } 84 + for (pos = 0; pos < QDIO_MAX_BUFFERS_PER_Q; pos++) 85 + if (pos % QBUFF_PER_PAGE) 86 + sbuf[pos] = sbuf[pos - 1] + 1; 87 + return 0; 110 88 } 111 89 112 90 /* locks: must only be called with zfcp_data.config_sema taken */ 113 91 int 114 92 zfcp_qdio_allocate_queues(struct zfcp_adapter *adapter) 115 93 { 116 - int buffer_count; 117 - int retval = 0; 94 + int ret; 118 95 119 - buffer_count = 120 - zfcp_qdio_buffers_enqueue(&(adapter->request_queue.buffer[0]), 121 - QDIO_MAX_BUFFERS_PER_Q); 122 - if (buffer_count < QDIO_MAX_BUFFERS_PER_Q) { 123 - ZFCP_LOG_DEBUG("only %d QDIO buffers allocated for request " 124 - "queue\n", buffer_count); 125 - zfcp_qdio_buffers_dequeue(&(adapter->request_queue.buffer[0]), 126 - buffer_count); 127 - retval = -ENOMEM; 128 - goto out; 129 - } 130 - 131 - buffer_count = 132 - zfcp_qdio_buffers_enqueue(&(adapter->response_queue.buffer[0]), 133 - QDIO_MAX_BUFFERS_PER_Q); 134 - if (buffer_count < QDIO_MAX_BUFFERS_PER_Q) { 135 - ZFCP_LOG_DEBUG("only %d QDIO buffers allocated for response " 136 - "queue", buffer_count); 137 - zfcp_qdio_buffers_dequeue(&(adapter->response_queue.buffer[0]), 138 - buffer_count); 139 - ZFCP_LOG_TRACE("freeing request_queue buffers\n"); 140 - zfcp_qdio_buffers_dequeue(&(adapter->request_queue.buffer[0]), 141 - QDIO_MAX_BUFFERS_PER_Q); 142 - retval = -ENOMEM; 143 - goto out; 144 - } 145 - out: 146 - return retval; 96 + ret = zfcp_qdio_buffers_enqueue(adapter->request_queue.buffer); 97 + if (ret) 98 + return ret; 99 + return zfcp_qdio_buffers_enqueue(adapter->response_queue.buffer); 147 100 } 148 101 149 102 /* locks: must only be called with zfcp_data.config_sema taken */ ··· 104 151 zfcp_qdio_free_queues(struct zfcp_adapter *adapter) 105 152 { 106 153 ZFCP_LOG_TRACE("freeing request_queue buffers\n"); 107 - zfcp_qdio_buffers_dequeue(&(adapter->request_queue.buffer[0]), 108 - QDIO_MAX_BUFFERS_PER_Q); 154 + zfcp_qdio_buffers_dequeue(adapter->request_queue.buffer); 109 155 110 156 ZFCP_LOG_TRACE("freeing response_queue buffers\n"); 111 - zfcp_qdio_buffers_dequeue(&(adapter->response_queue.buffer[0]), 112 - QDIO_MAX_BUFFERS_PER_Q); 157 + zfcp_qdio_buffers_dequeue(adapter->response_queue.buffer); 113 158 } 114 159 115 160 int