···126#define ZFCP_MIN_OUTPUT_THRESHOLD 1 /* ignored by QDIO layer */127128#define QDIO_SCSI_QFMT 1 /* 1 for FSF */0129130/********************* FSF SPECIFIC DEFINES *********************************/131
···126#define ZFCP_MIN_OUTPUT_THRESHOLD 1 /* ignored by QDIO layer */127128#define QDIO_SCSI_QFMT 1 /* 1 for FSF */129+#define QBUFF_PER_PAGE (PAGE_SIZE / sizeof(struct qdio_buffer))130131/********************* FSF SPECIFIC DEFINES *********************************/132
+37-86
drivers/s390/scsi/zfcp_qdio.c
···47#define ZFCP_LOG_AREA ZFCP_LOG_AREA_QDIO4849/*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 allocated56- * locks: must only be called with zfcp_data.config_sema taken57- */58-static int59-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 * Frees BUFFER memory for each of the pointers of the struct qdio_buffer array93- * in the adapter struct cur_buf is the pointer array and count can be any94- * number of buffers in the array that should be freed starting from buffer 095 *96 * locks: must only be called with zfcp_data.config_sema taken97 */98static void99-zfcp_qdio_buffers_dequeue(struct qdio_buffer **cur_buf, int count)100{101- int buf_pos;102- int qdio_buffers_per_page;103104- qdio_buffers_per_page = PAGE_SIZE / sizeof (struct qdio_buffer);105- ZFCP_LOG_TRACE("buffers_per_page=%d\n", qdio_buffers_per_page);0106107- for (buf_pos = 0; buf_pos < count; buf_pos += qdio_buffers_per_page)108- free_page((unsigned long) cur_buf[buf_pos]);109- return;000000000000000000000110}111112/* locks: must only be called with zfcp_data.config_sema taken */113int114zfcp_qdio_allocate_queues(struct zfcp_adapter *adapter)115{116- int buffer_count;117- int retval = 0;118119- 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;147}148149/* locks: must only be called with zfcp_data.config_sema taken */···104zfcp_qdio_free_queues(struct zfcp_adapter *adapter)105{106 ZFCP_LOG_TRACE("freeing request_queue buffers\n");107- zfcp_qdio_buffers_dequeue(&(adapter->request_queue.buffer[0]),108- QDIO_MAX_BUFFERS_PER_Q);109110 ZFCP_LOG_TRACE("freeing response_queue buffers\n");111- zfcp_qdio_buffers_dequeue(&(adapter->response_queue.buffer[0]),112- QDIO_MAX_BUFFERS_PER_Q);113}114115int
···47#define ZFCP_LOG_AREA ZFCP_LOG_AREA_QDIO4849/*00000000000000000000000000000000000000000050 * Frees BUFFER memory for each of the pointers of the struct qdio_buffer array51+ * in the adapter struct sbuf is the pointer array.052 *53 * locks: must only be called with zfcp_data.config_sema taken54 */55static void56+zfcp_qdio_buffers_dequeue(struct qdio_buffer **sbuf)57{58+ int pos;05960+ for (pos = 0; pos < QDIO_MAX_BUFFERS_PER_Q; pos += QBUFF_PER_PAGE)61+ free_page((unsigned long) sbuf[pos]);62+}6364+/*65+ * Allocates BUFFER memory to each of the pointers of the qdio_buffer_t66+ * array in the adapter struct.67+ * Cur_buf is the pointer array68+ *69+ * returns: zero on success else -ENOMEM70+ * locks: must only be called with zfcp_data.config_sema taken71+ */72+static int73+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;88}8990/* locks: must only be called with zfcp_data.config_sema taken */91int92zfcp_qdio_allocate_queues(struct zfcp_adapter *adapter)93{94+ int ret;09596+ 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);000000000000000000000000100}101102/* locks: must only be called with zfcp_data.config_sema taken */···151zfcp_qdio_free_queues(struct zfcp_adapter *adapter)152{153 ZFCP_LOG_TRACE("freeing request_queue buffers\n");154+ zfcp_qdio_buffers_dequeue(adapter->request_queue.buffer);0155156 ZFCP_LOG_TRACE("freeing response_queue buffers\n");157+ zfcp_qdio_buffers_dequeue(adapter->response_queue.buffer);0158}159160int