Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1279674 > unrolled thread
| Started by | "Michael S. Tsirkin" <mst@redhat.com> |
|---|---|
| First post | 2015-11-30 09:40 +0100 |
| Last post | 2015-11-30 17:20 +0100 |
| Articles | 6 — 4 participants |
Back to article view | Back to linux.kernel
[PATCH] vhost: replace % with & on data path "Michael S. Tsirkin" <mst@redhat.com> - 2015-11-30 09:40 +0100
Re: [PATCH] vhost: replace % with & on data path Joe Perches <joe@perches.com> - 2015-11-30 09:50 +0100
Re: [PATCH] vhost: replace % with & on data path "Michael S. Tsirkin" <mst@redhat.com> - 2015-11-30 10:30 +0100
Re: [PATCH] vhost: replace % with & on data path kbuild test robot <lkp@intel.com> - 2015-11-30 10:10 +0100
Re: [PATCH] vhost: replace % with & on data path "Michael S. Tsirkin" <mst@redhat.com> - 2015-11-30 10:20 +0100
Re: [PATCH] vhost: replace % with & on data path David Miller <davem@redhat.com> - 2015-11-30 17:20 +0100
| From | "Michael S. Tsirkin" <mst@redhat.com> |
|---|---|
| Date | 2015-11-30 09:40 +0100 |
| Subject | [PATCH] vhost: replace % with & on data path |
| Message-ID | <qAsa5-1cU-11@gated-at.bofh.it> |
We know vring num is a power of 2, so use &
to mask the high bits.
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
drivers/vhost/vhost.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
index 080422f..85f0f0a 100644
--- a/drivers/vhost/vhost.c
+++ b/drivers/vhost/vhost.c
@@ -1366,10 +1366,12 @@ int vhost_get_vq_desc(struct vhost_virtqueue *vq,
/* Only get avail ring entries after they have been exposed by guest. */
smp_rmb();
+ }
+
/* Grab the next descriptor number they're advertising, and increment
* the index we've seen. */
if (unlikely(__get_user(ring_head,
- &vq->avail->ring[last_avail_idx % vq->num]))) {
+ &vq->avail->ring[last_avail_idx & (vq->num - 1)]))) {
vq_err(vq, "Failed to read head: idx %d address %p\n",
last_avail_idx,
&vq->avail->ring[last_avail_idx % vq->num]);
@@ -1489,7 +1491,7 @@ static int __vhost_add_used_n(struct vhost_virtqueue *vq,
u16 old, new;
int start;
- start = vq->last_used_idx % vq->num;
+ start = vq->last_used_idx & (vq->num - 1);
used = vq->used->ring + start;
if (count == 1) {
if (__put_user(heads[0].id, &used->id)) {
@@ -1531,7 +1533,7 @@ int vhost_add_used_n(struct vhost_virtqueue *vq, struct vring_used_elem *heads,
{
int start, n, r;
- start = vq->last_used_idx % vq->num;
+ start = vq->last_used_idx & (vq->num - 1);
n = vq->num - start;
if (n < count) {
r = __vhost_add_used_n(vq, heads, n);
--
MST
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [next] | [standalone]
| From | Joe Perches <joe@perches.com> |
|---|---|
| Date | 2015-11-30 09:50 +0100 |
| Message-ID | <qAsjN-1hf-31@gated-at.bofh.it> |
| In reply to | #1279674 |
On Mon, 2015-11-30 at 10:34 +0200, Michael S. Tsirkin wrote: > We know vring num is a power of 2, so use & > to mask the high bits. [] > diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c [] > @@ -1366,10 +1366,12 @@ int vhost_get_vq_desc(struct vhost_virtqueue *vq, > /* Only get avail ring entries after they have been exposed by guest. */ > smp_rmb(); > > + } ? -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | "Michael S. Tsirkin" <mst@redhat.com> |
|---|---|
| Date | 2015-11-30 10:30 +0100 |
| Message-ID | <qAsWu-1JR-33@gated-at.bofh.it> |
| In reply to | #1279695 |
On Mon, Nov 30, 2015 at 12:42:49AM -0800, Joe Perches wrote: > On Mon, 2015-11-30 at 10:34 +0200, Michael S. Tsirkin wrote: > > We know vring num is a power of 2, so use & > > to mask the high bits. > [] > > diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c > [] > > @@ -1366,10 +1366,12 @@ int vhost_get_vq_desc(struct vhost_virtqueue *vq, > > /* Only get avail ring entries after they have been exposed by guest. */ > > smp_rmb(); > > > > + } > > ? Yes, I noticed this - I moved this chunk from the next patch in my tree by mistake. Will fix, thanks! -- MST -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | kbuild test robot <lkp@intel.com> |
|---|---|
| Date | 2015-11-30 10:10 +0100 |
| Message-ID | <qAsD9-1CT-19@gated-at.bofh.it> |
| In reply to | #1279674 |
[Multipart message — attachments visible in raw view] — view raw
Hi Michael,
[auto build test ERROR on: v4.4-rc3]
[also build test ERROR on: next-20151127]
url: https://github.com/0day-ci/linux/commits/Michael-S-Tsirkin/vhost-replace-with-on-data-path/20151130-163704
config: s390-performance_defconfig (attached as .config)
reproduce:
wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=s390
All errors (new ones prefixed by >>):
drivers/vhost/vhost.c: In function 'vhost_get_vq_desc':
drivers/vhost/vhost.c:1345:6: warning: unused variable 'ret' [-Wunused-variable]
int ret;
^
drivers/vhost/vhost.c:1344:13: warning: unused variable 'ring_head' [-Wunused-variable]
__virtio16 ring_head;
^
drivers/vhost/vhost.c:1341:24: warning: unused variable 'found' [-Wunused-variable]
unsigned int i, head, found = 0;
^
drivers/vhost/vhost.c:1341:18: warning: unused variable 'head' [-Wunused-variable]
unsigned int i, head, found = 0;
^
drivers/vhost/vhost.c:1341:15: warning: unused variable 'i' [-Wunused-variable]
unsigned int i, head, found = 0;
^
drivers/vhost/vhost.c:1340:20: warning: unused variable 'desc' [-Wunused-variable]
struct vring_desc desc;
^
drivers/vhost/vhost.c: At top level:
drivers/vhost/vhost.c:1373:2: error: expected identifier or '(' before 'if'
if (unlikely(__get_user(ring_head,
^
In file included from include/uapi/linux/stddef.h:1:0,
from include/linux/stddef.h:4,
from include/uapi/linux/posix_types.h:4,
from include/uapi/linux/types.h:13,
from include/linux/types.h:5,
from include/uapi/asm-generic/fcntl.h:4,
from arch/s390/include/uapi/asm/fcntl.h:1,
from include/uapi/linux/fcntl.h:4,
from include/linux/fcntl.h:4,
from include/linux/eventfd.h:11,
from drivers/vhost/vhost.c:14:
>> arch/s390/include/asm/uaccess.h:250:2: error: expected identifier or '(' before ')' token
})
^
include/linux/compiler.h:166:42: note: in definition of macro 'unlikely'
# define unlikely(x) __builtin_expect(!!(x), 0)
^
drivers/vhost/vhost.c:1373:15: note: in expansion of macro '__get_user'
if (unlikely(__get_user(ring_head,
^
drivers/vhost/vhost.c:1381:2: warning: data definition has no type or storage class
head = vhost16_to_cpu(vq, ring_head);
^
drivers/vhost/vhost.c:1381:2: error: type defaults to 'int' in declaration of 'head' [-Werror=implicit-int]
drivers/vhost/vhost.c:1381:24: error: 'vq' undeclared here (not in a function)
head = vhost16_to_cpu(vq, ring_head);
^
drivers/vhost/vhost.c:1381:28: error: 'ring_head' undeclared here (not in a function)
head = vhost16_to_cpu(vq, ring_head);
^
drivers/vhost/vhost.c:1384:2: error: expected identifier or '(' before 'if'
if (unlikely(head >= vq->num)) {
^
drivers/vhost/vhost.c:1391:2: warning: data definition has no type or storage class
*out_num = *in_num = 0;
^
drivers/vhost/vhost.c:1391:3: error: type defaults to 'int' in declaration of 'out_num' [-Werror=implicit-int]
*out_num = *in_num = 0;
^
drivers/vhost/vhost.c:1391:14: error: 'in_num' undeclared here (not in a function)
*out_num = *in_num = 0;
^
drivers/vhost/vhost.c:1392:2: error: expected identifier or '(' before 'if'
if (unlikely(log))
^
drivers/vhost/vhost.c:1395:2: warning: data definition has no type or storage class
i = head;
^
drivers/vhost/vhost.c:1395:2: error: type defaults to 'int' in declaration of 'i' [-Werror=implicit-int]
drivers/vhost/vhost.c:1395:2: error: initializer element is not constant
drivers/vhost/vhost.c:1396:2: error: expected identifier or '(' before 'do'
do {
^
drivers/vhost/vhost.c:1454:4: error: expected identifier or '(' before 'while'
} while ((i = next_desc(vq, &desc)) != -1);
^
drivers/vhost/vhost.c:1457:4: error: expected '=', ',', ';', 'asm' or '__attribute__' before '->' token
vq->last_avail_idx++;
^
In file included from arch/s390/include/asm/bug.h:69:0,
from include/linux/bug.h:4,
from include/linux/thread_info.h:11,
from include/asm-generic/preempt.h:4,
from arch/s390/include/generated/asm/preempt.h:1,
from include/linux/preempt.h:59,
from include/linux/spinlock.h:50,
from include/linux/wait.h:8,
from include/linux/eventfd.h:12,
from drivers/vhost/vhost.c:14:
include/asm-generic/bug.h:55:27: error: expected identifier or '(' before 'do'
#define BUG_ON(condition) do { if (unlikely(condition)) BUG(); } while (0)
^
drivers/vhost/vhost.c:1461:2: note: in expansion of macro 'BUG_ON'
BUG_ON(!(vq->used_flags & VRING_USED_F_NO_NOTIFY));
^
include/asm-generic/bug.h:55:66: error: expected identifier or '(' before 'while'
#define BUG_ON(condition) do { if (unlikely(condition)) BUG(); } while (0)
^
drivers/vhost/vhost.c:1461:2: note: in expansion of macro 'BUG_ON'
BUG_ON(!(vq->used_flags & VRING_USED_F_NO_NOTIFY));
^
drivers/vhost/vhost.c:1462:2: error: expected identifier or '(' before 'return'
return head;
^
drivers/vhost/vhost.c:1463:1: error: expected identifier or '(' before '}' token
}
^
drivers/vhost/vhost.c:1235:12: warning: 'get_indirect' defined but not used [-Wunused-function]
static int get_indirect(struct vhost_virtqueue *vq,
^
drivers/vhost/vhost.c: In function 'vhost_get_vq_desc':
drivers/vhost/vhost.c:1369:2: warning: control reaches end of non-void function [-Wreturn-type]
}
^
cc1: some warnings being treated as errors
vim +250 arch/s390/include/asm/uaccess.h
cfa785e62 arch/s390/include/asm/uaccess.h Heiko Carstens 2014-01-22 234 sizeof(*(ptr))); \
97fa5a664 include/asm-s390/uaccess.h Al Viro 2006-02-03 235 (x) = *(__force __typeof__(*(ptr)) *) &__x; \
1047aa772 include/asm-s390/uaccess.h Martin Schwidefsky 2005-11-07 236 break; \
1047aa772 include/asm-s390/uaccess.h Martin Schwidefsky 2005-11-07 237 }; \
1047aa772 include/asm-s390/uaccess.h Martin Schwidefsky 2005-11-07 238 case 8: { \
1047aa772 include/asm-s390/uaccess.h Martin Schwidefsky 2005-11-07 239 unsigned long long __x; \
cfa785e62 arch/s390/include/asm/uaccess.h Heiko Carstens 2014-01-22 240 __gu_err = __get_user_fn(&__x, ptr, \
cfa785e62 arch/s390/include/asm/uaccess.h Heiko Carstens 2014-01-22 241 sizeof(*(ptr))); \
97fa5a664 include/asm-s390/uaccess.h Al Viro 2006-02-03 242 (x) = *(__force __typeof__(*(ptr)) *) &__x; \
^1da177e4 include/asm-s390/uaccess.h Linus Torvalds 2005-04-16 243 break; \
1047aa772 include/asm-s390/uaccess.h Martin Schwidefsky 2005-11-07 244 }; \
^1da177e4 include/asm-s390/uaccess.h Linus Torvalds 2005-04-16 245 default: \
^1da177e4 include/asm-s390/uaccess.h Linus Torvalds 2005-04-16 246 __get_user_bad(); \
^1da177e4 include/asm-s390/uaccess.h Linus Torvalds 2005-04-16 247 break; \
^1da177e4 include/asm-s390/uaccess.h Linus Torvalds 2005-04-16 248 } \
^1da177e4 include/asm-s390/uaccess.h Linus Torvalds 2005-04-16 249 __gu_err; \
^1da177e4 include/asm-s390/uaccess.h Linus Torvalds 2005-04-16 @250 })
^1da177e4 include/asm-s390/uaccess.h Linus Torvalds 2005-04-16 251
^1da177e4 include/asm-s390/uaccess.h Linus Torvalds 2005-04-16 252 #define get_user(x, ptr) \
^1da177e4 include/asm-s390/uaccess.h Linus Torvalds 2005-04-16 253 ({ \
dab4079d5 arch/s390/include/asm/uaccess.h Heiko Carstens 2009-06-12 254 might_fault(); \
^1da177e4 include/asm-s390/uaccess.h Linus Torvalds 2005-04-16 255 __get_user(x, ptr); \
^1da177e4 include/asm-s390/uaccess.h Linus Torvalds 2005-04-16 256 })
^1da177e4 include/asm-s390/uaccess.h Linus Torvalds 2005-04-16 257
4f41c2b45 arch/s390/include/asm/uaccess.h Heiko Carstens 2014-01-23 258 int __get_user_bad(void) __attribute__((noreturn));
:::::: The code at line 250 was first introduced by commit
:::::: 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 Linux-2.6.12-rc2
:::::: TO: Linus Torvalds <torvalds@ppc970.osdl.org>
:::::: CC: Linus Torvalds <torvalds@ppc970.osdl.org>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[toc] | [prev] | [next] | [standalone]
| From | "Michael S. Tsirkin" <mst@redhat.com> |
|---|---|
| Date | 2015-11-30 10:20 +0100 |
| Message-ID | <qAsMN-1Go-7@gated-at.bofh.it> |
| In reply to | #1279674 |
On Mon, Nov 30, 2015 at 10:34:07AM +0200, Michael S. Tsirkin wrote:
> We know vring num is a power of 2, so use &
> to mask the high bits.
>
> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
> ---
> drivers/vhost/vhost.c | 8 +++++---
> 1 file changed, 5 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
> index 080422f..85f0f0a 100644
> --- a/drivers/vhost/vhost.c
> +++ b/drivers/vhost/vhost.c
> @@ -1366,10 +1366,12 @@ int vhost_get_vq_desc(struct vhost_virtqueue *vq,
> /* Only get avail ring entries after they have been exposed by guest. */
> smp_rmb();
>
> + }
> +
Oops. This sneaked in from an unrelated patch.
Pls ignore, will repost.
> /* Grab the next descriptor number they're advertising, and increment
> * the index we've seen. */
> if (unlikely(__get_user(ring_head,
> - &vq->avail->ring[last_avail_idx % vq->num]))) {
> + &vq->avail->ring[last_avail_idx & (vq->num - 1)]))) {
> vq_err(vq, "Failed to read head: idx %d address %p\n",
> last_avail_idx,
> &vq->avail->ring[last_avail_idx % vq->num]);
> @@ -1489,7 +1491,7 @@ static int __vhost_add_used_n(struct vhost_virtqueue *vq,
> u16 old, new;
> int start;
>
> - start = vq->last_used_idx % vq->num;
> + start = vq->last_used_idx & (vq->num - 1);
> used = vq->used->ring + start;
> if (count == 1) {
> if (__put_user(heads[0].id, &used->id)) {
> @@ -1531,7 +1533,7 @@ int vhost_add_used_n(struct vhost_virtqueue *vq, struct vring_used_elem *heads,
> {
> int start, n, r;
>
> - start = vq->last_used_idx % vq->num;
> + start = vq->last_used_idx & (vq->num - 1);
> n = vq->num - start;
> if (n < count) {
> r = __vhost_add_used_n(vq, heads, n);
> --
> MST
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | David Miller <davem@redhat.com> |
|---|---|
| Date | 2015-11-30 17:20 +0100 |
| Message-ID | <qAzlg-5Uw-19@gated-at.bofh.it> |
| In reply to | #1279674 |
From: "Michael S. Tsirkin" <mst@redhat.com> Date: Mon, 30 Nov 2015 10:34:07 +0200 > We know vring num is a power of 2, so use & > to mask the high bits. > > Signed-off-by: Michael S. Tsirkin <mst@redhat.com> > --- > drivers/vhost/vhost.c | 8 +++++--- > 1 file changed, 5 insertions(+), 3 deletions(-) > > diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c > index 080422f..85f0f0a 100644 > --- a/drivers/vhost/vhost.c > +++ b/drivers/vhost/vhost.c > @@ -1366,10 +1366,12 @@ int vhost_get_vq_desc(struct vhost_virtqueue *vq, > /* Only get avail ring entries after they have been exposed by guest. */ > smp_rmb(); > > + } > + !!! -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web