]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
tcmu: Fix flushing cmd entry dcache page
authorXiubo Li <lixiubo@cmss.chinamobile.com>
Fri, 30 Jun 2017 08:14:16 +0000 (16:14 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 11 Aug 2017 15:33:54 +0000 (08:33 -0700)
commit 9d62bc0e6d79b11e3298e831358155930fb8f5e3 upstream.

When feeding the tcmu's cmd ring, we need to flush the dcache page
for the cmd entry to make sure these kernel stores are visible to
user space mappings of that page.

For the none PAD cmd entry, this will be flushed at the end of the
tcmu_queue_cmd_ring().

Signed-off-by: Xiubo Li <lixiubo@cmss.chinamobile.com>
Reviewed-by: Mike Christie <mchristi@redhat.com>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/target/target_core_user.c

index beb5f098f32d6f7bb5851deb810065ab37e4ac4a..c8b63b8b983c18e10d5b1df5b976a2129c6f977a 100644 (file)
@@ -699,21 +699,21 @@ tcmu_queue_cmd_ring(struct tcmu_cmd *tcmu_cmd)
                size_t pad_size = head_to_end(cmd_head, udev->cmdr_size);
 
                entry = (void *) mb + CMDR_OFF + cmd_head;
-               tcmu_flush_dcache_range(entry, sizeof(*entry));
                tcmu_hdr_set_op(&entry->hdr.len_op, TCMU_OP_PAD);
                tcmu_hdr_set_len(&entry->hdr.len_op, pad_size);
                entry->hdr.cmd_id = 0; /* not used for PAD */
                entry->hdr.kflags = 0;
                entry->hdr.uflags = 0;
+               tcmu_flush_dcache_range(entry, sizeof(*entry));
 
                UPDATE_HEAD(mb->cmd_head, pad_size, udev->cmdr_size);
+               tcmu_flush_dcache_range(mb, sizeof(*mb));
 
                cmd_head = mb->cmd_head % udev->cmdr_size; /* UAM */
                WARN_ON(cmd_head != 0);
        }
 
        entry = (void *) mb + CMDR_OFF + cmd_head;
-       tcmu_flush_dcache_range(entry, sizeof(*entry));
        tcmu_hdr_set_op(&entry->hdr.len_op, TCMU_OP_CMD);
        entry->hdr.cmd_id = tcmu_cmd->cmd_id;
        entry->hdr.kflags = 0;