From aec59fab94ef2ee7702853d7e633260300793a02 Mon Sep 17 00:00:00 2001 From: Raghavendra Rao Ananta Date: Sun, 16 Aug 2020 20:13:23 -0700 Subject: [PATCH] soc: qcom: ramdump: Abort user-space read if timed-out It's possible that the user-space process can be woken up very late to collect the ramdumps by which time, the ramdump collection timer would have expired. Following this, the PIL driver unmaps the memory and continues. The user-space process has no way to know about this and can make an attempt to read the unmapped memory, thus resulting in a data abort. Hence, notify the user-space process that the ramdump timer has expired such that it can reset its state machine. Also add the srcu related symbols to the allowed-list and update the ABI snapshot accordingly. Change-Id: Idb92d98406a9032c999c82e2089213883c5a65eb Signed-off-by: Raghavendra Rao Ananta --- android/abi_gki_aarch64_3f413d0ec7.xml | 786 +++++++++++++------------ android/abi_gki_aarch64_qcom | 4 + drivers/soc/qcom/ramdump.c | 37 +- 3 files changed, 462 insertions(+), 365 deletions(-) diff --git a/android/abi_gki_aarch64_3f413d0ec7.xml b/android/abi_gki_aarch64_3f413d0ec7.xml index ca1a87cf2ffd..85b9c6003714 100644 --- a/android/abi_gki_aarch64_3f413d0ec7.xml +++ b/android/abi_gki_aarch64_3f413d0ec7.xml @@ -137,6 +137,8 @@ + + @@ -1186,6 +1188,7 @@ + @@ -2252,6 +2255,7 @@ + @@ -12674,6 +12678,17 @@ + + + + + + + + + + + @@ -13890,7 +13905,7 @@ - + @@ -19738,7 +19753,7 @@ - + @@ -20117,10 +20132,10 @@ - + - + @@ -20392,17 +20407,6 @@ - - - - - - - - - - - @@ -21682,7 +21686,7 @@ - + @@ -21699,7 +21703,7 @@ - + @@ -21984,7 +21988,7 @@ - + @@ -22051,7 +22055,7 @@ - + @@ -22900,7 +22904,7 @@ - + @@ -22937,7 +22941,7 @@ - + @@ -23984,10 +23988,10 @@ - + - + @@ -27410,7 +27414,7 @@ - + @@ -28078,7 +28082,7 @@ - + @@ -30206,6 +30210,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -34498,7 +34553,7 @@ - + @@ -34509,7 +34564,7 @@ - + @@ -37041,14 +37096,6 @@ - - - - - - - - @@ -39004,7 +39051,7 @@ - + @@ -39012,7 +39059,7 @@ - + @@ -39020,7 +39067,7 @@ - + @@ -39628,10 +39675,10 @@ - + - + @@ -40884,7 +40931,7 @@ - + @@ -40893,7 +40940,7 @@ - + @@ -41292,6 +41339,14 @@ + + + + + + + + @@ -43278,7 +43333,7 @@ - + @@ -43297,7 +43352,7 @@ - + @@ -48596,7 +48651,7 @@ - + @@ -49346,7 +49401,7 @@ - + @@ -49356,16 +49411,6 @@ - - - - - - - - - - @@ -49397,7 +49442,7 @@ - + @@ -49796,6 +49841,7 @@ + @@ -49804,6 +49850,7 @@ + @@ -49994,7 +50041,7 @@ - + @@ -50028,6 +50075,23 @@ + + + + + + + + + + + + + + + + + @@ -50080,7 +50144,7 @@ - + @@ -50102,7 +50166,7 @@ - + @@ -50368,6 +50432,22 @@ + + + + + + + + + + + + + + + + @@ -50421,7 +50501,7 @@ - + @@ -50636,7 +50716,7 @@ - + @@ -50651,7 +50731,7 @@ - + @@ -50687,7 +50767,7 @@ - + @@ -50733,6 +50813,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -50842,6 +51009,17 @@ + + + + + + + + + + + @@ -51668,7 +51846,7 @@ - + @@ -52063,7 +52241,7 @@ - + @@ -52339,10 +52517,10 @@ - + - + @@ -52355,10 +52533,10 @@ - + - + @@ -52485,7 +52663,7 @@ - + @@ -52503,7 +52681,7 @@ - + @@ -53271,7 +53449,7 @@ - + @@ -53419,13 +53597,13 @@ - + - + @@ -56070,7 +56248,7 @@ - + @@ -56811,7 +56989,7 @@ - + @@ -56861,7 +57039,7 @@ - + @@ -56891,7 +57069,7 @@ - + @@ -56903,7 +57081,7 @@ - + @@ -59015,7 +59193,7 @@ - + @@ -59493,7 +59671,7 @@ - + @@ -61217,7 +61395,7 @@ - + @@ -61234,7 +61412,7 @@ - + @@ -61290,7 +61468,7 @@ - + @@ -61326,7 +61504,7 @@ - + @@ -65100,7 +65278,7 @@ - + @@ -67659,7 +67837,7 @@ - + @@ -67726,7 +67904,7 @@ - + @@ -67753,7 +67931,7 @@ - + @@ -67961,7 +68139,7 @@ - + @@ -67977,7 +68155,7 @@ - + @@ -67988,7 +68166,7 @@ - + @@ -68192,43 +68370,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -68675,7 +68816,7 @@ - + @@ -68694,7 +68835,7 @@ - + @@ -69014,13 +69155,13 @@ - + - + - + @@ -69044,7 +69185,7 @@ - + @@ -69301,7 +69442,7 @@ - + @@ -70059,7 +70200,7 @@ - + @@ -70067,7 +70208,7 @@ - + @@ -76413,7 +76554,7 @@ - + @@ -76421,7 +76562,7 @@ - + @@ -76429,7 +76570,7 @@ - + @@ -76513,7 +76654,7 @@ - + @@ -76566,7 +76707,7 @@ - + @@ -77405,7 +77546,7 @@ - + @@ -78205,7 +78346,7 @@ - + @@ -78252,7 +78393,7 @@ - + @@ -78300,10 +78441,10 @@ - + - + @@ -79430,7 +79571,7 @@ - + @@ -79451,7 +79592,7 @@ - + @@ -80310,7 +80451,7 @@ - + @@ -81102,7 +81243,7 @@ - + @@ -81111,7 +81252,7 @@ - + @@ -81127,7 +81268,7 @@ - + @@ -81165,7 +81306,7 @@ - + @@ -81213,7 +81354,7 @@ - + @@ -81221,7 +81362,7 @@ - + @@ -81473,12 +81614,20 @@ + + + + + + + + @@ -81531,7 +81680,7 @@ - + @@ -81656,7 +81805,7 @@ - + @@ -81804,7 +81953,7 @@ - + @@ -81911,7 +82060,7 @@ - + @@ -82493,7 +82642,7 @@ - + @@ -82530,6 +82679,15 @@ + + + + + + + + + @@ -83531,7 +83689,7 @@ - + @@ -83595,7 +83753,7 @@ - + @@ -85016,7 +85174,7 @@ - + @@ -85227,7 +85385,7 @@ - + @@ -85350,7 +85508,7 @@ - + @@ -85395,7 +85553,7 @@ - + @@ -86333,7 +86491,7 @@ - + @@ -86342,7 +86500,7 @@ - + @@ -86441,10 +86599,10 @@ - + - + @@ -86489,7 +86647,7 @@ - + @@ -86843,7 +87001,7 @@ - + @@ -86857,7 +87015,7 @@ - + @@ -86982,7 +87140,7 @@ - + @@ -87100,14 +87258,6 @@ - - - - - - - - @@ -87118,12 +87268,12 @@ - + - + - + @@ -87140,7 +87290,7 @@ - + @@ -87170,7 +87320,7 @@ - + @@ -87242,102 +87392,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -87355,25 +87409,6 @@ - - - - - - - - - - - - - - - - - - - @@ -87618,7 +87653,7 @@ - + @@ -87634,7 +87669,7 @@ - + @@ -88027,7 +88062,7 @@ - + @@ -89248,7 +89283,7 @@ - + @@ -89290,7 +89325,7 @@ - + @@ -89592,7 +89627,7 @@ - + @@ -89931,7 +89966,15 @@ - + + + + + + + + + @@ -90287,7 +90330,7 @@ - + @@ -91937,10 +91980,10 @@ - + - + @@ -94982,7 +95025,7 @@ - + @@ -94998,7 +95041,7 @@ - + @@ -95042,7 +95085,7 @@ - + @@ -95061,10 +95104,10 @@ - + - + @@ -95096,7 +95139,7 @@ - + @@ -95104,7 +95147,7 @@ - + @@ -95120,7 +95163,7 @@ - + @@ -95155,7 +95198,7 @@ - + @@ -95171,7 +95214,7 @@ - + @@ -95179,7 +95222,7 @@ - + @@ -95845,10 +95888,10 @@ - + - + @@ -96370,7 +96413,7 @@ - + @@ -96494,7 +96537,7 @@ - + @@ -96510,7 +96553,7 @@ - + @@ -96556,15 +96599,7 @@ - - - - - - - - - + @@ -96572,7 +96607,7 @@ - + @@ -96586,7 +96621,7 @@ - + @@ -96597,7 +96632,7 @@ - + @@ -96605,7 +96640,7 @@ - + @@ -96616,7 +96651,7 @@ - + @@ -96627,6 +96662,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + @@ -97009,7 +97069,7 @@ - + @@ -97102,10 +97162,10 @@ - + - + @@ -97348,7 +97408,7 @@ - + @@ -97408,7 +97468,7 @@ - + @@ -97442,10 +97502,10 @@ - + - + @@ -97467,7 +97527,7 @@ - + @@ -97475,7 +97535,7 @@ - + @@ -97498,7 +97558,7 @@ - + @@ -97576,13 +97636,13 @@ - + - + @@ -97883,7 +97943,7 @@ - + @@ -98057,7 +98117,7 @@ - + @@ -98936,10 +98996,10 @@ - + - + @@ -101125,7 +101185,7 @@ - + @@ -101827,7 +101887,7 @@ - + diff --git a/android/abi_gki_aarch64_qcom b/android/abi_gki_aarch64_qcom index bad1ab0e89a3..93117099aa7c 100644 --- a/android/abi_gki_aarch64_qcom +++ b/android/abi_gki_aarch64_qcom @@ -1098,6 +1098,7 @@ init_net __init_rwsem init_special_inode + init_srcu_struct init_timer_key init_uts_ns init_wait_entry @@ -2275,6 +2276,8 @@ srcu_notifier_call_chain srcu_notifier_chain_register srcu_notifier_chain_unregister + __srcu_read_lock + __srcu_read_unlock sscanf __stack_chk_fail __stack_chk_guard @@ -2317,6 +2320,7 @@ synchronize_irq synchronize_net synchronize_rcu + synchronize_srcu syscon_node_to_regmap syscon_regmap_lookup_by_phandle sysfs_create_bin_file diff --git a/drivers/soc/qcom/ramdump.c b/drivers/soc/qcom/ramdump.c index 1fea5a6ff634..33c05ce005e0 100644 --- a/drivers/soc/qcom/ramdump.c +++ b/drivers/soc/qcom/ramdump.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -59,6 +60,8 @@ struct ramdump_device { size_t elfcore_size; char *elfcore_buf; bool complete_ramdump; + bool abort_ramdump; + struct srcu_struct rd_srcu; }; static int ramdump_open(struct inode *inode, struct file *filep) @@ -158,15 +161,26 @@ static ssize_t ramdump_read(struct file *filep, char __user *buf, size_t count, size_t copy_size = 0, alignsize; unsigned char *alignbuf = NULL, *finalbuf = NULL; int ret = 0; + int srcu_idx; loff_t orig_pos = *pos; if ((filep->f_flags & O_NONBLOCK) && !entry->data_ready) return -EAGAIN; - ret = wait_event_interruptible(rd_dev->dump_wait_q, entry->data_ready); + ret = wait_event_interruptible(rd_dev->dump_wait_q, + (entry->data_ready || rd_dev->abort_ramdump)); if (ret) return ret; + srcu_idx = srcu_read_lock(&rd_dev->rd_srcu); + + if (rd_dev->abort_ramdump) { + pr_err("Ramdump(%s): Ramdump aborted\n", rd_dev->name); + rd_dev->ramdump_status = -1; + ret = -ETIME; + goto ramdump_done; + } + if (*pos < rd_dev->elfcore_size) { copy_size = rd_dev->elfcore_size - *pos; copy_size = min(copy_size, count); @@ -178,8 +192,10 @@ static ssize_t ramdump_read(struct file *filep, char __user *buf, size_t count, *pos += copy_size; count -= copy_size; buf += copy_size; - if (count == 0) + if (count == 0) { + srcu_read_unlock(&rd_dev->rd_srcu, srcu_idx); return copy_size; + } } addr = offset_translate(*pos - rd_dev->elfcore_size, rd_dev, @@ -252,9 +268,12 @@ static ssize_t ramdump_read(struct file *filep, char __user *buf, size_t count, pr_debug("Ramdump(%s): Read %zd bytes from address %lx.\n", rd_dev->name, copy_size, addr); + srcu_read_unlock(&rd_dev->rd_srcu, srcu_idx); + return *pos - orig_pos; ramdump_done: + srcu_read_unlock(&rd_dev->rd_srcu, srcu_idx); kfree(finalbuf); *pos = 0; reset_ramdump_entry(entry); @@ -361,6 +380,7 @@ void *create_ramdump_device(const char *dev_name, struct device *parent) mutex_init(&rd_dev->consumer_lock); atomic_set(&rd_dev->readers_left, 0); + init_srcu_struct(&rd_dev->rd_srcu); cdev_init(&rd_dev->cdev, &ramdump_file_ops); ret = cdev_add(&rd_dev->cdev, MKDEV(MAJOR(ramdump_dev), minor), 1); @@ -373,6 +393,7 @@ void *create_ramdump_device(const char *dev_name, struct device *parent) return (void *)rd_dev; fail_cdev_add: + cleanup_srcu_struct(&rd_dev->rd_srcu); mutex_destroy(&rd_dev->consumer_lock); device_unregister(rd_dev->dev); fail_return_minor: @@ -393,6 +414,7 @@ void destroy_ramdump_device(void *dev) cdev_del(&rd_dev->cdev); device_unregister(rd_dev->dev); + cleanup_srcu_struct(&rd_dev->rd_srcu); ida_simple_remove(&rd_minor_id, minor); kfree(rd_dev); } @@ -473,6 +495,7 @@ static int _do_ramdump(void *handle, struct ramdump_segment *segments, list_for_each_entry(entry, &rd_dev->consumer_list, list) entry->data_ready = true; rd_dev->ramdump_status = -1; + rd_dev->abort_ramdump = false; reinit_completion(&rd_dev->ramdump_complete); atomic_set(&rd_dev->readers_left, rd_dev->consumers); @@ -489,6 +512,11 @@ static int _do_ramdump(void *handle, struct ramdump_segment *segments, pr_err("Ramdump(%s): Timed out waiting for userspace.\n", rd_dev->name); ret = -EPIPE; + rd_dev->abort_ramdump = true; + + /* Wait for pending readers to complete (if any) */ + synchronize_srcu(&rd_dev->rd_srcu); + } else ret = (rd_dev->ramdump_status == 0) ? 0 : -EPIPE; @@ -602,6 +630,7 @@ static int _do_minidump(void *handle, struct ramdump_segment *segments, list_for_each_entry(entry, &rd_dev->consumer_list, list) entry->data_ready = true; rd_dev->ramdump_status = -1; + rd_dev->abort_ramdump = false; reinit_completion(&rd_dev->ramdump_complete); atomic_set(&rd_dev->readers_left, rd_dev->consumers); @@ -618,6 +647,10 @@ static int _do_minidump(void *handle, struct ramdump_segment *segments, pr_err("Ramdump(%s): Timed out waiting for userspace.\n", rd_dev->name); ret = -EPIPE; + rd_dev->abort_ramdump = true; + + /* Wait for pending readers to complete (if any) */ + synchronize_srcu(&rd_dev->rd_srcu); } else { ret = (rd_dev->ramdump_status == 0) ? 0 : -EPIPE; }