retry ioctls while errno == EINTR (#22054)

pull/22067/head
Dean Lee 2021-08-31 07:07:34 +08:00 committed by GitHub
parent 37dda3d6bf
commit 31230e5b60
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 43 additions and 37 deletions

View File

@ -32,7 +32,7 @@ const uint16_t INFINITY_DAC = 364;
extern ExitHandler do_exit;
static int cam_ioctl(int fd, unsigned long int request, void *arg, const char *log_msg = nullptr) {
int err = ioctl(fd, request, arg);
int err = HANDLE_EINTR(ioctl(fd, request, arg));
if (err != 0 && log_msg) {
LOG(util::string_format("%s: %d", log_msg, err).c_str());
}
@ -82,7 +82,7 @@ static void camera_release_buffer(void* cookie, int buf_idx) {
CameraState *s = (CameraState *)cookie;
// printf("camera_release_buffer %d\n", buf_idx);
s->ss[0].qbuf_info[buf_idx].dirty_buf = 1;
ioctl(s->isp_fd, VIDIOC_MSM_ISP_ENQUEUE_BUF, &s->ss[0].qbuf_info[buf_idx]);
HANDLE_EINTR(ioctl(s->isp_fd, VIDIOC_MSM_ISP_ENQUEUE_BUF, &s->ss[0].qbuf_info[buf_idx]));
}
int sensor_write_regs(CameraState *s, struct msm_camera_i2c_reg_array* arr, size_t size, msm_camera_i2c_data_type data_type) {
@ -94,7 +94,7 @@ int sensor_write_regs(CameraState *s, struct msm_camera_i2c_reg_array* arr, size
.delay = 0,
};
sensorb_cfg_data cfg_data = {.cfgtype = CFG_WRITE_I2C_ARRAY, .cfg.setting = &out_settings};
return ioctl(s->sensor_fd, VIDIOC_MSM_SENSOR_CFG, &cfg_data);
return HANDLE_EINTR(ioctl(s->sensor_fd, VIDIOC_MSM_SENSOR_CFG, &cfg_data));
}
static int imx298_apply_exposure(CameraState *s, int gain, int integ_lines, uint32_t frame_length) {
@ -797,7 +797,7 @@ void actuator_move(CameraState *s, uint16_t target) {
.curr_lens_pos = s->cur_lens_pos,
.ringing_params = &actuator_ringing_params,
};
ioctl(s->actuator_fd, VIDIOC_MSM_ACTUATOR_CFG, &actuator_cfg_data);
HANDLE_EINTR(ioctl(s->actuator_fd, VIDIOC_MSM_ACTUATOR_CFG, &actuator_cfg_data));
s->cur_step_pos = dest_step_pos;
s->cur_lens_pos = actuator_cfg_data.cfg.move.curr_lens_pos;
@ -962,7 +962,7 @@ void cameras_open(MultiCameraState *s) {
// ISPIF: set vfe info
struct ispif_cfg_data ispif_cfg_data = {.cfg_type = ISPIF_SET_VFE_INFO, .vfe_info.num_vfe = 2};
int err = ioctl(s->ispif_fd, VIDIOC_MSM_ISPIF_CFG, &ispif_cfg_data);
int err = HANDLE_EINTR(ioctl(s->ispif_fd, VIDIOC_MSM_ISPIF_CFG, &ispif_cfg_data));
LOG("ispif set vfe info: %d", err);
// ISPIF: setup
@ -1142,7 +1142,7 @@ void cameras_run(MultiCameraState *s) {
CameraState *c = cameras[i];
struct v4l2_event ev = {};
ret = ioctl(c->isp_fd, VIDIOC_DQEVENT, &ev);
ret = HANDLE_EINTR(ioctl(c->isp_fd, VIDIOC_DQEVENT, &ev));
const msm_isp_event_data *isp_event_data = (const msm_isp_event_data *)ev.u.data;
if (ev.type == ISP_EVENT_BUF_DIVERT) {
@ -1157,7 +1157,7 @@ void cameras_run(MultiCameraState *s) {
parse_autofocus(c, (uint8_t *)(ss.bufs[buf_idx].addr));
}
ss.qbuf_info[buf_idx].dirty_buf = 1;
ioctl(c->isp_fd, VIDIOC_MSM_ISP_ENQUEUE_BUF, &ss.qbuf_info[buf_idx]);
HANDLE_EINTR(ioctl(c->isp_fd, VIDIOC_MSM_ISP_ENQUEUE_BUF, &ss.qbuf_info[buf_idx]));
}
} else if (ev.type == ISP_EVENT_EOF) {

View File

@ -68,7 +68,7 @@ int cam_control(int fd, int op_code, void *handle, int size) {
camcontrol.handle_type = CAM_HANDLE_USER_POINTER;
}
int ret = ioctl(fd, VIDIOC_CAM_CONTROL, &camcontrol);
int ret = HANDLE_EINTR(ioctl(fd, VIDIOC_CAM_CONTROL, &camcontrol));
if (ret == -1) {
printf("OP CODE ERR - %d \n", op_code);
perror("wat");
@ -818,7 +818,7 @@ void cameras_open(MultiCameraState *s) {
static struct v4l2_event_subscription sub = {0};
sub.type = V4L_EVENT_CAM_REQ_MGR_EVENT;
sub.id = 2; // should use boot time for sof
ret = ioctl(s->video0_fd, VIDIOC_SUBSCRIBE_EVENT, &sub);
ret = HANDLE_EINTR(ioctl(s->video0_fd, VIDIOC_SUBSCRIBE_EVENT, &sub));
printf("req mgr subscribe: %d\n", ret);
camera_open(&s->road_cam);
@ -1102,22 +1102,26 @@ void cameras_run(MultiCameraState *s) {
if (!fds[0].revents) continue;
struct v4l2_event ev = {0};
ret = ioctl(fds[0].fd, VIDIOC_DQEVENT, &ev);
if (ev.type == V4L_EVENT_CAM_REQ_MGR_EVENT) {
struct cam_req_mgr_message *event_data = (struct cam_req_mgr_message *)ev.u.data;
// LOGD("v4l2 event: sess_hdl %d, link_hdl %d, frame_id %d, req_id %lld, timestamp 0x%llx, sof_status %d\n", event_data->session_hdl, event_data->u.frame_msg.link_hdl, event_data->u.frame_msg.frame_id, event_data->u.frame_msg.request_id, event_data->u.frame_msg.timestamp, event_data->u.frame_msg.sof_status);
// printf("sess_hdl %d, link_hdl %d, frame_id %lu, req_id %lu, timestamp 0x%lx, sof_status %d\n", event_data->session_hdl, event_data->u.frame_msg.link_hdl, event_data->u.frame_msg.frame_id, event_data->u.frame_msg.request_id, event_data->u.frame_msg.timestamp, event_data->u.frame_msg.sof_status);
ret = HANDLE_EINTR(ioctl(fds[0].fd, VIDIOC_DQEVENT, &ev));
if (ret == 0) {
if (ev.type == V4L_EVENT_CAM_REQ_MGR_EVENT) {
struct cam_req_mgr_message *event_data = (struct cam_req_mgr_message *)ev.u.data;
// LOGD("v4l2 event: sess_hdl %d, link_hdl %d, frame_id %d, req_id %lld, timestamp 0x%llx, sof_status %d\n", event_data->session_hdl, event_data->u.frame_msg.link_hdl, event_data->u.frame_msg.frame_id, event_data->u.frame_msg.request_id, event_data->u.frame_msg.timestamp, event_data->u.frame_msg.sof_status);
// printf("sess_hdl %d, link_hdl %d, frame_id %lu, req_id %lu, timestamp 0x%lx, sof_status %d\n", event_data->session_hdl, event_data->u.frame_msg.link_hdl, event_data->u.frame_msg.frame_id, event_data->u.frame_msg.request_id, event_data->u.frame_msg.timestamp, event_data->u.frame_msg.sof_status);
if (event_data->session_hdl == s->road_cam.session_handle) {
handle_camera_event(&s->road_cam, event_data);
} else if (event_data->session_hdl == s->wide_road_cam.session_handle) {
handle_camera_event(&s->wide_road_cam, event_data);
} else if (event_data->session_hdl == s->driver_cam.session_handle) {
handle_camera_event(&s->driver_cam, event_data);
} else {
printf("Unknown vidioc event source\n");
assert(false);
if (event_data->session_hdl == s->road_cam.session_handle) {
handle_camera_event(&s->road_cam, event_data);
} else if (event_data->session_hdl == s->wide_road_cam.session_handle) {
handle_camera_event(&s->wide_road_cam, event_data);
} else if (event_data->session_hdl == s->driver_cam.session_handle) {
handle_camera_event(&s->driver_cam, event_data);
} else {
printf("Unknown vidioc event source\n");
assert(false);
}
}
} else {
LOGE("VIDIOC_DQEVENT failed, errno=%d", errno);
}
}

View File

@ -9,6 +9,7 @@
#include <stdexcept>
#include "selfdrive/common/swaglog.h"
#include "selfdrive/common/util.h"
#define UNUSED(x) (void)(x)
@ -36,7 +37,7 @@ I2CBus::~I2CBus() {
int I2CBus::read_register(uint8_t device_address, uint register_address, uint8_t *buffer, uint8_t len) {
int ret = 0;
ret = ioctl(i2c_fd, I2C_SLAVE, device_address);
ret = HANDLE_EINTR(ioctl(i2c_fd, I2C_SLAVE, device_address));
if(ret < 0) { goto fail; }
ret = i2c_smbus_read_i2c_block_data(i2c_fd, register_address, len, buffer);
@ -49,7 +50,7 @@ fail:
int I2CBus::set_register(uint8_t device_address, uint register_address, uint8_t data) {
int ret = 0;
ret = ioctl(i2c_fd, I2C_SLAVE, device_address);
ret = HANDLE_EINTR(ioctl(i2c_fd, I2C_SLAVE, device_address));
if(ret < 0) { goto fail; }
ret = i2c_smbus_write_byte_data(i2c_fd, register_address, data);

View File

@ -20,17 +20,6 @@
#include "selfdrive/common/util.h"
#include "selfdrive/hardware/hw.h"
// keep trying if x gets interrupted by a signal
#define HANDLE_EINTR(x) \
({ \
decltype(x) ret; \
int try_cnt = 0; \
do { \
ret = (x); \
} while (ret == -1 && errno == EINTR && try_cnt++ < 100); \
ret; \
})
namespace {
volatile sig_atomic_t params_do_exit = 0;

View File

@ -13,6 +13,17 @@
#include <string>
#include <thread>
// keep trying if x gets interrupted by a signal
#define HANDLE_EINTR(x) \
({ \
decltype(x) ret; \
int try_cnt = 0; \
do { \
ret = (x); \
} while (ret == -1 && errno == EINTR && try_cnt++ < 100); \
ret; \
})
#ifndef sighandler_t
typedef void (*sighandler_t)(int sig);
#endif

View File

@ -11,6 +11,7 @@
#include "selfdrive/common/clutil.h"
#include "selfdrive/common/timing.h"
#include "selfdrive/common/util.h"
//#define RUN_DISASSEMBLER
//#define RUN_OPTIMIZER
@ -112,7 +113,7 @@ int ioctl(int filedes, unsigned long request, void *argp) {
}
}
int ret = my_ioctl(filedes, request, argp);
int ret = HANDLE_EINTR(my_ioctl(filedes, request, argp));
if (ret != 0) printf("ioctl returned %d with errno %d\n", ret, errno);
return ret;
}