Commit f81649df authored by Julian Wiedmann's avatar Julian Wiedmann Committed by David S. Miller

s390/qeth: use page pointers to manage RX buffer pool

The RX buffer elements are always backed with full pages, reflect this
in the pointer type.
Signed-off-by: default avatarJulian Wiedmann <jwi@linux.ibm.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 26776253
...@@ -369,7 +369,7 @@ enum qeth_qdio_info_states { ...@@ -369,7 +369,7 @@ enum qeth_qdio_info_states {
struct qeth_buffer_pool_entry { struct qeth_buffer_pool_entry {
struct list_head list; struct list_head list;
struct list_head init_list; struct list_head init_list;
void *elements[QDIO_MAX_ELEMENTS_PER_BUFFER]; struct page *elements[QDIO_MAX_ELEMENTS_PER_BUFFER];
}; };
struct qeth_qdio_buffer_pool { struct qeth_qdio_buffer_pool {
......
...@@ -215,7 +215,6 @@ EXPORT_SYMBOL_GPL(qeth_clear_working_pool_list); ...@@ -215,7 +215,6 @@ EXPORT_SYMBOL_GPL(qeth_clear_working_pool_list);
static int qeth_alloc_buffer_pool(struct qeth_card *card) static int qeth_alloc_buffer_pool(struct qeth_card *card)
{ {
struct qeth_buffer_pool_entry *pool_entry; struct qeth_buffer_pool_entry *pool_entry;
void *ptr;
int i, j; int i, j;
QETH_CARD_TEXT(card, 5, "alocpool"); QETH_CARD_TEXT(card, 5, "alocpool");
...@@ -225,17 +224,18 @@ static int qeth_alloc_buffer_pool(struct qeth_card *card) ...@@ -225,17 +224,18 @@ static int qeth_alloc_buffer_pool(struct qeth_card *card)
qeth_free_buffer_pool(card); qeth_free_buffer_pool(card);
return -ENOMEM; return -ENOMEM;
} }
for (j = 0; j < QETH_MAX_BUFFER_ELEMENTS(card); ++j) { for (j = 0; j < QETH_MAX_BUFFER_ELEMENTS(card); ++j) {
ptr = (void *) __get_free_page(GFP_KERNEL); struct page *page = alloc_page(GFP_KERNEL);
if (!ptr) {
if (!page) {
while (j > 0) while (j > 0)
free_page((unsigned long) __free_page(pool_entry->elements[--j]);
pool_entry->elements[--j]);
kfree(pool_entry); kfree(pool_entry);
qeth_free_buffer_pool(card); qeth_free_buffer_pool(card);
return -ENOMEM; return -ENOMEM;
} }
pool_entry->elements[j] = ptr; pool_entry->elements[j] = page;
} }
list_add(&pool_entry->init_list, list_add(&pool_entry->init_list,
&card->qdio.init_pool.entry_list); &card->qdio.init_pool.entry_list);
...@@ -1177,7 +1177,7 @@ static void qeth_free_buffer_pool(struct qeth_card *card) ...@@ -1177,7 +1177,7 @@ static void qeth_free_buffer_pool(struct qeth_card *card)
list_for_each_entry_safe(pool_entry, tmp, list_for_each_entry_safe(pool_entry, tmp,
&card->qdio.init_pool.entry_list, init_list){ &card->qdio.init_pool.entry_list, init_list){
for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i) for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i)
free_page((unsigned long)pool_entry->elements[i]); __free_page(pool_entry->elements[i]);
list_del(&pool_entry->init_list); list_del(&pool_entry->init_list);
kfree(pool_entry); kfree(pool_entry);
} }
...@@ -2573,7 +2573,6 @@ static struct qeth_buffer_pool_entry *qeth_find_free_buffer_pool_entry( ...@@ -2573,7 +2573,6 @@ static struct qeth_buffer_pool_entry *qeth_find_free_buffer_pool_entry(
struct list_head *plh; struct list_head *plh;
struct qeth_buffer_pool_entry *entry; struct qeth_buffer_pool_entry *entry;
int i, free; int i, free;
struct page *page;
if (list_empty(&card->qdio.in_buf_pool.entry_list)) if (list_empty(&card->qdio.in_buf_pool.entry_list))
return NULL; return NULL;
...@@ -2582,7 +2581,7 @@ static struct qeth_buffer_pool_entry *qeth_find_free_buffer_pool_entry( ...@@ -2582,7 +2581,7 @@ static struct qeth_buffer_pool_entry *qeth_find_free_buffer_pool_entry(
entry = list_entry(plh, struct qeth_buffer_pool_entry, list); entry = list_entry(plh, struct qeth_buffer_pool_entry, list);
free = 1; free = 1;
for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i) { for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i) {
if (page_count(virt_to_page(entry->elements[i])) > 1) { if (page_count(entry->elements[i]) > 1) {
free = 0; free = 0;
break; break;
} }
...@@ -2597,17 +2596,17 @@ static struct qeth_buffer_pool_entry *qeth_find_free_buffer_pool_entry( ...@@ -2597,17 +2596,17 @@ static struct qeth_buffer_pool_entry *qeth_find_free_buffer_pool_entry(
entry = list_entry(card->qdio.in_buf_pool.entry_list.next, entry = list_entry(card->qdio.in_buf_pool.entry_list.next,
struct qeth_buffer_pool_entry, list); struct qeth_buffer_pool_entry, list);
for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i) { for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i) {
if (page_count(virt_to_page(entry->elements[i])) > 1) { if (page_count(entry->elements[i]) > 1) {
page = alloc_page(GFP_ATOMIC); struct page *page = alloc_page(GFP_ATOMIC);
if (!page) {
if (!page)
return NULL; return NULL;
} else {
free_page((unsigned long)entry->elements[i]); __free_page(entry->elements[i]);
entry->elements[i] = page_address(page); entry->elements[i] = page;
QETH_CARD_STAT_INC(card, rx_sg_alloc_page); QETH_CARD_STAT_INC(card, rx_sg_alloc_page);
} }
} }
}
list_del_init(&entry->list); list_del_init(&entry->list);
return entry; return entry;
} }
...@@ -2641,7 +2640,7 @@ static int qeth_init_input_buffer(struct qeth_card *card, ...@@ -2641,7 +2640,7 @@ static int qeth_init_input_buffer(struct qeth_card *card,
for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i) { for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i) {
buf->buffer->element[i].length = PAGE_SIZE; buf->buffer->element[i].length = PAGE_SIZE;
buf->buffer->element[i].addr = buf->buffer->element[i].addr =
virt_to_phys(pool_entry->elements[i]); page_to_phys(pool_entry->elements[i]);
if (i == QETH_MAX_BUFFER_ELEMENTS(card) - 1) if (i == QETH_MAX_BUFFER_ELEMENTS(card) - 1)
buf->buffer->element[i].eflags = SBAL_EFLAGS_LAST_ENTRY; buf->buffer->element[i].eflags = SBAL_EFLAGS_LAST_ENTRY;
else else
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment