Vasu Dev wrote:
> On Thu, 2010-05-20 at 12:22 -0700, Joe Eykholt wrote:
>> Vasu Dev wrote:
>>> On Wed, 2010-05-19 at 11:16 -0700, Joe Eykholt wrote:
>>>>>> */
>>>>>> -static void fcoe_ctlr_age_fcfs(struct fcoe_ctlr *fip)
>>>>>> +static unsigned long fcoe_ctlr_age_fcfs(struct fcoe_ctlr *fip)
>>>>>> {
>>>>>> struct fcoe_fcf *fcf;
>>>>>> struct fcoe_fcf *next;
>>>>>> + unsigned long next_timer = jiffies +
>>>> msecs_to_jiffies(FIP_DEF_FKA);
>>>>
>>>> Also, this should be further out than 8 seconds, in case there's
>>>> nothing sooner needed. That's why I used the 90 second time before.
>>>> The rest of the code in age_fcfs or the timeout should come up with
>>>> a closer value unless the 90 second keep-alive is the next thing
>>>> needed
>>>> or there's nothing at all to do.
>>>>
>>> This default value mostly gets written when fd_flag is zero due to
>>> sooner E node KA with typical 8 sec KA period and large value was always
>>> effective in case fd_flag set that was an issue since in that case
>>> periodic ka timeouts didn't kick after 90 second of fcf selection while
>>> fd_flag set.
>> I don't really understand. If there's any FCF at all, it should set
>> next_timer to the 1.5 * FKA since the oldest advertisment received.
>> With a selected FCF that has the flag on it should fire
>> every 1.5 * FKA to check for a missing advertisement.
>> With the change above, it'll fire after 1 FKA, find nothing todo
>> and then reschedule for .5 FKA later, right?
>>
>
> You are right, I must have tried something else in which I noticed
> default next_timer used as 90 sec. I don't see with this patch.
>
>> I may have missed something.
>>
>>> I can roll back this change but then have to set KA period timeout for
>>> this case when fcf is selected in fcoe_ctlr_timeout, so it would add few
>>> more lines there after fcoe_ctlr_select calling as:-
>>>
>>> if (sel && sel->fd_flags &&
>>> time_after(next_timer, sel->time + sel->fka_period))
>>> next_timer = sel->time + fcf->fka_period;
>> But the code you added in age_fcfs also does something like that:
>>
>> if (fcf->fd_flags &&
>> time_after(next_timer, jiffies +
>> fcf->fka_period))
>> next_timer = jiffies + fcf->fka_period;
>>
>> This is after checks that the FCF is selected. It's setting the time
>> to now + FKA, not the last advertisement + FKA, though.
>> I'm not sure why that's needed, either. Since other code already accounts
>> for the 1.5 * FKA check and the 2.5 * FKA timeout.
>>
>
> That is to catch missed adv while d flag set as we talked in other
> response.
>
>>> I'm fine with either and let me know if you want me to change this.
>> I would put back the change to initializing next_timer, and take out
>> the code quoted above. Is that OK?
>
> OK, but then it won't catch missed adv if none received just after fcf
> was selected since TO would be set to 2.5 * FKA in that case. It would
> be very unlikely case and would just miss missed adv count and prints.
> However if we want that also not to occur then next timer should be
> updated just after fcf selected for the D bit case.
I added code similar to what you suggested after the first successful
select, which is independent of the flag and will run the timeout
when the first ctlr_ka is due. That's early to look for missing
advertisements, but then age_fcfs will reschedule it.
This stuff is surprisingly complicated. Maybe there's a better way.
Anyway, below are the differences from your patch to the result of the
two patches. It's cut & paste so may not apply.
This is just for review. All these changes are incorporated in the
patch that I'll send out in a little bit.
--- libfcoe.c.vasu 2010-05-20 10:58:07.000000000 -0700
+++ libfcoe.c 2010-05-20 17:18:18.000000000 -0700
@@ -565,32 +565,28 @@ EXPORT_SYMBOL(fcoe_ctlr_els_send);
*
* Also, increment the MissDiscAdvCount when no advertisement is received
* for the corresponding FCF for 1.5 * FKA_ADV_PERIOD (FC-BB-5 LESB).
*
* Returns the time in jiffies for the next call.
*/
static unsigned long fcoe_ctlr_age_fcfs(struct fcoe_ctlr *fip)
{
struct fcoe_fcf *fcf;
struct fcoe_fcf *next;
- unsigned long next_timer = jiffies + msecs_to_jiffies(FIP_DEF_FKA);
+ unsigned long next_timer = jiffies + msecs_to_jiffies(FIP_VN_KA_PERIOD);
unsigned long deadline;
unsigned long sel_time = 0;
struct fcoe_dev_stats *stats;
list_for_each_entry_safe(fcf, next, &fip->fcfs, list) {
deadline = fcf->time + fcf->fka_period + fcf->fka_period / 2;
if (fip->sel_fcf == fcf) {
- if (fcf->fd_flags &&
- time_after(next_timer, jiffies + fcf->fka_period))
- next_timer = jiffies + fcf->fka_period;
-
if (time_after(jiffies, deadline)) {
stats = per_cpu_ptr(fip->lp->dev_stats,
smp_processor_id());
stats->MissDiscAdvCount++;
printk(KERN_INFO "libfcoe: host%d: "
"Missing Discovery Advertisement "
"for fab %16.16llx count %lld\n",
fip->lp->host->host_no, fcf->fabric_name,
stats->MissDiscAdvCount);
} else if (time_after(next_timer, deadline))
@@ -609,21 +605,21 @@ static unsigned long fcoe_ctlr_age_fcfs(
smp_processor_id());
stats->VLinkFailureCount++;
} else {
if (time_after(next_timer, deadline))
next_timer = deadline;
if (fcoe_ctlr_mtu_valid(fcf) &&
(!sel_time || time_before(sel_time, fcf->time)))
sel_time = fcf->time;
}
}
- if (!(fip->sel_fcf || fip->sel_time)) {
+ if (sel_time && !fip->sel_fcf && !fip->sel_time) {
sel_time += msecs_to_jiffies(FCOE_CTLR_START_DELAY);
fip->sel_time = sel_time;
}
return next_timer;
}
/**
* fcoe_ctlr_parse_adv() - Decode a FIP advertisement into a new FCF entry
* @fip: The FCoE controller receiving the advertisement
@@ -1183,20 +1179,22 @@ static void fcoe_ctlr_timeout(unsigned l
if (sel != fcf) {
fcf = sel; /* the old FCF may have been freed */
if (sel) {
printk(KERN_INFO "libfcoe: host%d: FIP selected "
"Fibre-Channel Forwarder MAC %pM\n",
fip->lp->host->host_no, sel->fcf_mac);
memcpy(fip->dest_addr, sel->fcf_mac, ETH_ALEN);
fip->port_ka_time = jiffies +
msecs_to_jiffies(FIP_VN_KA_PERIOD);
fip->ctlr_ka_time = jiffies + sel->fka_period;
+ if (time_after(next_timer, fip->ctlr_ka_time))
+ next_timer = fip->ctlr_ka_time;
} else {
printk(KERN_NOTICE "libfcoe: host%d: "
"FIP Fibre-Channel Forwarder timed out. "
"Starting FCF discovery.\n",
fip->lp->host->host_no);
fip->reset_req = 1;
schedule_work(&fip->timer_work);
}
}
I put the changes to the D-flag in a separate patch, for review at least.
Maybe you can try that sometime? I don't have a switch that lets me
set the D flag (as far as I know). I guess I could modify fcgw for that
someday in my spare time ...
Regards,
Joe
_______________________________________________
devel mailing list
[email protected]
http://www.open-fcoe.org/mailman/listinfo/devel