Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

qeth: postpone freeing of qdio memory

To guarantee that a qdio ccw_device no longer touches the
qdio memory shared with Linux, the qdio ccw_device should
be offline when freeing the qdio memory. Thus this patch
postpones freeing of qdio memory.

Signed-off-by: Ursula Braun <ursula.braun@de.ibm.com>
Signed-off-by: Frank Blaschka <frank.blaschka@de.ibm.com>
Reviewed-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Ursula Braun and committed by
David S. Miller
22ae2790 91a48a2e

+9 -2
+3 -2
drivers/s390/net/qeth_core_main.c
··· 1660 1660 QDIO_FLAG_CLEANUP_USING_CLEAR); 1661 1661 if (rc) 1662 1662 QETH_CARD_TEXT_(card, 3, "1err%d", rc); 1663 - qdio_free(CARD_DDEV(card)); 1664 1663 atomic_set(&card->qdio.state, QETH_QDIO_ALLOCATED); 1665 1664 break; 1666 1665 case QETH_QDIO_CLEANING: ··· 2604 2605 return 0; 2605 2606 out_qdio: 2606 2607 qeth_qdio_clear_card(card, card->info.type != QETH_CARD_TYPE_IQD); 2608 + qdio_free(CARD_DDEV(card)); 2607 2609 return rc; 2608 2610 } 2609 2611 ··· 4906 4906 if (retries < 3) 4907 4907 QETH_DBF_MESSAGE(2, "%s Retrying to do IDX activates.\n", 4908 4908 dev_name(&card->gdev->dev)); 4909 + rc = qeth_qdio_clear_card(card, card->info.type != QETH_CARD_TYPE_IQD); 4909 4910 ccw_device_set_offline(CARD_DDEV(card)); 4910 4911 ccw_device_set_offline(CARD_WDEV(card)); 4911 4912 ccw_device_set_offline(CARD_RDEV(card)); 4913 + qdio_free(CARD_DDEV(card)); 4912 4914 rc = ccw_device_set_online(CARD_RDEV(card)); 4913 4915 if (rc) 4914 4916 goto retriable; ··· 4920 4918 rc = ccw_device_set_online(CARD_DDEV(card)); 4921 4919 if (rc) 4922 4920 goto retriable; 4923 - rc = qeth_qdio_clear_card(card, card->info.type != QETH_CARD_TYPE_IQD); 4924 4921 retriable: 4925 4922 if (rc == -ERESTARTSYS) { 4926 4923 QETH_DBF_TEXT(SETUP, 2, "break1");
+3
drivers/s390/net/qeth_l2_main.c
··· 1091 1091 ccw_device_set_offline(CARD_DDEV(card)); 1092 1092 ccw_device_set_offline(CARD_WDEV(card)); 1093 1093 ccw_device_set_offline(CARD_RDEV(card)); 1094 + qdio_free(CARD_DDEV(card)); 1094 1095 if (recover_flag == CARD_STATE_RECOVER) 1095 1096 card->state = CARD_STATE_RECOVER; 1096 1097 else ··· 1133 1132 rc = (rc2) ? rc2 : rc3; 1134 1133 if (rc) 1135 1134 QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc); 1135 + qdio_free(CARD_DDEV(card)); 1136 1136 if (recover_flag == CARD_STATE_UP) 1137 1137 card->state = CARD_STATE_RECOVER; 1138 1138 /* let user_space know that device is offline */ ··· 1196 1194 qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM); 1197 1195 qeth_qdio_clear_card(card, 0); 1198 1196 qeth_clear_qdio_buffers(card); 1197 + qdio_free(CARD_DDEV(card)); 1199 1198 } 1200 1199 1201 1200 static int qeth_l2_pm_suspend(struct ccwgroup_device *gdev)
+3
drivers/s390/net/qeth_l3_main.c
··· 3447 3447 ccw_device_set_offline(CARD_DDEV(card)); 3448 3448 ccw_device_set_offline(CARD_WDEV(card)); 3449 3449 ccw_device_set_offline(CARD_RDEV(card)); 3450 + qdio_free(CARD_DDEV(card)); 3450 3451 if (recover_flag == CARD_STATE_RECOVER) 3451 3452 card->state = CARD_STATE_RECOVER; 3452 3453 else ··· 3494 3493 rc = (rc2) ? rc2 : rc3; 3495 3494 if (rc) 3496 3495 QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc); 3496 + qdio_free(CARD_DDEV(card)); 3497 3497 if (recover_flag == CARD_STATE_UP) 3498 3498 card->state = CARD_STATE_RECOVER; 3499 3499 /* let user_space know that device is offline */ ··· 3547 3545 qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM); 3548 3546 qeth_qdio_clear_card(card, 0); 3549 3547 qeth_clear_qdio_buffers(card); 3548 + qdio_free(CARD_DDEV(card)); 3550 3549 } 3551 3550 3552 3551 static int qeth_l3_pm_suspend(struct ccwgroup_device *gdev)