From 983864fb47b2b0d1505328e6b8a8978ed3397c5d Mon Sep 17 00:00:00 2001 From: Florian Pose <fp@igh-essen.com> Date: Fri, 1 Aug 2008 12:46:26 +0000 Subject: [PATCH] Use down_interruptible() wherever possible. --- TODO | 1 - master/cdev.c | 60 ++++++++++++++++++++++++++++++++----------------- master/module.c | 7 ++++-- 3 files changed, 45 insertions(+), 23 deletions(-) diff --git a/TODO b/TODO index 6ecac124..1b6223bb 100644 --- a/TODO +++ b/TODO @@ -10,7 +10,6 @@ Version 1.4.0: * Update documentation. * Check for possible race condition in jiffy-based frame timeout calculation. -* Use down_interruptible() for cdev calls. Future issues: diff --git a/master/cdev.c b/master/cdev.c index bc06346d..dda8ab18 100644 --- a/master/cdev.c +++ b/master/cdev.c @@ -127,14 +127,16 @@ int ec_cdev_ioctl_master( { ec_ioctl_master_t data; - down(&master->master_sem); + if (down_interruptible(&master->master_sem)) + return -EINTR; data.slave_count = master->slave_count; data.config_count = ec_master_config_count(master); data.domain_count = ec_master_domain_count(master); data.phase = (uint8_t) master->phase; up(&master->master_sem); - down(&master->device_sem); + if (down_interruptible(&master->device_sem)) + return -EINTR; if (master->main_device.dev) { memcpy(data.devices[0].address, master->main_device.dev->dev_addr, ETH_ALEN); @@ -178,7 +180,8 @@ int ec_cdev_ioctl_slave( return -EFAULT; } - down(&master->master_sem); + if (down_interruptible(&master->master_sem)) + return -EINTR; if (!(slave = ec_master_find_slave_const( master, 0, data.position))) { @@ -237,7 +240,8 @@ int ec_cdev_ioctl_slave_sync( return -EFAULT; } - down(&master->master_sem); + if (down_interruptible(&master->master_sem)) + return -EINTR; if (!(slave = ec_master_find_slave_const( master, 0, data.slave_position))) { @@ -287,7 +291,8 @@ int ec_cdev_ioctl_slave_sync_pdo( return -EFAULT; } - down(&master->master_sem); + if (down_interruptible(&master->master_sem)) + return -EINTR; if (!(slave = ec_master_find_slave_const( master, 0, data.slave_position))) { @@ -344,7 +349,8 @@ int ec_cdev_ioctl_slave_sync_pdo_entry( return -EFAULT; } - down(&master->master_sem); + if (down_interruptible(&master->master_sem)) + return -EINTR; if (!(slave = ec_master_find_slave_const( master, 0, data.slave_position))) { @@ -408,7 +414,8 @@ int ec_cdev_ioctl_domain( return -EFAULT; } - down(&master->master_sem); + if (down_interruptible(&master->master_sem)) + return -EINTR; if (!(domain = ec_master_find_domain_const(master, data.index))) { up(&master->master_sem); @@ -447,7 +454,8 @@ int ec_cdev_ioctl_domain_fmmu( return -EFAULT; } - down(&master->master_sem); + if (down_interruptible(&master->master_sem)) + return -EINTR; if (!(domain = ec_master_find_domain_const(master, data.domain_index))) { up(&master->master_sem); @@ -493,7 +501,8 @@ int ec_cdev_ioctl_domain_data( return -EFAULT; } - down(&master->master_sem); + if (down_interruptible(&master->master_sem)) + return -EINTR; if (!(domain = ec_master_find_domain_const(master, data.domain_index))) { up(&master->master_sem); @@ -547,7 +556,8 @@ int ec_cdev_ioctl_slave_state( return -EFAULT; } - down(&master->master_sem); + if (down_interruptible(&master->master_sem)) + return -EINTR; if (!(slave = ec_master_find_slave( master, 0, data.slave_position))) { @@ -578,7 +588,8 @@ int ec_cdev_ioctl_slave_sdo( return -EFAULT; } - down(&master->master_sem); + if (down_interruptible(&master->master_sem)) + return -EINTR; if (!(slave = ec_master_find_slave_const( master, 0, data.slave_position))) { @@ -625,7 +636,8 @@ int ec_cdev_ioctl_slave_sdo_entry( return -EFAULT; } - down(&master->master_sem); + if (down_interruptible(&master->master_sem)) + return -EINTR; if (!(slave = ec_master_find_slave_const( master, 0, data.slave_position))) { @@ -695,7 +707,8 @@ int ec_cdev_ioctl_slave_sdo_upload( data.sdo_index, data.sdo_entry_subindex); ecrt_sdo_request_read(&request.req); - down(&master->master_sem); + if (down_interruptible(&master->master_sem)) + return -EINTR; if (!(request.slave = ec_master_find_slave( master, 0, data.slave_position))) { @@ -796,7 +809,8 @@ int ec_cdev_ioctl_slave_sdo_download( ecrt_sdo_request_write(&request.req); - down(&master->master_sem); + if (down_interruptible(&master->master_sem)) + return -EINTR; if (!(request.slave = ec_master_find_slave( master, 0, data.slave_position))) { @@ -858,7 +872,8 @@ int ec_cdev_ioctl_slave_sii_read( return -EFAULT; } - down(&master->master_sem); + if (down_interruptible(&master->master_sem)) + return -EINTR; if (!(slave = ec_master_find_slave_const( master, 0, data.slave_position))) { @@ -921,7 +936,8 @@ int ec_cdev_ioctl_slave_sii_write( return -EFAULT; } - down(&master->master_sem); + if (down_interruptible(&master->master_sem)) + return -EINTR; if (!(slave = ec_master_find_slave( master, 0, data.slave_position))) { @@ -984,7 +1000,8 @@ int ec_cdev_ioctl_config( return -EFAULT; } - down(&master->master_sem); + if (down_interruptible(&master->master_sem)) + return -EINTR; if (!(sc = ec_master_get_config_const( master, data.config_index))) { @@ -1037,7 +1054,8 @@ int ec_cdev_ioctl_config_pdo( return -EINVAL; } - down(&master->master_sem); + if (down_interruptible(&master->master_sem)) + return -EINTR; if (!(sc = ec_master_get_config_const( master, data.config_index))) { @@ -1091,7 +1109,8 @@ int ec_cdev_ioctl_config_pdo_entry( return -EINVAL; } - down(&master->master_sem); + if (down_interruptible(&master->master_sem)) + return -EINTR; if (!(sc = ec_master_get_config_const( master, data.config_index))) { @@ -1146,7 +1165,8 @@ int ec_cdev_ioctl_config_sdo( return -EFAULT; } - down(&master->master_sem); + if (down_interruptible(&master->master_sem)) + return -EINTR; if (!(sc = ec_master_get_config_const( master, data.config_index))) { diff --git a/master/module.c b/master/module.c index f5d21ae2..4651ff73 100644 --- a/master/module.c +++ b/master/module.c @@ -473,7 +473,9 @@ ec_master_t *ecrt_request_master(unsigned int master_index) } master = &masters[master_index]; - down(&master_sem); + if (down_interruptible(&master_sem)) + goto out_return; + if (master->reserved) { up(&master_sem); EC_ERR("Master %u is already in use!\n", master_index); @@ -482,7 +484,8 @@ ec_master_t *ecrt_request_master(unsigned int master_index) master->reserved = 1; up(&master_sem); - down(&master->device_sem); + if (down_interruptible(&master->device_sem)) + goto out_release; if (master->phase != EC_IDLE) { up(&master->device_sem); -- GitLab