diff options
| author | Jiri Slaby <jslaby@suse.cz> | 2012-04-02 07:54:25 -0400 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-04-09 14:28:19 -0400 |
| commit | 2cd9fa254508f71bd3025992ef5cecbf2120b0e4 (patch) | |
| tree | d7cd1d06033c0187b4bbfc25d2f3f9b57e1f5e50 /drivers/tty | |
| parent | 1997cf044853a2d83cd0ebc307e292fa9fa819de (diff) | |
TTY: hvcs, use kref from tty_port
A simple switch. Except we convert destroy_hvcs_struct to be
tty_port_operations->destruct...
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Cc: linuxppc-dev@lists.ozlabs.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/tty')
| -rw-r--r-- | drivers/tty/hvc/hvcs.c | 34 |
1 files changed, 16 insertions, 18 deletions
diff --git a/drivers/tty/hvc/hvcs.c b/drivers/tty/hvc/hvcs.c index a049ced9743..817f94bf95a 100644 --- a/drivers/tty/hvc/hvcs.c +++ b/drivers/tty/hvc/hvcs.c | |||
| @@ -290,12 +290,11 @@ struct hvcs_struct { | |||
| 290 | int chars_in_buffer; | 290 | int chars_in_buffer; |
| 291 | 291 | ||
| 292 | /* | 292 | /* |
| 293 | * Any variable below the kref is valid before a tty is connected and | 293 | * Any variable below is valid before a tty is connected and |
| 294 | * stays valid after the tty is disconnected. These shouldn't be | 294 | * stays valid after the tty is disconnected. These shouldn't be |
| 295 | * whacked until the kobject refcount reaches zero though some entries | 295 | * whacked until the kobject refcount reaches zero though some entries |
| 296 | * may be changed via sysfs initiatives. | 296 | * may be changed via sysfs initiatives. |
| 297 | */ | 297 | */ |
| 298 | struct kref kref; /* ref count & hvcs_struct lifetime */ | ||
| 299 | int connected; /* is the vty-server currently connected to a vty? */ | 298 | int connected; /* is the vty-server currently connected to a vty? */ |
| 300 | uint32_t p_unit_address; /* partner unit address */ | 299 | uint32_t p_unit_address; /* partner unit address */ |
| 301 | uint32_t p_partition_ID; /* partner partition ID */ | 300 | uint32_t p_partition_ID; /* partner partition ID */ |
| @@ -304,9 +303,6 @@ struct hvcs_struct { | |||
| 304 | struct vio_dev *vdev; | 303 | struct vio_dev *vdev; |
| 305 | }; | 304 | }; |
| 306 | 305 | ||
| 307 | /* Required to back map a kref to its containing object */ | ||
| 308 | #define from_kref(k) container_of(k, struct hvcs_struct, kref) | ||
| 309 | |||
| 310 | static LIST_HEAD(hvcs_structs); | 306 | static LIST_HEAD(hvcs_structs); |
| 311 | static DEFINE_SPINLOCK(hvcs_structs_lock); | 307 | static DEFINE_SPINLOCK(hvcs_structs_lock); |
| 312 | static DEFINE_MUTEX(hvcs_init_mutex); | 308 | static DEFINE_MUTEX(hvcs_init_mutex); |
| @@ -701,10 +697,9 @@ static void hvcs_return_index(int index) | |||
| 701 | hvcs_index_list[index] = -1; | 697 | hvcs_index_list[index] = -1; |
| 702 | } | 698 | } |
| 703 | 699 | ||
| 704 | /* callback when the kref ref count reaches zero */ | 700 | static void hvcs_destruct_port(struct tty_port *p) |
| 705 | static void destroy_hvcs_struct(struct kref *kref) | ||
| 706 | { | 701 | { |
| 707 | struct hvcs_struct *hvcsd = from_kref(kref); | 702 | struct hvcs_struct *hvcsd = container_of(p, struct hvcs_struct, port); |
| 708 | struct vio_dev *vdev; | 703 | struct vio_dev *vdev; |
| 709 | unsigned long flags; | 704 | unsigned long flags; |
| 710 | 705 | ||
| @@ -741,6 +736,10 @@ static void destroy_hvcs_struct(struct kref *kref) | |||
| 741 | kfree(hvcsd); | 736 | kfree(hvcsd); |
| 742 | } | 737 | } |
| 743 | 738 | ||
| 739 | static const struct tty_port_operations hvcs_port_ops = { | ||
| 740 | .destruct = hvcs_destruct_port, | ||
| 741 | }; | ||
| 742 | |||
| 744 | static int hvcs_get_index(void) | 743 | static int hvcs_get_index(void) |
| 745 | { | 744 | { |
| 746 | int i; | 745 | int i; |
| @@ -790,9 +789,8 @@ static int __devinit hvcs_probe( | |||
| 790 | return -ENODEV; | 789 | return -ENODEV; |
| 791 | 790 | ||
| 792 | tty_port_init(&hvcsd->port); | 791 | tty_port_init(&hvcsd->port); |
| 792 | hvcsd->port.ops = &hvcs_port_ops; | ||
| 793 | spin_lock_init(&hvcsd->lock); | 793 | spin_lock_init(&hvcsd->lock); |
| 794 | /* Automatically incs the refcount the first time */ | ||
| 795 | kref_init(&hvcsd->kref); | ||
| 796 | 794 | ||
| 797 | hvcsd->vdev = dev; | 795 | hvcsd->vdev = dev; |
| 798 | dev_set_drvdata(&dev->dev, hvcsd); | 796 | dev_set_drvdata(&dev->dev, hvcsd); |
| @@ -860,7 +858,7 @@ static int __devexit hvcs_remove(struct vio_dev *dev) | |||
| 860 | * Let the last holder of this object cause it to be removed, which | 858 | * Let the last holder of this object cause it to be removed, which |
| 861 | * would probably be tty_hangup below. | 859 | * would probably be tty_hangup below. |
| 862 | */ | 860 | */ |
| 863 | kref_put(&hvcsd->kref, destroy_hvcs_struct); | 861 | tty_port_put(&hvcsd->port); |
| 864 | 862 | ||
| 865 | /* | 863 | /* |
| 866 | * The hangup is a scheduled function which will auto chain call | 864 | * The hangup is a scheduled function which will auto chain call |
| @@ -1094,7 +1092,7 @@ static struct hvcs_struct *hvcs_get_by_index(int index) | |||
| 1094 | list_for_each_entry(hvcsd, &hvcs_structs, next) { | 1092 | list_for_each_entry(hvcsd, &hvcs_structs, next) { |
| 1095 | spin_lock_irqsave(&hvcsd->lock, flags); | 1093 | spin_lock_irqsave(&hvcsd->lock, flags); |
| 1096 | if (hvcsd->index == index) { | 1094 | if (hvcsd->index == index) { |
| 1097 | kref_get(&hvcsd->kref); | 1095 | tty_port_get(&hvcsd->port); |
| 1098 | spin_unlock_irqrestore(&hvcsd->lock, flags); | 1096 | spin_unlock_irqrestore(&hvcsd->lock, flags); |
| 1099 | spin_unlock(&hvcs_structs_lock); | 1097 | spin_unlock(&hvcs_structs_lock); |
| 1100 | return hvcsd; | 1098 | return hvcsd; |
| @@ -1160,7 +1158,7 @@ static int hvcs_open(struct tty_struct *tty, struct file *filp) | |||
| 1160 | * and will grab the spinlock and free the connection if it fails. | 1158 | * and will grab the spinlock and free the connection if it fails. |
| 1161 | */ | 1159 | */ |
| 1162 | if (((rc = hvcs_enable_device(hvcsd, unit_address, irq, vdev)))) { | 1160 | if (((rc = hvcs_enable_device(hvcsd, unit_address, irq, vdev)))) { |
| 1163 | kref_put(&hvcsd->kref, destroy_hvcs_struct); | 1161 | tty_port_put(&hvcsd->port); |
| 1164 | printk(KERN_WARNING "HVCS: enable device failed.\n"); | 1162 | printk(KERN_WARNING "HVCS: enable device failed.\n"); |
| 1165 | return rc; | 1163 | return rc; |
| 1166 | } | 1164 | } |
| @@ -1171,7 +1169,7 @@ fast_open: | |||
| 1171 | hvcsd = tty->driver_data; | 1169 | hvcsd = tty->driver_data; |
| 1172 | 1170 | ||
| 1173 | spin_lock_irqsave(&hvcsd->lock, flags); | 1171 | spin_lock_irqsave(&hvcsd->lock, flags); |
| 1174 | kref_get(&hvcsd->kref); | 1172 | tty_port_get(&hvcsd->port); |
| 1175 | hvcsd->port.count++; | 1173 | hvcsd->port.count++; |
| 1176 | hvcsd->todo_mask |= HVCS_SCHED_READ; | 1174 | hvcsd->todo_mask |= HVCS_SCHED_READ; |
| 1177 | spin_unlock_irqrestore(&hvcsd->lock, flags); | 1175 | spin_unlock_irqrestore(&hvcsd->lock, flags); |
| @@ -1186,7 +1184,7 @@ open_success: | |||
| 1186 | 1184 | ||
| 1187 | error_release: | 1185 | error_release: |
| 1188 | spin_unlock_irqrestore(&hvcsd->lock, flags); | 1186 | spin_unlock_irqrestore(&hvcsd->lock, flags); |
| 1189 | kref_put(&hvcsd->kref, destroy_hvcs_struct); | 1187 | tty_port_put(&hvcsd->port); |
| 1190 | 1188 | ||
| 1191 | printk(KERN_WARNING "HVCS: partner connect failed.\n"); | 1189 | printk(KERN_WARNING "HVCS: partner connect failed.\n"); |
| 1192 | return retval; | 1190 | return retval; |
| @@ -1240,7 +1238,7 @@ static void hvcs_close(struct tty_struct *tty, struct file *filp) | |||
| 1240 | tty->driver_data = NULL; | 1238 | tty->driver_data = NULL; |
| 1241 | 1239 | ||
| 1242 | free_irq(irq, hvcsd); | 1240 | free_irq(irq, hvcsd); |
| 1243 | kref_put(&hvcsd->kref, destroy_hvcs_struct); | 1241 | tty_port_put(&hvcsd->port); |
| 1244 | return; | 1242 | return; |
| 1245 | } else if (hvcsd->port.count < 0) { | 1243 | } else if (hvcsd->port.count < 0) { |
| 1246 | printk(KERN_ERR "HVCS: vty-server@%X open_count: %d" | 1244 | printk(KERN_ERR "HVCS: vty-server@%X open_count: %d" |
| @@ -1249,7 +1247,7 @@ static void hvcs_close(struct tty_struct *tty, struct file *filp) | |||
| 1249 | } | 1247 | } |
| 1250 | 1248 | ||
| 1251 | spin_unlock_irqrestore(&hvcsd->lock, flags); | 1249 | spin_unlock_irqrestore(&hvcsd->lock, flags); |
| 1252 | kref_put(&hvcsd->kref, destroy_hvcs_struct); | 1250 | tty_port_put(&hvcsd->port); |
| 1253 | } | 1251 | } |
| 1254 | 1252 | ||
| 1255 | static void hvcs_hangup(struct tty_struct * tty) | 1253 | static void hvcs_hangup(struct tty_struct * tty) |
| @@ -1301,7 +1299,7 @@ static void hvcs_hangup(struct tty_struct * tty) | |||
| 1301 | * NOTE: If this hangup was signaled from user space then the | 1299 | * NOTE: If this hangup was signaled from user space then the |
| 1302 | * final put will never happen. | 1300 | * final put will never happen. |
| 1303 | */ | 1301 | */ |
| 1304 | kref_put(&hvcsd->kref, destroy_hvcs_struct); | 1302 | tty_port_put(&hvcsd->port); |
| 1305 | } | 1303 | } |
| 1306 | } | 1304 | } |
| 1307 | 1305 | ||
