diff options
author | Jens Axboe <axboe@kernel.dk> | 2018-06-29 10:48:06 -0400 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2018-06-29 10:48:06 -0400 |
commit | 9544bc5347207a68eb308cc8aaaed6c3a687cabd (patch) | |
tree | 94a63c95fc1841e67aeddc0ddc9ab1872facc8ba | |
parent | 49f1c61071f528ebda699ea59ab87aec3df79d4e (diff) |
sg: remove ->sg_magic member
This was introduced more than a decade ago when sg chaining was
added, but we never really caught anything with it. The scatterlist
entry size can be critical, since drivers allocate it, so remove
the magic member. Recently it's been triggering allocation stalls
and failures in NVMe.
Tested-by: Jordan Glover <Golden_Miller83@protonmail.ch>
Acked-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 3 | ||||
-rw-r--r-- | include/linux/scatterlist.h | 18 | ||||
-rw-r--r-- | lib/scatterlist.c | 6 | ||||
-rw-r--r-- | tools/virtio/linux/scatterlist.h | 18 |
4 files changed, 0 insertions, 45 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 34c125e2d90c..9180f67746b4 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
@@ -2238,9 +2238,6 @@ static inline struct scatterlist *____sg_next(struct scatterlist *sg) | |||
2238 | **/ | 2238 | **/ |
2239 | static inline struct scatterlist *__sg_next(struct scatterlist *sg) | 2239 | static inline struct scatterlist *__sg_next(struct scatterlist *sg) |
2240 | { | 2240 | { |
2241 | #ifdef CONFIG_DEBUG_SG | ||
2242 | BUG_ON(sg->sg_magic != SG_MAGIC); | ||
2243 | #endif | ||
2244 | return sg_is_last(sg) ? NULL : ____sg_next(sg); | 2241 | return sg_is_last(sg) ? NULL : ____sg_next(sg); |
2245 | } | 2242 | } |
2246 | 2243 | ||
diff --git a/include/linux/scatterlist.h b/include/linux/scatterlist.h index 51f52020ad5f..093aa57120b0 100644 --- a/include/linux/scatterlist.h +++ b/include/linux/scatterlist.h | |||
@@ -9,9 +9,6 @@ | |||
9 | #include <asm/io.h> | 9 | #include <asm/io.h> |
10 | 10 | ||
11 | struct scatterlist { | 11 | struct scatterlist { |
12 | #ifdef CONFIG_DEBUG_SG | ||
13 | unsigned long sg_magic; | ||
14 | #endif | ||
15 | unsigned long page_link; | 12 | unsigned long page_link; |
16 | unsigned int offset; | 13 | unsigned int offset; |
17 | unsigned int length; | 14 | unsigned int length; |
@@ -64,7 +61,6 @@ struct sg_table { | |||
64 | * | 61 | * |
65 | */ | 62 | */ |
66 | 63 | ||
67 | #define SG_MAGIC 0x87654321 | ||
68 | #define SG_CHAIN 0x01UL | 64 | #define SG_CHAIN 0x01UL |
69 | #define SG_END 0x02UL | 65 | #define SG_END 0x02UL |
70 | 66 | ||
@@ -98,7 +94,6 @@ static inline void sg_assign_page(struct scatterlist *sg, struct page *page) | |||
98 | */ | 94 | */ |
99 | BUG_ON((unsigned long) page & (SG_CHAIN | SG_END)); | 95 | BUG_ON((unsigned long) page & (SG_CHAIN | SG_END)); |
100 | #ifdef CONFIG_DEBUG_SG | 96 | #ifdef CONFIG_DEBUG_SG |
101 | BUG_ON(sg->sg_magic != SG_MAGIC); | ||
102 | BUG_ON(sg_is_chain(sg)); | 97 | BUG_ON(sg_is_chain(sg)); |
103 | #endif | 98 | #endif |
104 | sg->page_link = page_link | (unsigned long) page; | 99 | sg->page_link = page_link | (unsigned long) page; |
@@ -129,7 +124,6 @@ static inline void sg_set_page(struct scatterlist *sg, struct page *page, | |||
129 | static inline struct page *sg_page(struct scatterlist *sg) | 124 | static inline struct page *sg_page(struct scatterlist *sg) |
130 | { | 125 | { |
131 | #ifdef CONFIG_DEBUG_SG | 126 | #ifdef CONFIG_DEBUG_SG |
132 | BUG_ON(sg->sg_magic != SG_MAGIC); | ||
133 | BUG_ON(sg_is_chain(sg)); | 127 | BUG_ON(sg_is_chain(sg)); |
134 | #endif | 128 | #endif |
135 | return (struct page *)((sg)->page_link & ~(SG_CHAIN | SG_END)); | 129 | return (struct page *)((sg)->page_link & ~(SG_CHAIN | SG_END)); |
@@ -195,9 +189,6 @@ static inline void sg_chain(struct scatterlist *prv, unsigned int prv_nents, | |||
195 | **/ | 189 | **/ |
196 | static inline void sg_mark_end(struct scatterlist *sg) | 190 | static inline void sg_mark_end(struct scatterlist *sg) |
197 | { | 191 | { |
198 | #ifdef CONFIG_DEBUG_SG | ||
199 | BUG_ON(sg->sg_magic != SG_MAGIC); | ||
200 | #endif | ||
201 | /* | 192 | /* |
202 | * Set termination bit, clear potential chain bit | 193 | * Set termination bit, clear potential chain bit |
203 | */ | 194 | */ |
@@ -215,9 +206,6 @@ static inline void sg_mark_end(struct scatterlist *sg) | |||
215 | **/ | 206 | **/ |
216 | static inline void sg_unmark_end(struct scatterlist *sg) | 207 | static inline void sg_unmark_end(struct scatterlist *sg) |
217 | { | 208 | { |
218 | #ifdef CONFIG_DEBUG_SG | ||
219 | BUG_ON(sg->sg_magic != SG_MAGIC); | ||
220 | #endif | ||
221 | sg->page_link &= ~SG_END; | 209 | sg->page_link &= ~SG_END; |
222 | } | 210 | } |
223 | 211 | ||
@@ -260,12 +248,6 @@ static inline void *sg_virt(struct scatterlist *sg) | |||
260 | static inline void sg_init_marker(struct scatterlist *sgl, | 248 | static inline void sg_init_marker(struct scatterlist *sgl, |
261 | unsigned int nents) | 249 | unsigned int nents) |
262 | { | 250 | { |
263 | #ifdef CONFIG_DEBUG_SG | ||
264 | unsigned int i; | ||
265 | |||
266 | for (i = 0; i < nents; i++) | ||
267 | sgl[i].sg_magic = SG_MAGIC; | ||
268 | #endif | ||
269 | sg_mark_end(&sgl[nents - 1]); | 251 | sg_mark_end(&sgl[nents - 1]); |
270 | } | 252 | } |
271 | 253 | ||
diff --git a/lib/scatterlist.c b/lib/scatterlist.c index 06dad7a072fd..d4ae67d6cd1e 100644 --- a/lib/scatterlist.c +++ b/lib/scatterlist.c | |||
@@ -24,9 +24,6 @@ | |||
24 | **/ | 24 | **/ |
25 | struct scatterlist *sg_next(struct scatterlist *sg) | 25 | struct scatterlist *sg_next(struct scatterlist *sg) |
26 | { | 26 | { |
27 | #ifdef CONFIG_DEBUG_SG | ||
28 | BUG_ON(sg->sg_magic != SG_MAGIC); | ||
29 | #endif | ||
30 | if (sg_is_last(sg)) | 27 | if (sg_is_last(sg)) |
31 | return NULL; | 28 | return NULL; |
32 | 29 | ||
@@ -111,10 +108,7 @@ struct scatterlist *sg_last(struct scatterlist *sgl, unsigned int nents) | |||
111 | for_each_sg(sgl, sg, nents, i) | 108 | for_each_sg(sgl, sg, nents, i) |
112 | ret = sg; | 109 | ret = sg; |
113 | 110 | ||
114 | #ifdef CONFIG_DEBUG_SG | ||
115 | BUG_ON(sgl[0].sg_magic != SG_MAGIC); | ||
116 | BUG_ON(!sg_is_last(ret)); | 111 | BUG_ON(!sg_is_last(ret)); |
117 | #endif | ||
118 | return ret; | 112 | return ret; |
119 | } | 113 | } |
120 | EXPORT_SYMBOL(sg_last); | 114 | EXPORT_SYMBOL(sg_last); |
diff --git a/tools/virtio/linux/scatterlist.h b/tools/virtio/linux/scatterlist.h index 9a45f90e2d08..369ee308b668 100644 --- a/tools/virtio/linux/scatterlist.h +++ b/tools/virtio/linux/scatterlist.h | |||
@@ -36,7 +36,6 @@ static inline void sg_assign_page(struct scatterlist *sg, struct page *page) | |||
36 | */ | 36 | */ |
37 | BUG_ON((unsigned long) page & 0x03); | 37 | BUG_ON((unsigned long) page & 0x03); |
38 | #ifdef CONFIG_DEBUG_SG | 38 | #ifdef CONFIG_DEBUG_SG |
39 | BUG_ON(sg->sg_magic != SG_MAGIC); | ||
40 | BUG_ON(sg_is_chain(sg)); | 39 | BUG_ON(sg_is_chain(sg)); |
41 | #endif | 40 | #endif |
42 | sg->page_link = page_link | (unsigned long) page; | 41 | sg->page_link = page_link | (unsigned long) page; |
@@ -67,7 +66,6 @@ static inline void sg_set_page(struct scatterlist *sg, struct page *page, | |||
67 | static inline struct page *sg_page(struct scatterlist *sg) | 66 | static inline struct page *sg_page(struct scatterlist *sg) |
68 | { | 67 | { |
69 | #ifdef CONFIG_DEBUG_SG | 68 | #ifdef CONFIG_DEBUG_SG |
70 | BUG_ON(sg->sg_magic != SG_MAGIC); | ||
71 | BUG_ON(sg_is_chain(sg)); | 69 | BUG_ON(sg_is_chain(sg)); |
72 | #endif | 70 | #endif |
73 | return (struct page *)((sg)->page_link & ~0x3); | 71 | return (struct page *)((sg)->page_link & ~0x3); |
@@ -116,9 +114,6 @@ static inline void sg_chain(struct scatterlist *prv, unsigned int prv_nents, | |||
116 | **/ | 114 | **/ |
117 | static inline void sg_mark_end(struct scatterlist *sg) | 115 | static inline void sg_mark_end(struct scatterlist *sg) |
118 | { | 116 | { |
119 | #ifdef CONFIG_DEBUG_SG | ||
120 | BUG_ON(sg->sg_magic != SG_MAGIC); | ||
121 | #endif | ||
122 | /* | 117 | /* |
123 | * Set termination bit, clear potential chain bit | 118 | * Set termination bit, clear potential chain bit |
124 | */ | 119 | */ |
@@ -136,17 +131,11 @@ static inline void sg_mark_end(struct scatterlist *sg) | |||
136 | **/ | 131 | **/ |
137 | static inline void sg_unmark_end(struct scatterlist *sg) | 132 | static inline void sg_unmark_end(struct scatterlist *sg) |
138 | { | 133 | { |
139 | #ifdef CONFIG_DEBUG_SG | ||
140 | BUG_ON(sg->sg_magic != SG_MAGIC); | ||
141 | #endif | ||
142 | sg->page_link &= ~0x02; | 134 | sg->page_link &= ~0x02; |
143 | } | 135 | } |
144 | 136 | ||
145 | static inline struct scatterlist *sg_next(struct scatterlist *sg) | 137 | static inline struct scatterlist *sg_next(struct scatterlist *sg) |
146 | { | 138 | { |
147 | #ifdef CONFIG_DEBUG_SG | ||
148 | BUG_ON(sg->sg_magic != SG_MAGIC); | ||
149 | #endif | ||
150 | if (sg_is_last(sg)) | 139 | if (sg_is_last(sg)) |
151 | return NULL; | 140 | return NULL; |
152 | 141 | ||
@@ -160,13 +149,6 @@ static inline struct scatterlist *sg_next(struct scatterlist *sg) | |||
160 | static inline void sg_init_table(struct scatterlist *sgl, unsigned int nents) | 149 | static inline void sg_init_table(struct scatterlist *sgl, unsigned int nents) |
161 | { | 150 | { |
162 | memset(sgl, 0, sizeof(*sgl) * nents); | 151 | memset(sgl, 0, sizeof(*sgl) * nents); |
163 | #ifdef CONFIG_DEBUG_SG | ||
164 | { | ||
165 | unsigned int i; | ||
166 | for (i = 0; i < nents; i++) | ||
167 | sgl[i].sg_magic = SG_MAGIC; | ||
168 | } | ||
169 | #endif | ||
170 | sg_mark_end(&sgl[nents - 1]); | 152 | sg_mark_end(&sgl[nents - 1]); |
171 | } | 153 | } |
172 | 154 | ||