Skip to content

Commit 975628e

Browse files
Ron Hemeta-codesync[bot]
authored andcommitted
Take SAI API lock when registering switch event callback
Summary: While trying to make sure no regression in Sai Replayer refactoring, noticed that a few SAI API calls are interleaving with each other. E.g. ``` memset(s_a,0,ATTR_SIZE*4096); s_a[0].id=536870926; rv=switch_api->set_switch_attribute(9840384019236126720U,s_a); memset(s_a,0,ATTR_SIZE*4096); s_a[0].id=120; rv=switch_api->set_switch_attribute(9840384019236126720U,s_a); rvCheck(rv,0,1952); rvCheck(rv,0,1953); ``` This is because when we register callbacks, the call directly goes to SDK instead of going through Sai API. To fix this, also take the SaiAPILock while registering callback. Reviewed By: daiwei1983 Differential Revision: D85835200 Privacy Context Container: L1297311 fbshipit-source-id: 91c5c23810be7988d2bc9cfb73df1a68c6bf2e29
1 parent 044547e commit 975628e

File tree

1 file changed

+27
-14
lines changed

1 file changed

+27
-14
lines changed

fboss/agent/hw/sai/api/bcm/SwitchApi.cpp

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -341,25 +341,38 @@ void SwitchApi::registerSwitchEventCallback(
341341
#endif
342342
eventAttr.value.u32list.count = events.size();
343343
eventAttr.value.u32list.list = events.data();
344-
auto rv = _setAttribute(id, &eventAttr);
345-
saiLogError(rv, ApiType, "Unable to register parity error switch events");
346344

347-
// Register switch event callback function
348-
rv = _setAttribute(id, &attr);
349-
saiLogError(
350-
rv, ApiType, "Unable to register parity error switch event callback");
345+
{
346+
auto g{SaiApiLock::getInstance()->lock()};
347+
auto rv = _setAttribute(id, &eventAttr);
348+
saiLogError(rv, ApiType, "Unable to register parity error switch events");
349+
}
350+
351+
{
352+
// Register switch event callback function
353+
auto g{SaiApiLock::getInstance()->lock()};
354+
auto rv = _setAttribute(id, &attr);
355+
saiLogError(
356+
rv, ApiType, "Unable to register parity error switch event callback");
357+
}
351358
} else {
352359
// This is reverse of the registration sequence.
353360
// First, unregister callback, then unregister events.
354361

355-
// First unregister callback function
356-
auto rv = _setAttribute(id, &attr);
357-
saiLogError(rv, ApiType, "Unable to unregister TAM event callback");
358-
359-
// Then unregister switch events
360-
eventAttr.value.u32list.count = 0;
361-
rv = _setAttribute(id, &eventAttr);
362-
saiLogError(rv, ApiType, "Unable to unregister switch events");
362+
{
363+
auto g{SaiApiLock::getInstance()->lock()};
364+
// First unregister callback function
365+
auto rv = _setAttribute(id, &attr);
366+
saiLogError(rv, ApiType, "Unable to unregister TAM event callback");
367+
}
368+
369+
{
370+
auto g{SaiApiLock::getInstance()->lock()};
371+
// Then unregister switch events
372+
eventAttr.value.u32list.count = 0;
373+
auto rv = _setAttribute(id, &eventAttr);
374+
saiLogError(rv, ApiType, "Unable to unregister switch events");
375+
}
363376
}
364377
#endif
365378
}

0 commit comments

Comments
 (0)