214 lines
7.5 KiB
Diff
214 lines
7.5 KiB
Diff
From 21d34047c11667042371bf23d89f168be4eb607d Mon Sep 17 00:00:00 2001
|
||
From: Christophe Priouzeau <christophe.priouzeau@st.com>
|
||
Date: Fri, 10 Apr 2020 14:48:07 +0200
|
||
Subject: [PATCH 19/23] ARM-stm32mp1-r1-MISC
|
||
|
||
---
|
||
CONTRIBUTING.md | 30 ++++++++++++++++++++++++
|
||
drivers/block/loop.c | 49 ++++++++++++++++++++++++++++-----------
|
||
include/linux/pm_wakeup.h | 10 ++++++++
|
||
tools/perf/util/srcline.c | 16 ++++++++++++-
|
||
4 files changed, 91 insertions(+), 14 deletions(-)
|
||
create mode 100644 CONTRIBUTING.md
|
||
|
||
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
|
||
new file mode 100644
|
||
index 000000000..3d1bacd78
|
||
--- /dev/null
|
||
+++ b/CONTRIBUTING.md
|
||
@@ -0,0 +1,30 @@
|
||
+# Contributing guide
|
||
+
|
||
+This document serves as a checklist before contributing to this repository. It includes links to read up on if topics are unclear to you.
|
||
+
|
||
+This guide mainly focuses on the proper use of Git.
|
||
+
|
||
+## 1. Issues
|
||
+
|
||
+STM32MPU projects do not activate "Github issues" feature for the time being. If you need to report an issue or question about this project deliverables, you can report them using [ ST Support Center ](https://my.st.com/ols#/ols/newrequest) or [ ST Community MPU Forum ](https://community.st.com/s/topic/0TO0X0000003u2AWAQ/stm32-mpus).
|
||
+
|
||
+## 2. Pull Requests
|
||
+
|
||
+STMicrolectronics is happy to receive contributions from the community, based on an initial Contributor License Agreement (CLA) procedure.
|
||
+
|
||
+* If you are an individual writing original source code and you are sure **you own the intellectual property**, then you need to sign an Individual CLA (https://cla.st.com).
|
||
+* If you work for a company that wants also to allow you to contribute with your work, your company needs to provide a Corporate CLA (https://cla.st.com) mentioning your GitHub account name.
|
||
+* If you are not sure that a CLA (Individual or Corporate) has been signed for your GitHub account you can check here (https://cla.st.com).
|
||
+
|
||
+Please note that:
|
||
+* The Corporate CLA will always take precedence over the Individual CLA.
|
||
+* One CLA submission is sufficient, for any project proposed by STMicroelectronics.
|
||
+
|
||
+__How to proceed__
|
||
+
|
||
+* We recommend to fork the project in your GitHub account to further develop your contribution. Please use the latest commit version.
|
||
+* Please, submit one Pull Request for one new feature or proposal. This will ease the analysis and final merge if accepted.
|
||
+
|
||
+__Note__
|
||
+
|
||
+Merge will not be done directly in GitHub but it will need first to follow internal integration process before public deliver in a standard release. The Pull request will stay open until it is merged and delivered.
|
||
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
|
||
index ef6e25185..6831ab725 100644
|
||
--- a/drivers/block/loop.c
|
||
+++ b/drivers/block/loop.c
|
||
@@ -427,11 +427,12 @@ static int lo_fallocate(struct loop_device *lo, struct request *rq, loff_t pos,
|
||
* information.
|
||
*/
|
||
struct file *file = lo->lo_backing_file;
|
||
+ struct request_queue *q = lo->lo_queue;
|
||
int ret;
|
||
|
||
mode |= FALLOC_FL_KEEP_SIZE;
|
||
|
||
- if ((!file->f_op->fallocate) || lo->lo_encrypt_key_size) {
|
||
+ if (!blk_queue_discard(q)) {
|
||
ret = -EOPNOTSUPP;
|
||
goto out;
|
||
}
|
||
@@ -461,7 +462,7 @@ static void lo_complete_rq(struct request *rq)
|
||
if (!cmd->use_aio || cmd->ret < 0 || cmd->ret == blk_rq_bytes(rq) ||
|
||
req_op(rq) != REQ_OP_READ) {
|
||
if (cmd->ret < 0)
|
||
- ret = BLK_STS_IOERR;
|
||
+ ret = errno_to_blk_status(cmd->ret);
|
||
goto end_io;
|
||
}
|
||
|
||
@@ -863,28 +864,47 @@ static void loop_config_discard(struct loop_device *lo)
|
||
struct inode *inode = file->f_mapping->host;
|
||
struct request_queue *q = lo->lo_queue;
|
||
|
||
+ /*
|
||
+ * If the backing device is a block device, mirror its zeroing
|
||
+ * capability. Set the discard sectors to the block device's zeroing
|
||
+ * capabilities because loop discards result in blkdev_issue_zeroout(),
|
||
+ * not blkdev_issue_discard(). This maintains consistent behavior with
|
||
+ * file-backed loop devices: discarded regions read back as zero.
|
||
+ */
|
||
+ if (S_ISBLK(inode->i_mode) && !lo->lo_encrypt_key_size) {
|
||
+ struct request_queue *backingq;
|
||
+
|
||
+ backingq = bdev_get_queue(inode->i_bdev);
|
||
+ blk_queue_max_discard_sectors(q,
|
||
+ backingq->limits.max_write_zeroes_sectors);
|
||
+
|
||
+ blk_queue_max_write_zeroes_sectors(q,
|
||
+ backingq->limits.max_write_zeroes_sectors);
|
||
+
|
||
/*
|
||
* We use punch hole to reclaim the free space used by the
|
||
* image a.k.a. discard. However we do not support discard if
|
||
* encryption is enabled, because it may give an attacker
|
||
* useful information.
|
||
*/
|
||
- if ((!file->f_op->fallocate) ||
|
||
- lo->lo_encrypt_key_size) {
|
||
+ } else if (!file->f_op->fallocate || lo->lo_encrypt_key_size) {
|
||
q->limits.discard_granularity = 0;
|
||
q->limits.discard_alignment = 0;
|
||
blk_queue_max_discard_sectors(q, 0);
|
||
blk_queue_max_write_zeroes_sectors(q, 0);
|
||
- blk_queue_flag_clear(QUEUE_FLAG_DISCARD, q);
|
||
- return;
|
||
- }
|
||
|
||
- q->limits.discard_granularity = inode->i_sb->s_blocksize;
|
||
- q->limits.discard_alignment = 0;
|
||
+ } else {
|
||
+ q->limits.discard_granularity = inode->i_sb->s_blocksize;
|
||
+ q->limits.discard_alignment = 0;
|
||
+
|
||
+ blk_queue_max_discard_sectors(q, UINT_MAX >> 9);
|
||
+ blk_queue_max_write_zeroes_sectors(q, UINT_MAX >> 9);
|
||
+ }
|
||
|
||
- blk_queue_max_discard_sectors(q, UINT_MAX >> 9);
|
||
- blk_queue_max_write_zeroes_sectors(q, UINT_MAX >> 9);
|
||
- blk_queue_flag_set(QUEUE_FLAG_DISCARD, q);
|
||
+ if (q->limits.max_write_zeroes_sectors)
|
||
+ blk_queue_flag_set(QUEUE_FLAG_DISCARD, q);
|
||
+ else
|
||
+ blk_queue_flag_clear(QUEUE_FLAG_DISCARD, q);
|
||
}
|
||
|
||
static void loop_unprepare_queue(struct loop_device *lo)
|
||
@@ -1950,7 +1970,10 @@ static void loop_handle_cmd(struct loop_cmd *cmd)
|
||
failed:
|
||
/* complete non-aio request */
|
||
if (!cmd->use_aio || ret) {
|
||
- cmd->ret = ret ? -EIO : 0;
|
||
+ if (ret == -EOPNOTSUPP)
|
||
+ cmd->ret = ret;
|
||
+ else
|
||
+ cmd->ret = ret ? -EIO : 0;
|
||
blk_mq_complete_request(rq);
|
||
}
|
||
}
|
||
diff --git a/include/linux/pm_wakeup.h b/include/linux/pm_wakeup.h
|
||
index 661efa029..faee74f36 100644
|
||
--- a/include/linux/pm_wakeup.h
|
||
+++ b/include/linux/pm_wakeup.h
|
||
@@ -79,6 +79,11 @@ static inline bool device_may_wakeup(struct device *dev)
|
||
return dev->power.can_wakeup && !!dev->power.wakeup;
|
||
}
|
||
|
||
+static inline bool device_wakeup_path(struct device *dev)
|
||
+{
|
||
+ return !!dev->power.wakeup_path;
|
||
+}
|
||
+
|
||
static inline void device_set_wakeup_path(struct device *dev)
|
||
{
|
||
dev->power.wakeup_path = true;
|
||
@@ -165,6 +170,11 @@ static inline bool device_may_wakeup(struct device *dev)
|
||
return dev->power.can_wakeup && dev->power.should_wakeup;
|
||
}
|
||
|
||
+static inline bool device_wakeup_path(struct device *dev)
|
||
+{
|
||
+ return false;
|
||
+}
|
||
+
|
||
static inline void device_set_wakeup_path(struct device *dev) {}
|
||
|
||
static inline void __pm_stay_awake(struct wakeup_source *ws) {}
|
||
diff --git a/tools/perf/util/srcline.c b/tools/perf/util/srcline.c
|
||
index 6ccf6f6d0..5b7d6c16d 100644
|
||
--- a/tools/perf/util/srcline.c
|
||
+++ b/tools/perf/util/srcline.c
|
||
@@ -193,16 +193,30 @@ static void find_address_in_section(bfd *abfd, asection *section, void *data)
|
||
bfd_vma pc, vma;
|
||
bfd_size_type size;
|
||
struct a2l_data *a2l = data;
|
||
+ flagword flags;
|
||
|
||
if (a2l->found)
|
||
return;
|
||
|
||
- if ((bfd_get_section_flags(abfd, section) & SEC_ALLOC) == 0)
|
||
+#ifdef bfd_get_section_flags
|
||
+ flags = bfd_get_section_flags(abfd, section);
|
||
+#else
|
||
+ flags = bfd_section_flags(section);
|
||
+#endif
|
||
+ if ((flags & SEC_ALLOC) == 0)
|
||
return;
|
||
|
||
pc = a2l->addr;
|
||
+#ifdef bfd_get_section_vma
|
||
vma = bfd_get_section_vma(abfd, section);
|
||
+#else
|
||
+ vma = bfd_section_vma(section);
|
||
+#endif
|
||
+#ifdef bfd_get_section_size
|
||
size = bfd_get_section_size(section);
|
||
+#else
|
||
+ size = bfd_section_size(section);
|
||
+#endif
|
||
|
||
if (pc < vma || pc >= vma + size)
|
||
return;
|
||
--
|
||
2.17.1
|
||
|