drivers/sensors: Fixed O_DIRECT flag triggering rpmsg cross-core.

Fixes the issue of cross-core IPC being triggered when using
O_DIRECT in non-cross-core scenarios.

Signed-off-by: likun17 <likun17@xiaomi.com>
This commit is contained in:
likun17
2024-12-03 14:42:28 +08:00
committed by Donny(董九柱)
parent 8afca79359
commit 96647f0ed7
+37 -35
View File
@@ -614,7 +614,7 @@ static int sensor_open(FAR struct file *filep)
goto errout_with_lock; goto errout_with_lock;
} }
if (lower->ops->open) if ((filep->f_oflags & O_DIRECT) == 0 && lower->ops->open)
{ {
ret = lower->ops->open(lower, filep); ret = lower->ops->open(lower, filep);
if (ret < 0) if (ret < 0)
@@ -623,31 +623,32 @@ static int sensor_open(FAR struct file *filep)
} }
} }
if ((filep->f_oflags & O_DIRECT) == 0) /* Using the O_DIRECT flag will prevent cross-core operations,
{ * allowing for direct I/O operations.
if (filep->f_oflags & O_RDOK) */
{
if (upper->state.nsubscribers == 0 && lower->ops->activate)
{
ret = lower->ops->activate(lower, filep, true);
if (ret < 0)
{
goto errout_with_open;
}
}
user->role |= SENSOR_ROLE_RD; if (filep->f_oflags & O_RDOK)
upper->state.nsubscribers++; {
if (upper->state.nsubscribers == 0 && lower->ops->activate)
{
ret = lower->ops->activate(lower, filep, true);
if (ret < 0)
{
goto errout_with_open;
}
} }
if (filep->f_oflags & O_WROK) user->role |= SENSOR_ROLE_RD;
upper->state.nsubscribers++;
}
if (filep->f_oflags & O_WROK)
{
user->role |= SENSOR_ROLE_WR;
upper->state.nadvertisers++;
if (filep->f_oflags & SENSOR_PERSIST)
{ {
user->role |= SENSOR_ROLE_WR; lower->persist = true;
upper->state.nadvertisers++;
if (filep->f_oflags & SENSOR_PERSIST)
{
lower->persist = true;
}
} }
} }
@@ -696,7 +697,7 @@ static int sensor_close(FAR struct file *filep)
int ret = 0; int ret = 0;
nxrmutex_lock(&upper->lock); nxrmutex_lock(&upper->lock);
if (lower->ops->close) if ((filep->f_oflags & O_DIRECT) == 0 && lower->ops->close)
{ {
ret = lower->ops->close(lower, filep); ret = lower->ops->close(lower, filep);
if (ret < 0) if (ret < 0)
@@ -706,23 +707,24 @@ static int sensor_close(FAR struct file *filep)
} }
} }
if ((filep->f_oflags & O_DIRECT) == 0) /* Using the O_DIRECT flag will prevent cross-core operations,
{ * allowing for direct I/O operations.
if (filep->f_oflags & O_RDOK) */
{
upper->state.nsubscribers--;
if (upper->state.nsubscribers == 0 && lower->ops->activate)
{
lower->ops->activate(lower, filep, false);
}
}
if (filep->f_oflags & O_WROK) if (filep->f_oflags & O_RDOK)
{
upper->state.nsubscribers--;
if (upper->state.nsubscribers == 0 && lower->ops->activate)
{ {
upper->state.nadvertisers--; lower->ops->activate(lower, filep, false);
} }
} }
if (filep->f_oflags & O_WROK)
{
upper->state.nadvertisers--;
}
list_delete(&user->node); list_delete(&user->node);
sensor_update_latency(filep, upper, user, UINT32_MAX); sensor_update_latency(filep, upper, user, UINT32_MAX);
sensor_update_interval(filep, upper, user, UINT32_MAX); sensor_update_interval(filep, upper, user, UINT32_MAX);