···126126#define ZFCP_MIN_OUTPUT_THRESHOLD 1 /* ignored by QDIO layer */127127128128#define QDIO_SCSI_QFMT 1 /* 1 for FSF */129129+#define QBUFF_PER_PAGE (PAGE_SIZE / sizeof(struct qdio_buffer))129130130131/********************* FSF SPECIFIC DEFINES *********************************/131132
+37-86
drivers/s390/scsi/zfcp_qdio.c
···4747#define ZFCP_LOG_AREA ZFCP_LOG_AREA_QDIO48484949/*5050- * Allocates BUFFER memory to each of the pointers of the qdio_buffer_t 5151- * array in the adapter struct.5252- * Cur_buf is the pointer array and count can be any number of required 5353- * buffers, the page-fitting arithmetic is done entirely within this funciton.5454- *5555- * returns: number of buffers allocated5656- * locks: must only be called with zfcp_data.config_sema taken5757- */5858-static int5959-zfcp_qdio_buffers_enqueue(struct qdio_buffer **cur_buf, int count)6060-{6161- int buf_pos;6262- int qdio_buffers_per_page;6363- int page_pos = 0;6464- struct qdio_buffer *first_in_page = NULL;6565-6666- qdio_buffers_per_page = PAGE_SIZE / sizeof (struct qdio_buffer);6767- ZFCP_LOG_TRACE("buffers_per_page=%d\n", qdio_buffers_per_page);6868-6969- for (buf_pos = 0; buf_pos < count; buf_pos++) {7070- if (page_pos == 0) {7171- cur_buf[buf_pos] = (struct qdio_buffer *)7272- get_zeroed_page(GFP_KERNEL);7373- if (cur_buf[buf_pos] == NULL) {7474- ZFCP_LOG_INFO("error: allocation of "7575- "QDIO buffer failed \n");7676- goto out;7777- }7878- first_in_page = cur_buf[buf_pos];7979- } else {8080- cur_buf[buf_pos] = first_in_page + page_pos;8181-8282- }8383- /* was initialised to zero */8484- page_pos++;8585- page_pos %= qdio_buffers_per_page;8686- }8787- out:8888- return buf_pos;8989-}9090-9191-/*9250 * Frees BUFFER memory for each of the pointers of the struct qdio_buffer array9393- * in the adapter struct cur_buf is the pointer array and count can be any9494- * number of buffers in the array that should be freed starting from buffer 05151+ * in the adapter struct sbuf is the pointer array.9552 *9653 * locks: must only be called with zfcp_data.config_sema taken9754 */9855static void9999-zfcp_qdio_buffers_dequeue(struct qdio_buffer **cur_buf, int count)5656+zfcp_qdio_buffers_dequeue(struct qdio_buffer **sbuf)10057{101101- int buf_pos;102102- int qdio_buffers_per_page;5858+ int pos;10359104104- qdio_buffers_per_page = PAGE_SIZE / sizeof (struct qdio_buffer);105105- ZFCP_LOG_TRACE("buffers_per_page=%d\n", qdio_buffers_per_page);6060+ for (pos = 0; pos < QDIO_MAX_BUFFERS_PER_Q; pos += QBUFF_PER_PAGE)6161+ free_page((unsigned long) sbuf[pos]);6262+}10663107107- for (buf_pos = 0; buf_pos < count; buf_pos += qdio_buffers_per_page)108108- free_page((unsigned long) cur_buf[buf_pos]);109109- return;6464+/*6565+ * Allocates BUFFER memory to each of the pointers of the qdio_buffer_t6666+ * array in the adapter struct.6767+ * Cur_buf is the pointer array6868+ *6969+ * returns: zero on success else -ENOMEM7070+ * locks: must only be called with zfcp_data.config_sema taken7171+ */7272+static int7373+zfcp_qdio_buffers_enqueue(struct qdio_buffer **sbuf)7474+{7575+ int pos;7676+7777+ for (pos = 0; pos < QDIO_MAX_BUFFERS_PER_Q; pos += QBUFF_PER_PAGE) {7878+ sbuf[pos] = (struct qdio_buffer *) get_zeroed_page(GFP_KERNEL);7979+ if (!sbuf[pos]) {8080+ zfcp_qdio_buffers_dequeue(sbuf);8181+ return -ENOMEM;8282+ }8383+ }8484+ for (pos = 0; pos < QDIO_MAX_BUFFERS_PER_Q; pos++)8585+ if (pos % QBUFF_PER_PAGE)8686+ sbuf[pos] = sbuf[pos - 1] + 1;8787+ return 0;11088}1118911290/* locks: must only be called with zfcp_data.config_sema taken */11391int11492zfcp_qdio_allocate_queues(struct zfcp_adapter *adapter)11593{116116- int buffer_count;117117- int retval = 0;9494+ int ret;11895119119- buffer_count =120120- zfcp_qdio_buffers_enqueue(&(adapter->request_queue.buffer[0]),121121- QDIO_MAX_BUFFERS_PER_Q);122122- if (buffer_count < QDIO_MAX_BUFFERS_PER_Q) {123123- ZFCP_LOG_DEBUG("only %d QDIO buffers allocated for request "124124- "queue\n", buffer_count);125125- zfcp_qdio_buffers_dequeue(&(adapter->request_queue.buffer[0]),126126- buffer_count);127127- retval = -ENOMEM;128128- goto out;129129- }130130-131131- buffer_count =132132- zfcp_qdio_buffers_enqueue(&(adapter->response_queue.buffer[0]),133133- QDIO_MAX_BUFFERS_PER_Q);134134- if (buffer_count < QDIO_MAX_BUFFERS_PER_Q) {135135- ZFCP_LOG_DEBUG("only %d QDIO buffers allocated for response "136136- "queue", buffer_count);137137- zfcp_qdio_buffers_dequeue(&(adapter->response_queue.buffer[0]),138138- buffer_count);139139- ZFCP_LOG_TRACE("freeing request_queue buffers\n");140140- zfcp_qdio_buffers_dequeue(&(adapter->request_queue.buffer[0]),141141- QDIO_MAX_BUFFERS_PER_Q);142142- retval = -ENOMEM;143143- goto out;144144- }145145- out:146146- return retval;9696+ ret = zfcp_qdio_buffers_enqueue(adapter->request_queue.buffer);9797+ if (ret)9898+ return ret;9999+ return zfcp_qdio_buffers_enqueue(adapter->response_queue.buffer);147100}148101149102/* locks: must only be called with zfcp_data.config_sema taken */···104151zfcp_qdio_free_queues(struct zfcp_adapter *adapter)105152{106153 ZFCP_LOG_TRACE("freeing request_queue buffers\n");107107- zfcp_qdio_buffers_dequeue(&(adapter->request_queue.buffer[0]),108108- QDIO_MAX_BUFFERS_PER_Q);154154+ zfcp_qdio_buffers_dequeue(adapter->request_queue.buffer);109155110156 ZFCP_LOG_TRACE("freeing response_queue buffers\n");111111- zfcp_qdio_buffers_dequeue(&(adapter->response_queue.buffer[0]),112112- QDIO_MAX_BUFFERS_PER_Q);157157+ zfcp_qdio_buffers_dequeue(adapter->response_queue.buffer);113158}114159115160int