aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ehea/ehea_qmr.c
diff options
context:
space:
mode:
authorJan-Bernd Themann <ossthema@de.ibm.com>2007-10-01 10:33:18 -0400
committerDavid S. Miller <davem@sunset.davemloft.net>2007-10-10 19:54:05 -0400
commit2c69448bbcedebeb8409ddb05fbc7d3fe1cfbda7 (patch)
tree143d29f88c4983f0437b9114c0784469f59a956a /drivers/net/ehea/ehea_qmr.c
parent31a5bb04d59931eb4657826213a439d37d12d4a9 (diff)
ehea: DLPAR memory add fix
Due to stability issues in high load situations the HW queue handling has to be changed. The HW queues are now stopped and restarted again instead of destroying and allocating new HW queues. Signed-off-by: Jan-Bernd Themann <themann@de.ibm.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers/net/ehea/ehea_qmr.c')
-rw-r--r--drivers/net/ehea/ehea_qmr.c20
1 files changed, 8 insertions, 12 deletions
diff --git a/drivers/net/ehea/ehea_qmr.c b/drivers/net/ehea/ehea_qmr.c
index c82e24596074..329a25248d75 100644
--- a/drivers/net/ehea/ehea_qmr.c
+++ b/drivers/net/ehea/ehea_qmr.c
@@ -563,8 +563,7 @@ int ehea_destroy_qp(struct ehea_qp *qp)
563int ehea_create_busmap( void ) 563int ehea_create_busmap( void )
564{ 564{
565 u64 vaddr = EHEA_BUSMAP_START; 565 u64 vaddr = EHEA_BUSMAP_START;
566 unsigned long abs_max_pfn = 0; 566 unsigned long high_section_index = 0;
567 unsigned long sec_max_pfn;
568 int i; 567 int i;
569 568
570 /* 569 /*
@@ -574,14 +573,10 @@ int ehea_create_busmap( void )
574 ehea_bmap.valid_sections = 0; 573 ehea_bmap.valid_sections = 0;
575 574
576 for (i = 0; i < NR_MEM_SECTIONS; i++) 575 for (i = 0; i < NR_MEM_SECTIONS; i++)
577 if (valid_section_nr(i)) { 576 if (valid_section_nr(i))
578 sec_max_pfn = section_nr_to_pfn(i); 577 high_section_index = i;
579 if (sec_max_pfn > abs_max_pfn)
580 abs_max_pfn = sec_max_pfn;
581 ehea_bmap.valid_sections++;
582 }
583 578
584 ehea_bmap.entries = abs_max_pfn / EHEA_PAGES_PER_SECTION + 1; 579 ehea_bmap.entries = high_section_index + 1;
585 ehea_bmap.vaddr = vmalloc(ehea_bmap.entries * sizeof(*ehea_bmap.vaddr)); 580 ehea_bmap.vaddr = vmalloc(ehea_bmap.entries * sizeof(*ehea_bmap.vaddr));
586 581
587 if (!ehea_bmap.vaddr) 582 if (!ehea_bmap.vaddr)
@@ -593,6 +588,7 @@ int ehea_create_busmap( void )
593 if (pfn_valid(pfn)) { 588 if (pfn_valid(pfn)) {
594 ehea_bmap.vaddr[i] = vaddr; 589 ehea_bmap.vaddr[i] = vaddr;
595 vaddr += EHEA_SECTSIZE; 590 vaddr += EHEA_SECTSIZE;
591 ehea_bmap.valid_sections++;
596 } else 592 } else
597 ehea_bmap.vaddr[i] = 0; 593 ehea_bmap.vaddr[i] = 0;
598 } 594 }
@@ -637,7 +633,7 @@ int ehea_reg_kernel_mr(struct ehea_adapter *adapter, struct ehea_mr *mr)
637 633
638 mr_len = ehea_bmap.valid_sections * EHEA_SECTSIZE; 634 mr_len = ehea_bmap.valid_sections * EHEA_SECTSIZE;
639 635
640 pt = kzalloc(EHEA_MAX_RPAGE * sizeof(u64), GFP_KERNEL); 636 pt = kzalloc(PAGE_SIZE, GFP_KERNEL);
641 if (!pt) { 637 if (!pt) {
642 ehea_error("no mem"); 638 ehea_error("no mem");
643 ret = -ENOMEM; 639 ret = -ENOMEM;
@@ -660,8 +656,8 @@ int ehea_reg_kernel_mr(struct ehea_adapter *adapter, struct ehea_mr *mr)
660 void *sectbase = __va(i << SECTION_SIZE_BITS); 656 void *sectbase = __va(i << SECTION_SIZE_BITS);
661 unsigned long k = 0; 657 unsigned long k = 0;
662 658
663 for (j = 0; j < (PAGES_PER_SECTION / EHEA_MAX_RPAGE); 659 for (j = 0; j < (EHEA_PAGES_PER_SECTION /
664 j++) { 660 EHEA_MAX_RPAGE); j++) {
665 661
666 for (m = 0; m < EHEA_MAX_RPAGE; m++) { 662 for (m = 0; m < EHEA_MAX_RPAGE; m++) {
667 pg = sectbase + ((k++) * EHEA_PAGESIZE); 663 pg = sectbase + ((k++) * EHEA_PAGESIZE);