Jeff, I have another small patch to address "IPv6 ping problem". Do you want me to wait till the below patch from Nishanth is reviewed and merged by you or should I just generate the IPv6 patch on top of below one ? Regards, Ravi -----Original Message----- From: Nishanth Aravamudan [mailto:nacc@xxxxxxxxxx] Sent: Wednesday, February 09, 2005 11:19 AM To: akpm@xxxxxxxx; jgarzik@xxxxxxxxx Cc: linux-net@xxxxxxxxxxxxxxx; Ravinandan Arakali; 'Raghavendra Koushik'; kernel-janitors@xxxxxxxxxxxxxx; leonid.grossman@xxxxxxxxxxxx Subject: [PATCH] net/s2io: replace schedule_timeout() with msleep() On Wed, Feb 09, 2005 at 10:37:59AM -0800, Ravinandan Arakali wrote: > Nishanth, > We did some basic testing after applying your patch and it seems okay. > Pls submit the patch to maintainer. But I've couple of comments on > your patch. > The below code change is incorrect. It should be msleep(500). > > @@ -3808,8 +3797,7 @@ static int s2io_rldram_test(nic_t * sp, > > val64 = readq(&bar0->mc_rldram_test_ctrl); > > if (val64 & MC_RLDRAM_TEST_DONE) > > break; > > - set_current_state(TASK_UNINTERRUPTIBLE); > > - schedule_timeout(HZ / 2); > > + msleep(200); > > In the function s2io_ethtool_idnic(), call to schedule_timeout() has not > been replaced with msleep(). I've given below the code change I did before > testing. > > @@ -3284,11 +3277,10 @@ > sp->id_timer.data = (unsigned long) sp; > } > mod_timer(&sp->id_timer, jiffies); > - set_current_state(TASK_INTERRUPTIBLE); > if (data) > - schedule_timeout(data * HZ); > + msleep(data*1000); > else > - schedule_timeout(MAX_SCHEDULE_TIMEOUT); > + msleep(0xFFFFFFFF); > del_timer_sync(&sp->id_timer); > > if (CARDS_WITH_FAULTY_LINK_INDICATORS(subid)) { Both changes have been committed in the patch below. Andrew/Jeff, please consider committing to the networking stack of patches. Thanks, Nish Description: Use msleep() instead of schedule_timeout() to guarantee the task delays as expected. This makes the code independent of HZ values (particularly important when HZ changes or is dynamic). Compile- and boot-tested. Signed-off-by: Nishanth Aravamudan <nacc@xxxxxxxxxx> Acked-by: Ravinandan Arakali <ravinandan.arakali@xxxxxxxxxxxx> --- 2.6.11-rc3-v/drivers/net/s2io.c 2005-02-08 17:08:37.000000000 -0800 +++ 2.6.11-rc3/drivers/net/s2io.c 2005-02-09 11:08:48.000000000 -0800 @@ -698,8 +698,7 @@ static int init_nic(struct s2io_nic *nic val64 = 0; writeq(val64, &bar0->sw_reset); val64 = readq(&bar0->sw_reset); - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ / 2); + msleep(500); /* Enable Receiving broadcasts */ add = &bar0->mac_cfg; @@ -952,8 +951,7 @@ static int init_nic(struct s2io_nic *nic dev->name); return -1; } - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ / 20); + msleep(50); time++; } @@ -991,8 +989,7 @@ static int init_nic(struct s2io_nic *nic return -1; } time++; - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ / 20); + msleep(50); } /* @@ -1421,8 +1418,7 @@ static int start_nic(struct s2io_nic *ni SPECIAL_REG_WRITE(val64, &bar0->mc_rldram_mrs, UF); val64 = readq(&bar0->mc_rldram_mrs); - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ / 10); /* Delay by around 100 ms. */ + msleep(100); /* Delay by around 100 ms. */ /* Enabling ECC Protection. */ val64 = readq(&bar0->adapter_control); @@ -2437,8 +2433,7 @@ int wait_for_cmd_complete(nic_t * sp) ret = SUCCESS; break; } - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ / 20); + msleep(50); if (cnt++ > 10) break; } @@ -2477,15 +2472,13 @@ void s2io_reset(nic_t * sp) * As of now I'am just giving a 250ms delay and hoping that the * PCI write to sw_reset register is done by this time. */ - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ / 4); + msleep(250); /* Restore the PCI state saved during initializarion. */ pci_restore_state(sp->pdev); s2io_init_pci(sp); - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ / 4); + msleep(250); /* SXE-002: Configure link and activity LED to turn it off */ subid = sp->pdev->subsystem_device; @@ -3298,11 +3291,10 @@ static int s2io_ethtool_idnic(struct net sp->id_timer.data = (unsigned long) sp; } mod_timer(&sp->id_timer, jiffies); - set_current_state(TASK_INTERRUPTIBLE); if (data) - schedule_timeout(data * HZ); + msleep(data * 1000); else - schedule_timeout(MAX_SCHEDULE_TIMEOUT); + msleep(0xFFFFFFFF); del_timer_sync(&sp->id_timer); if (CARDS_WITH_FAULTY_LINK_INDICATORS(subid)) { @@ -3405,8 +3397,7 @@ static int read_eeprom(nic_t * sp, int o ret = 0; break; } - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ / 20); + msleep(50); exit_cnt++; } @@ -3446,8 +3437,7 @@ static int write_eeprom(nic_t * sp, int ret = 0; break; } - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ / 20); + msleep(50); exit_cnt++; } @@ -3703,8 +3693,7 @@ static int s2io_bist_test(nic_t * sp, ui ret = 0; break; } - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ / 10); + msleep(100); cnt++; } @@ -3805,8 +3794,7 @@ static int s2io_rldram_test(nic_t * sp, val64 = readq(&bar0->mc_rldram_test_ctrl); if (val64 & MC_RLDRAM_TEST_DONE) break; - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ / 5); + msleep(200); } if (cnt == 5) @@ -3822,8 +3810,7 @@ static int s2io_rldram_test(nic_t * sp, val64 = readq(&bar0->mc_rldram_test_ctrl); if (val64 & MC_RLDRAM_TEST_DONE) break; - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ / 2); + msleep(500); } if (cnt == 5) @@ -4183,8 +4170,7 @@ static void s2io_set_link(unsigned long * Allow a small delay for the NICs self initiated * cleanup to complete. */ - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ / 10); + msleep(100); val64 = readq(&bar0->adapter_status); if (verify_xena_quiescence(val64, nic->device_enabled_once)) { @@ -4238,10 +4224,8 @@ static void s2io_card_down(nic_t * sp) register u64 val64 = 0; /* If s2io_set_link task is executing, wait till it completes. */ - while (test_and_set_bit(0, &(sp->link_state))) { - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ / 20); - } + while (test_and_set_bit(0, &(sp->link_state))) + msleep(50); atomic_set(&sp->card_state, CARD_DOWN); /* disable Tx and Rx traffic on the NIC */ @@ -4257,8 +4241,7 @@ static void s2io_card_down(nic_t * sp) break; } - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ / 20); + msleep(50); cnt++; if (cnt == 10) { DBG_PRINT(ERR_DBG, - : send the line "unsubscribe linux-net" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html