IB/ehca: Use proper GFP_ flags for get_zeroed_page()

Here is a patch for ehca to use proper flag, ie. GFP_ATOMIC
resp. GFP_KERNEL, when calling get_zeroed_page() to prevent "Bug:
scheduling while atomic...". This error does not cause a kernel panic
but makes ipoib un-usable afterwards. It is reproducible on
2.6.20-rc4 if one does ifconfig down during a flood ping test. I have
not observed this error in earlier releases incl. 2.6.20-rc1.

This error occurs when a qp event/irq is received and ehca event
handler allocates a control block/page to obtain HCA error data block.
Use of GFP_ATOMIC when in interrupt context prevents this issue.

Signed-off-by Hoang-Nam Nguyen <hnguyen@de.ibm.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>

authored by Hoang-Nam Nguyen and committed by Roland Dreier f2d91361 98714cb1

+16 -16
+4 -4
drivers/infiniband/hw/ehca/ehca_hca.c
··· 50 50 ib_device); 51 51 struct hipz_query_hca *rblock; 52 52 53 - rblock = ehca_alloc_fw_ctrlblock(); 53 + rblock = ehca_alloc_fw_ctrlblock(GFP_KERNEL); 54 54 if (!rblock) { 55 55 ehca_err(&shca->ib_device, "Can't allocate rblock memory."); 56 56 return -ENOMEM; ··· 110 110 ib_device); 111 111 struct hipz_query_port *rblock; 112 112 113 - rblock = ehca_alloc_fw_ctrlblock(); 113 + rblock = ehca_alloc_fw_ctrlblock(GFP_KERNEL); 114 114 if (!rblock) { 115 115 ehca_err(&shca->ib_device, "Can't allocate rblock memory."); 116 116 return -ENOMEM; ··· 179 179 return -EINVAL; 180 180 } 181 181 182 - rblock = ehca_alloc_fw_ctrlblock(); 182 + rblock = ehca_alloc_fw_ctrlblock(GFP_KERNEL); 183 183 if (!rblock) { 184 184 ehca_err(&shca->ib_device, "Can't allocate rblock memory."); 185 185 return -ENOMEM; ··· 212 212 return -EINVAL; 213 213 } 214 214 215 - rblock = ehca_alloc_fw_ctrlblock(); 215 + rblock = ehca_alloc_fw_ctrlblock(GFP_KERNEL); 216 216 if (!rblock) { 217 217 ehca_err(&shca->ib_device, "Can't allocate rblock memory."); 218 218 return -ENOMEM;
+1 -1
drivers/infiniband/hw/ehca/ehca_irq.c
··· 138 138 u64 *rblock; 139 139 unsigned long block_count; 140 140 141 - rblock = ehca_alloc_fw_ctrlblock(); 141 + rblock = ehca_alloc_fw_ctrlblock(GFP_ATOMIC); 142 142 if (!rblock) { 143 143 ehca_err(&shca->ib_device, "Cannot allocate rblock memory."); 144 144 ret = -ENOMEM;
+2 -2
drivers/infiniband/hw/ehca/ehca_iverbs.h
··· 180 180 int ehca_munmap(unsigned long addr, size_t len); 181 181 182 182 #ifdef CONFIG_PPC_64K_PAGES 183 - void *ehca_alloc_fw_ctrlblock(void); 183 + void *ehca_alloc_fw_ctrlblock(gfp_t flags); 184 184 void ehca_free_fw_ctrlblock(void *ptr); 185 185 #else 186 - #define ehca_alloc_fw_ctrlblock() ((void *) get_zeroed_page(GFP_KERNEL)) 186 + #define ehca_alloc_fw_ctrlblock(flags) ((void *) get_zeroed_page(flags)) 187 187 #define ehca_free_fw_ctrlblock(ptr) free_page((unsigned long)(ptr)) 188 188 #endif 189 189
+5 -5
drivers/infiniband/hw/ehca/ehca_main.c
··· 106 106 #ifdef CONFIG_PPC_64K_PAGES 107 107 static struct kmem_cache *ctblk_cache = NULL; 108 108 109 - void *ehca_alloc_fw_ctrlblock(void) 109 + void *ehca_alloc_fw_ctrlblock(gfp_t flags) 110 110 { 111 - void *ret = kmem_cache_zalloc(ctblk_cache, GFP_KERNEL); 111 + void *ret = kmem_cache_zalloc(ctblk_cache, flags); 112 112 if (!ret) 113 113 ehca_gen_err("Out of memory for ctblk"); 114 114 return ret; ··· 206 206 u64 h_ret; 207 207 struct hipz_query_hca *rblock; 208 208 209 - rblock = ehca_alloc_fw_ctrlblock(); 209 + rblock = ehca_alloc_fw_ctrlblock(GFP_KERNEL); 210 210 if (!rblock) { 211 211 ehca_gen_err("Cannot allocate rblock memory."); 212 212 return -ENOMEM; ··· 258 258 int ret = 0; 259 259 struct hipz_query_hca *rblock; 260 260 261 - rblock = ehca_alloc_fw_ctrlblock(); 261 + rblock = ehca_alloc_fw_ctrlblock(GFP_KERNEL); 262 262 if (!rblock) { 263 263 ehca_err(&shca->ib_device, "Can't allocate rblock memory."); 264 264 return -ENOMEM; ··· 469 469 \ 470 470 shca = dev->driver_data; \ 471 471 \ 472 - rblock = ehca_alloc_fw_ctrlblock(); \ 472 + rblock = ehca_alloc_fw_ctrlblock(GFP_KERNEL); \ 473 473 if (!rblock) { \ 474 474 dev_err(dev, "Can't allocate rblock memory."); \ 475 475 return 0; \
+2 -2
drivers/infiniband/hw/ehca/ehca_mrmw.c
··· 1013 1013 u32 i; 1014 1014 u64 *kpage; 1015 1015 1016 - kpage = ehca_alloc_fw_ctrlblock(); 1016 + kpage = ehca_alloc_fw_ctrlblock(GFP_KERNEL); 1017 1017 if (!kpage) { 1018 1018 ehca_err(&shca->ib_device, "kpage alloc failed"); 1019 1019 ret = -ENOMEM; ··· 1124 1124 ehca_mrmw_map_acl(acl, &hipz_acl); 1125 1125 ehca_mrmw_set_pgsize_hipz_acl(&hipz_acl); 1126 1126 1127 - kpage = ehca_alloc_fw_ctrlblock(); 1127 + kpage = ehca_alloc_fw_ctrlblock(GFP_KERNEL); 1128 1128 if (!kpage) { 1129 1129 ehca_err(&shca->ib_device, "kpage alloc failed"); 1130 1130 ret = -ENOMEM;
+2 -2
drivers/infiniband/hw/ehca/ehca_qp.c
··· 807 807 unsigned long spl_flags = 0; 808 808 809 809 /* do query_qp to obtain current attr values */ 810 - mqpcb = ehca_alloc_fw_ctrlblock(); 810 + mqpcb = ehca_alloc_fw_ctrlblock(GFP_KERNEL); 811 811 if (!mqpcb) { 812 812 ehca_err(ibqp->device, "Could not get zeroed page for mqpcb " 813 813 "ehca_qp=%p qp_num=%x ", my_qp, ibqp->qp_num); ··· 1273 1273 return -EINVAL; 1274 1274 } 1275 1275 1276 - qpcb = ehca_alloc_fw_ctrlblock(); 1276 + qpcb = ehca_alloc_fw_ctrlblock(GFP_KERNEL); 1277 1277 if (!qpcb) { 1278 1278 ehca_err(qp->device,"Out of memory for qpcb " 1279 1279 "ehca_qp=%p qp_num=%x", my_qp, qp->qp_num);