All of lore.kernel.org
 help / color / mirror / Atom feed
* arch/x86/kvm/../../../virt/kvm/binary_stats.c:139:3: warning: Value stored to 'remain' is never read [clang-analyzer-deadcode.DeadStores]
@ 2021-08-09 19:59 kernel test robot
  2021-08-10  8:28   ` kernel test robot
  0 siblings, 1 reply; 4+ messages in thread
From: kernel test robot @ 2021-08-09 19:59 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 27011 bytes --]

CC: clang-built-linux(a)googlegroups.com
CC: kbuild-all(a)lists.01.org
CC: linux-kernel(a)vger.kernel.org
TO: Jing Zhang <jingzhangos@google.com>
CC: Paolo Bonzini <pbonzini@redhat.com>
CC: David Matlack <dmatlack@google.com>
CC: Ricardo Koller <ricarkol@google.com>
CC: Krish Sadhukhan <krish.sadhukhan@oracle.com>
CC: Fuad Tabba <tabba@google.com>

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head:   36a21d51725af2ce0700c6ebcb6b9594aac658a6
commit: cb082bfab59a224a49ae803fed52cd03e8d6b5e0 KVM: stats: Add fd-based API to read binary stats data
date:   7 weeks ago
:::::: branch date: 23 hours ago
:::::: commit date: 7 weeks ago
config: x86_64-randconfig-c001-20210806 (attached as .config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project 42b9c2a17a0b63cccf3ac197a82f91b28e53e643)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # install x86_64 cross compiling tool for clang build
        # apt-get install binutils-x86-64-linux-gnu
        # https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=cb082bfab59a224a49ae803fed52cd03e8d6b5e0
        git remote add linus https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
        git fetch --no-tags linus master
        git checkout cb082bfab59a224a49ae803fed52cd03e8d6b5e0
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=x86_64 clang-analyzer 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>


clang-analyzer warnings: (new ones prefixed by >>)
                              ^~~~~~   ~~~~~~~~~~~~~~~
   drivers/media/dvb-frontends/cxd2820r_core.c:206:21: note: Value stored to 'client' during its initialization is never read
           struct i2c_client *client = priv->client[0];
                              ^~~~~~   ~~~~~~~~~~~~~~~
   drivers/media/dvb-frontends/cxd2820r_core.c:207:34: warning: Value stored to 'c' during its initialization is never read [clang-analyzer-deadcode.DeadStores]
           struct dtv_frontend_properties *c = &fe->dtv_property_cache;
                                           ^   ~~~~~~~~~~~~~~~~~~~~~~~
   drivers/media/dvb-frontends/cxd2820r_core.c:207:34: note: Value stored to 'c' during its initialization is never read
           struct dtv_frontend_properties *c = &fe->dtv_property_cache;
                                           ^   ~~~~~~~~~~~~~~~~~~~~~~~
   drivers/media/dvb-frontends/cxd2820r_core.c:220:21: warning: Value stored to 'client' during its initialization is never read [clang-analyzer-deadcode.DeadStores]
           struct i2c_client *client = priv->client[0];
                              ^~~~~~   ~~~~~~~~~~~~~~~
   drivers/media/dvb-frontends/cxd2820r_core.c:220:21: note: Value stored to 'client' during its initialization is never read
           struct i2c_client *client = priv->client[0];
                              ^~~~~~   ~~~~~~~~~~~~~~~
   drivers/media/dvb-frontends/cxd2820r_core.c:236:21: warning: Value stored to 'client' during its initialization is never read [clang-analyzer-deadcode.DeadStores]
           struct i2c_client *client = priv->client[0];
                              ^~~~~~   ~~~~~~~~~~~~~~~
   drivers/media/dvb-frontends/cxd2820r_core.c:236:21: note: Value stored to 'client' during its initialization is never read
           struct i2c_client *client = priv->client[0];
                              ^~~~~~   ~~~~~~~~~~~~~~~
   drivers/media/dvb-frontends/cxd2820r_core.c:252:21: warning: Value stored to 'client' during its initialization is never read [clang-analyzer-deadcode.DeadStores]
           struct i2c_client *client = priv->client[0];
                              ^~~~~~   ~~~~~~~~~~~~~~~
   drivers/media/dvb-frontends/cxd2820r_core.c:252:21: note: Value stored to 'client' during its initialization is never read
           struct i2c_client *client = priv->client[0];
                              ^~~~~~   ~~~~~~~~~~~~~~~
   drivers/media/dvb-frontends/cxd2820r_core.c:253:34: warning: Value stored to 'c' during its initialization is never read [clang-analyzer-deadcode.DeadStores]
           struct dtv_frontend_properties *c = &fe->dtv_property_cache;
                                           ^   ~~~~~~~~~~~~~~~~~~~~~~~
   drivers/media/dvb-frontends/cxd2820r_core.c:253:34: note: Value stored to 'c' during its initialization is never read
           struct dtv_frontend_properties *c = &fe->dtv_property_cache;
                                           ^   ~~~~~~~~~~~~~~~~~~~~~~~
   drivers/media/dvb-frontends/cxd2820r_core.c:270:21: warning: Value stored to 'client' during its initialization is never read [clang-analyzer-deadcode.DeadStores]
           struct i2c_client *client = priv->client[0];
                              ^~~~~~   ~~~~~~~~~~~~~~~
   drivers/media/dvb-frontends/cxd2820r_core.c:270:21: note: Value stored to 'client' during its initialization is never read
           struct i2c_client *client = priv->client[0];
                              ^~~~~~   ~~~~~~~~~~~~~~~
   drivers/media/dvb-frontends/cxd2820r_core.c:297:21: warning: Value stored to 'client' during its initialization is never read [clang-analyzer-deadcode.DeadStores]
           struct i2c_client *client = priv->client[0];
                              ^~~~~~   ~~~~~~~~~~~~~~~
   drivers/media/dvb-frontends/cxd2820r_core.c:297:21: note: Value stored to 'client' during its initialization is never read
           struct i2c_client *client = priv->client[0];
                              ^~~~~~   ~~~~~~~~~~~~~~~
   drivers/media/dvb-frontends/cxd2820r_core.c:323:21: warning: Value stored to 'client' during its initialization is never read [clang-analyzer-deadcode.DeadStores]
           struct i2c_client *client = priv->client[0];
                              ^~~~~~   ~~~~~~~~~~~~~~~
   drivers/media/dvb-frontends/cxd2820r_core.c:323:21: note: Value stored to 'client' during its initialization is never read
           struct i2c_client *client = priv->client[0];
                              ^~~~~~   ~~~~~~~~~~~~~~~
   drivers/media/dvb-frontends/cxd2820r_core.c:413:21: warning: Value stored to 'client' during its initialization is never read [clang-analyzer-deadcode.DeadStores]
           struct i2c_client *client = priv->client[0];
                              ^~~~~~   ~~~~~~~~~~~~~~~
   drivers/media/dvb-frontends/cxd2820r_core.c:413:21: note: Value stored to 'client' during its initialization is never read
           struct i2c_client *client = priv->client[0];
                              ^~~~~~   ~~~~~~~~~~~~~~~
   drivers/media/dvb-frontends/cxd2820r_core.c:425:21: warning: Value stored to 'client' during its initialization is never read [clang-analyzer-deadcode.DeadStores]
           struct i2c_client *client = priv->client[0];
                              ^~~~~~   ~~~~~~~~~~~~~~~
   drivers/media/dvb-frontends/cxd2820r_core.c:425:21: note: Value stored to 'client' during its initialization is never read
           struct i2c_client *client = priv->client[0];
                              ^~~~~~   ~~~~~~~~~~~~~~~
   drivers/media/dvb-frontends/cxd2820r_core.c:439:21: warning: Value stored to 'client' during its initialization is never read [clang-analyzer-deadcode.DeadStores]
           struct i2c_client *client = priv->client[0];
                              ^~~~~~   ~~~~~~~~~~~~~~~
   drivers/media/dvb-frontends/cxd2820r_core.c:439:21: note: Value stored to 'client' during its initialization is never read
           struct i2c_client *client = priv->client[0];
                              ^~~~~~   ~~~~~~~~~~~~~~~
   drivers/media/dvb-frontends/cxd2820r_core.c:455:21: warning: Value stored to 'client' during its initialization is never read [clang-analyzer-deadcode.DeadStores]
           struct i2c_client *client = priv->client[0];
                              ^~~~~~   ~~~~~~~~~~~~~~~
   drivers/media/dvb-frontends/cxd2820r_core.c:455:21: note: Value stored to 'client' during its initialization is never read
           struct i2c_client *client = priv->client[0];
                              ^~~~~~   ~~~~~~~~~~~~~~~
   Suppressed 2 warnings (2 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   5 warnings generated.
   Suppressed 5 warnings (5 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   6 warnings generated.
   arch/x86/kvm/../../../virt/kvm/eventfd.c:385:2: warning: Value stored to 'ret' is never read [clang-analyzer-deadcode.DeadStores]
           ret = 0;
           ^     ~
   arch/x86/kvm/../../../virt/kvm/eventfd.c:385:2: note: Value stored to 'ret' is never read
           ret = 0;
           ^     ~
   Suppressed 5 warnings (5 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   5 warnings generated.
   Suppressed 5 warnings (5 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   5 warnings generated.
   Suppressed 5 warnings (5 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   6 warnings generated.
   Suppressed 6 warnings (5 in non-user code, 1 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   7 warnings generated.
>> arch/x86/kvm/../../../virt/kvm/binary_stats.c:139:3: warning: Value stored to 'remain' is never read [clang-analyzer-deadcode.DeadStores]
                   remain -= copylen;
                   ^         ~~~~~~~
   arch/x86/kvm/../../../virt/kvm/binary_stats.c:139:3: note: Value stored to 'remain' is never read
                   remain -= copylen;
                   ^         ~~~~~~~
>> arch/x86/kvm/../../../virt/kvm/binary_stats.c:141:3: warning: Value stored to 'dest' is never read [clang-analyzer-deadcode.DeadStores]
                   dest += copylen;
                   ^       ~~~~~~~
   arch/x86/kvm/../../../virt/kvm/binary_stats.c:141:3: note: Value stored to 'dest' is never read
                   dest += copylen;
                   ^       ~~~~~~~
   Suppressed 5 warnings (5 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   5 warnings generated.
   Suppressed 5 warnings (5 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   7 warnings generated.
   Suppressed 7 warnings (7 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   7 warnings generated.
   arch/x86/kvm/emulate.c:1521:9: warning: 2nd function call argument is an uninitialized value [clang-analyzer-core.CallAndMessage]
           return linear_read_system(ctxt, *desc_addr_p, desc, sizeof(*desc));
                  ^
   arch/x86/kvm/emulate.c:3671:6: note: Assuming field 'modrm_reg' is not equal to VCPU_SREG_CS
           if (ctxt->modrm_reg == VCPU_SREG_CS || ctxt->modrm_reg > VCPU_SREG_GS)
               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   arch/x86/kvm/emulate.c:3671:6: note: Left side of '||' is false
   arch/x86/kvm/emulate.c:3671:41: note: Assuming field 'modrm_reg' is <= VCPU_SREG_GS
           if (ctxt->modrm_reg == VCPU_SREG_CS || ctxt->modrm_reg > VCPU_SREG_GS)
                                                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   arch/x86/kvm/emulate.c:3671:2: note: Taking false branch
           if (ctxt->modrm_reg == VCPU_SREG_CS || ctxt->modrm_reg > VCPU_SREG_GS)
           ^
   arch/x86/kvm/emulate.c:3674:6: note: Assuming field 'modrm_reg' is not equal to VCPU_SREG_SS
           if (ctxt->modrm_reg == VCPU_SREG_SS)
               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   arch/x86/kvm/emulate.c:3674:2: note: Taking false branch
           if (ctxt->modrm_reg == VCPU_SREG_SS)
           ^
   arch/x86/kvm/emulate.c:3679:9: note: Calling 'load_segment_descriptor'
           return load_segment_descriptor(ctxt, sel, ctxt->modrm_reg);
                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   arch/x86/kvm/emulate.c:1727:6: note: 'seg' is not equal to VCPU_SREG_SS
           if (seg == VCPU_SREG_SS && selector == 3 &&
               ^~~
   arch/x86/kvm/emulate.c:1727:26: note: Left side of '&&' is false
           if (seg == VCPU_SREG_SS && selector == 3 &&
                                   ^
   arch/x86/kvm/emulate.c:1731:9: note: Calling '__load_segment_descriptor'
           return __load_segment_descriptor(ctxt, selector, seg, cpl,
                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   arch/x86/kvm/emulate.c:1547:23: note: Assuming the condition is false
           bool null_selector = !(selector & ~0x3); /* 0000-0003 are null */
                                ^~~~~~~~~~~~~~~~~~
   arch/x86/kvm/emulate.c:1548:2: note: 'desc_addr' declared without an initial value
           ulong desc_addr;
           ^~~~~~~~~~~~~~~
   arch/x86/kvm/emulate.c:1555:6: note: Assuming field 'mode' is not equal to X86EMUL_MODE_REAL
           if (ctxt->mode == X86EMUL_MODE_REAL) {
               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   arch/x86/kvm/emulate.c:1555:2: note: Taking false branch
           if (ctxt->mode == X86EMUL_MODE_REAL) {
           ^
   arch/x86/kvm/emulate.c:1561:13: note: 'seg' is <= VCPU_SREG_GS
           } else if (seg <= VCPU_SREG_GS && ctxt->mode == X86EMUL_MODE_VM86) {
                      ^~~
   arch/x86/kvm/emulate.c:1561:13: note: Left side of '&&' is true
   arch/x86/kvm/emulate.c:1561:36: note: Assuming field 'mode' is not equal to X86EMUL_MODE_VM86
           } else if (seg <= VCPU_SREG_GS && ctxt->mode == X86EMUL_MODE_VM86) {
                                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   arch/x86/kvm/emulate.c:1561:9: note: Taking false branch
           } else if (seg <= VCPU_SREG_GS && ctxt->mode == X86EMUL_MODE_VM86) {
                  ^
   arch/x86/kvm/emulate.c:1575:6: note: 'seg' is not equal to VCPU_SREG_TR
           if (seg == VCPU_SREG_TR && (selector & (1 << 2)))
               ^~~
   arch/x86/kvm/emulate.c:1575:26: note: Left side of '&&' is false
           if (seg == VCPU_SREG_TR && (selector & (1 << 2)))
                                   ^
   arch/x86/kvm/emulate.c:1579:6: note: 'null_selector' is false
           if (null_selector) {
               ^~~~~~~~~~~~~
   arch/x86/kvm/emulate.c:1579:2: note: Taking false branch
           if (null_selector) {
           ^
   arch/x86/kvm/emulate.c:1603:8: note: Calling 'read_segment_descriptor'
           ret = read_segment_descriptor(ctxt, selector, &seg_desc, &desc_addr);
                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   arch/x86/kvm/emulate.c:1517:7: note: Calling 'get_descriptor_ptr'
           rc = get_descriptor_ptr(ctxt, selector, desc_addr_p);
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   arch/x86/kvm/emulate.c:1491:6: note: Assuming the condition is true
           if (dt.size < index * 8 + 7)
               ^~~~~~~~~~~~~~~~~~~~~~~
   arch/x86/kvm/emulate.c:1491:2: note: Taking true branch
           if (dt.size < index * 8 + 7)
           ^
   arch/x86/kvm/emulate.c:1517:7: note: Returning from 'get_descriptor_ptr'
           rc = get_descriptor_ptr(ctxt, selector, desc_addr_p);
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   arch/x86/kvm/emulate.c:1518:6: note: Assuming 'rc' is equal to X86EMUL_CONTINUE
           if (rc != X86EMUL_CONTINUE)
               ^~~~~~~~~~~~~~~~~~~~~~
   arch/x86/kvm/emulate.c:1518:2: note: Taking false branch
           if (rc != X86EMUL_CONTINUE)
           ^

vim +/remain +139 arch/x86/kvm/../../../virt/kvm/binary_stats.c

cb082bfab59a224 Jing Zhang 2021-06-18   12  
cb082bfab59a224 Jing Zhang 2021-06-18   13  /**
cb082bfab59a224 Jing Zhang 2021-06-18   14   * kvm_stats_read() - Common function to read from the binary statistics
cb082bfab59a224 Jing Zhang 2021-06-18   15   * file descriptor.
cb082bfab59a224 Jing Zhang 2021-06-18   16   *
cb082bfab59a224 Jing Zhang 2021-06-18   17   * @id: identification string of the stats
cb082bfab59a224 Jing Zhang 2021-06-18   18   * @header: stats header for a vm or a vcpu
cb082bfab59a224 Jing Zhang 2021-06-18   19   * @desc: start address of an array of stats descriptors for a vm or a vcpu
cb082bfab59a224 Jing Zhang 2021-06-18   20   * @stats: start address of stats data block for a vm or a vcpu
cb082bfab59a224 Jing Zhang 2021-06-18   21   * @size_stats: the size of stats data block pointed by @stats
cb082bfab59a224 Jing Zhang 2021-06-18   22   * @user_buffer: start address of userspace buffer
cb082bfab59a224 Jing Zhang 2021-06-18   23   * @size: requested read size from userspace
cb082bfab59a224 Jing Zhang 2021-06-18   24   * @offset: the start position from which the content will be read for the
cb082bfab59a224 Jing Zhang 2021-06-18   25   *          corresponding vm or vcp file descriptor
cb082bfab59a224 Jing Zhang 2021-06-18   26   *
cb082bfab59a224 Jing Zhang 2021-06-18   27   * The file content of a vm/vcpu file descriptor is now defined as below:
cb082bfab59a224 Jing Zhang 2021-06-18   28   * +-------------+
cb082bfab59a224 Jing Zhang 2021-06-18   29   * |   Header    |
cb082bfab59a224 Jing Zhang 2021-06-18   30   * +-------------+
cb082bfab59a224 Jing Zhang 2021-06-18   31   * |  id string  |
cb082bfab59a224 Jing Zhang 2021-06-18   32   * +-------------+
cb082bfab59a224 Jing Zhang 2021-06-18   33   * | Descriptors |
cb082bfab59a224 Jing Zhang 2021-06-18   34   * +-------------+
cb082bfab59a224 Jing Zhang 2021-06-18   35   * | Stats Data  |
cb082bfab59a224 Jing Zhang 2021-06-18   36   * +-------------+
cb082bfab59a224 Jing Zhang 2021-06-18   37   * Although this function allows userspace to read any amount of data (as long
cb082bfab59a224 Jing Zhang 2021-06-18   38   * as in the limit) from any position, the typical usage would follow below
cb082bfab59a224 Jing Zhang 2021-06-18   39   * steps:
cb082bfab59a224 Jing Zhang 2021-06-18   40   * 1. Read header from offset 0. Get the offset of descriptors and stats data
cb082bfab59a224 Jing Zhang 2021-06-18   41   *    and some other necessary information. This is a one-time work for the
cb082bfab59a224 Jing Zhang 2021-06-18   42   *    lifecycle of the corresponding vm/vcpu stats fd.
cb082bfab59a224 Jing Zhang 2021-06-18   43   * 2. Read id string from its offset. This is a one-time work for the lifecycle
cb082bfab59a224 Jing Zhang 2021-06-18   44   *    of the corresponding vm/vcpu stats fd.
cb082bfab59a224 Jing Zhang 2021-06-18   45   * 3. Read descriptors from its offset and discover all the stats by parsing
cb082bfab59a224 Jing Zhang 2021-06-18   46   *    descriptors. This is a one-time work for the lifecycle of the
cb082bfab59a224 Jing Zhang 2021-06-18   47   *    corresponding vm/vcpu stats fd.
cb082bfab59a224 Jing Zhang 2021-06-18   48   * 4. Periodically read stats data from its offset using pread.
cb082bfab59a224 Jing Zhang 2021-06-18   49   *
cb082bfab59a224 Jing Zhang 2021-06-18   50   * Return: the number of bytes that has been successfully read
cb082bfab59a224 Jing Zhang 2021-06-18   51   */
cb082bfab59a224 Jing Zhang 2021-06-18   52  ssize_t kvm_stats_read(char *id, const struct kvm_stats_header *header,
cb082bfab59a224 Jing Zhang 2021-06-18   53  		       const struct _kvm_stats_desc *desc,
cb082bfab59a224 Jing Zhang 2021-06-18   54  		       void *stats, size_t size_stats,
cb082bfab59a224 Jing Zhang 2021-06-18   55  		       char __user *user_buffer, size_t size, loff_t *offset)
cb082bfab59a224 Jing Zhang 2021-06-18   56  {
cb082bfab59a224 Jing Zhang 2021-06-18   57  	ssize_t len;
cb082bfab59a224 Jing Zhang 2021-06-18   58  	ssize_t copylen;
cb082bfab59a224 Jing Zhang 2021-06-18   59  	ssize_t remain = size;
cb082bfab59a224 Jing Zhang 2021-06-18   60  	size_t size_desc;
cb082bfab59a224 Jing Zhang 2021-06-18   61  	size_t size_header;
cb082bfab59a224 Jing Zhang 2021-06-18   62  	void *src;
cb082bfab59a224 Jing Zhang 2021-06-18   63  	loff_t pos = *offset;
cb082bfab59a224 Jing Zhang 2021-06-18   64  	char __user *dest = user_buffer;
cb082bfab59a224 Jing Zhang 2021-06-18   65  
cb082bfab59a224 Jing Zhang 2021-06-18   66  	size_header = sizeof(*header);
cb082bfab59a224 Jing Zhang 2021-06-18   67  	size_desc = header->num_desc * sizeof(*desc);
cb082bfab59a224 Jing Zhang 2021-06-18   68  
cb082bfab59a224 Jing Zhang 2021-06-18   69  	len = KVM_STATS_NAME_SIZE + size_header + size_desc + size_stats - pos;
cb082bfab59a224 Jing Zhang 2021-06-18   70  	len = min(len, remain);
cb082bfab59a224 Jing Zhang 2021-06-18   71  	if (len <= 0)
cb082bfab59a224 Jing Zhang 2021-06-18   72  		return 0;
cb082bfab59a224 Jing Zhang 2021-06-18   73  	remain = len;
cb082bfab59a224 Jing Zhang 2021-06-18   74  
cb082bfab59a224 Jing Zhang 2021-06-18   75  	/*
cb082bfab59a224 Jing Zhang 2021-06-18   76  	 * Copy kvm stats header.
cb082bfab59a224 Jing Zhang 2021-06-18   77  	 * The header is the first block of content userspace usually read out.
cb082bfab59a224 Jing Zhang 2021-06-18   78  	 * The pos is 0 and the copylen and remain would be the size of header.
cb082bfab59a224 Jing Zhang 2021-06-18   79  	 * The copy of the header would be skipped if offset is larger than the
cb082bfab59a224 Jing Zhang 2021-06-18   80  	 * size of header. That usually happens when userspace reads stats
cb082bfab59a224 Jing Zhang 2021-06-18   81  	 * descriptors and stats data.
cb082bfab59a224 Jing Zhang 2021-06-18   82  	 */
cb082bfab59a224 Jing Zhang 2021-06-18   83  	copylen = size_header - pos;
cb082bfab59a224 Jing Zhang 2021-06-18   84  	copylen = min(copylen, remain);
cb082bfab59a224 Jing Zhang 2021-06-18   85  	if (copylen > 0) {
cb082bfab59a224 Jing Zhang 2021-06-18   86  		src = (void *)header + pos;
cb082bfab59a224 Jing Zhang 2021-06-18   87  		if (copy_to_user(dest, src, copylen))
cb082bfab59a224 Jing Zhang 2021-06-18   88  			return -EFAULT;
cb082bfab59a224 Jing Zhang 2021-06-18   89  		remain -= copylen;
cb082bfab59a224 Jing Zhang 2021-06-18   90  		pos += copylen;
cb082bfab59a224 Jing Zhang 2021-06-18   91  		dest += copylen;
cb082bfab59a224 Jing Zhang 2021-06-18   92  	}
cb082bfab59a224 Jing Zhang 2021-06-18   93  
cb082bfab59a224 Jing Zhang 2021-06-18   94  	/*
cb082bfab59a224 Jing Zhang 2021-06-18   95  	 * Copy kvm stats header id string.
cb082bfab59a224 Jing Zhang 2021-06-18   96  	 * The id string is unique for every vm/vcpu, which is stored in kvm
cb082bfab59a224 Jing Zhang 2021-06-18   97  	 * and kvm_vcpu structure.
cb082bfab59a224 Jing Zhang 2021-06-18   98  	 * The id string is part of the stat header from the perspective of
cb082bfab59a224 Jing Zhang 2021-06-18   99  	 * userspace, it is usually read out together with previous constant
cb082bfab59a224 Jing Zhang 2021-06-18  100  	 * header part and could be skipped for later descriptors and stats
cb082bfab59a224 Jing Zhang 2021-06-18  101  	 * data readings.
cb082bfab59a224 Jing Zhang 2021-06-18  102  	 */
cb082bfab59a224 Jing Zhang 2021-06-18  103  	copylen = header->id_offset + KVM_STATS_NAME_SIZE - pos;
cb082bfab59a224 Jing Zhang 2021-06-18  104  	copylen = min(copylen, remain);
cb082bfab59a224 Jing Zhang 2021-06-18  105  	if (copylen > 0) {
cb082bfab59a224 Jing Zhang 2021-06-18  106  		src = id + pos - header->id_offset;
cb082bfab59a224 Jing Zhang 2021-06-18  107  		if (copy_to_user(dest, src, copylen))
cb082bfab59a224 Jing Zhang 2021-06-18  108  			return -EFAULT;
cb082bfab59a224 Jing Zhang 2021-06-18  109  		remain -= copylen;
cb082bfab59a224 Jing Zhang 2021-06-18  110  		pos += copylen;
cb082bfab59a224 Jing Zhang 2021-06-18  111  		dest += copylen;
cb082bfab59a224 Jing Zhang 2021-06-18  112  	}
cb082bfab59a224 Jing Zhang 2021-06-18  113  
cb082bfab59a224 Jing Zhang 2021-06-18  114  	/*
cb082bfab59a224 Jing Zhang 2021-06-18  115  	 * Copy kvm stats descriptors.
cb082bfab59a224 Jing Zhang 2021-06-18  116  	 * The descriptors copy would be skipped in the typical case that
cb082bfab59a224 Jing Zhang 2021-06-18  117  	 * userspace periodically read stats data, since the pos would be
cb082bfab59a224 Jing Zhang 2021-06-18  118  	 * greater than the end address of descriptors
cb082bfab59a224 Jing Zhang 2021-06-18  119  	 * (header->header.desc_offset + size_desc) causing copylen <= 0.
cb082bfab59a224 Jing Zhang 2021-06-18  120  	 */
cb082bfab59a224 Jing Zhang 2021-06-18  121  	copylen = header->desc_offset + size_desc - pos;
cb082bfab59a224 Jing Zhang 2021-06-18  122  	copylen = min(copylen, remain);
cb082bfab59a224 Jing Zhang 2021-06-18  123  	if (copylen > 0) {
cb082bfab59a224 Jing Zhang 2021-06-18  124  		src = (void *)desc + pos - header->desc_offset;
cb082bfab59a224 Jing Zhang 2021-06-18  125  		if (copy_to_user(dest, src, copylen))
cb082bfab59a224 Jing Zhang 2021-06-18  126  			return -EFAULT;
cb082bfab59a224 Jing Zhang 2021-06-18  127  		remain -= copylen;
cb082bfab59a224 Jing Zhang 2021-06-18  128  		pos += copylen;
cb082bfab59a224 Jing Zhang 2021-06-18  129  		dest += copylen;
cb082bfab59a224 Jing Zhang 2021-06-18  130  	}
cb082bfab59a224 Jing Zhang 2021-06-18  131  
cb082bfab59a224 Jing Zhang 2021-06-18  132  	/* Copy kvm stats values */
cb082bfab59a224 Jing Zhang 2021-06-18  133  	copylen = header->data_offset + size_stats - pos;
cb082bfab59a224 Jing Zhang 2021-06-18  134  	copylen = min(copylen, remain);
cb082bfab59a224 Jing Zhang 2021-06-18  135  	if (copylen > 0) {
cb082bfab59a224 Jing Zhang 2021-06-18  136  		src = stats + pos - header->data_offset;
cb082bfab59a224 Jing Zhang 2021-06-18  137  		if (copy_to_user(dest, src, copylen))
cb082bfab59a224 Jing Zhang 2021-06-18  138  			return -EFAULT;
cb082bfab59a224 Jing Zhang 2021-06-18 @139  		remain -= copylen;
cb082bfab59a224 Jing Zhang 2021-06-18  140  		pos += copylen;
cb082bfab59a224 Jing Zhang 2021-06-18 @141  		dest += copylen;

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 28124 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

* arch/x86/kvm/../../../virt/kvm/binary_stats.c:139:3: warning: Value stored to 'remain' is never read [clang-analyzer-deadcode.DeadStores]
  2021-08-09 19:59 arch/x86/kvm/../../../virt/kvm/binary_stats.c:139:3: warning: Value stored to 'remain' is never read [clang-analyzer-deadcode.DeadStores] kernel test robot
@ 2021-08-10  8:28   ` kernel test robot
  0 siblings, 0 replies; 4+ messages in thread
From: kernel test robot @ 2021-08-10  8:28 UTC (permalink / raw)
  To: Jing Zhang
  Cc: clang-built-linux, kbuild-all, LKML, Paolo Bonzini,
	David Matlack, Ricardo Koller, Krish Sadhukhan, Fuad Tabba

[-- Attachment #1: Type: text/plain, Size: 26511 bytes --]


tree: 
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head:   36a21d51725af2ce0700c6ebcb6b9594aac658a6
commit: cb082bfab59a224a49ae803fed52cd03e8d6b5e0 KVM: stats: Add 
fd-based API to read binary stats data
date:   7 weeks ago
:::::: branch date: 23 hours ago
:::::: commit date: 7 weeks ago
config: x86_64-randconfig-c001-20210806 (attached as .config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project 
42b9c2a17a0b63cccf3ac197a82f91b28e53e643)
reproduce (this is a W=1 build):
         wget 
https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross 
-O ~/bin/make.cross
         chmod +x ~/bin/make.cross
         # install x86_64 cross compiling tool for clang build
         # apt-get install binutils-x86-64-linux-gnu
         # 
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=cb082bfab59a224a49ae803fed52cd03e8d6b5e0
         git remote add linus 
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
         git fetch --no-tags linus master
         git checkout cb082bfab59a224a49ae803fed52cd03e8d6b5e0
         # save the attached .config to linux build tree
         COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross 
ARCH=x86_64 clang-analyzer
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>


clang-analyzer warnings: (new ones prefixed by >>)
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:206:21: note: Value 
stored to 'client' during its initialization is never read
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:207:34: warning: Value 
stored to 'c' during its initialization is never read 
[clang-analyzer-deadcode.DeadStores]
            struct dtv_frontend_properties *c = &fe->dtv_property_cache;
                                            ^   ~~~~~~~~~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:207:34: note: Value 
stored to 'c' during its initialization is never read
            struct dtv_frontend_properties *c = &fe->dtv_property_cache;
                                            ^   ~~~~~~~~~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:220:21: warning: Value 
stored to 'client' during its initialization is never read 
[clang-analyzer-deadcode.DeadStores]
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:220:21: note: Value 
stored to 'client' during its initialization is never read
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:236:21: warning: Value 
stored to 'client' during its initialization is never read 
[clang-analyzer-deadcode.DeadStores]
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:236:21: note: Value 
stored to 'client' during its initialization is never read
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:252:21: warning: Value 
stored to 'client' during its initialization is never read 
[clang-analyzer-deadcode.DeadStores]
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:252:21: note: Value 
stored to 'client' during its initialization is never read
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:253:34: warning: Value 
stored to 'c' during its initialization is never read 
[clang-analyzer-deadcode.DeadStores]
            struct dtv_frontend_properties *c = &fe->dtv_property_cache;
                                            ^   ~~~~~~~~~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:253:34: note: Value 
stored to 'c' during its initialization is never read
            struct dtv_frontend_properties *c = &fe->dtv_property_cache;
                                            ^   ~~~~~~~~~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:270:21: warning: Value 
stored to 'client' during its initialization is never read 
[clang-analyzer-deadcode.DeadStores]
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:270:21: note: Value 
stored to 'client' during its initialization is never read
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:297:21: warning: Value 
stored to 'client' during its initialization is never read 
[clang-analyzer-deadcode.DeadStores]
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:297:21: note: Value 
stored to 'client' during its initialization is never read
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:323:21: warning: Value 
stored to 'client' during its initialization is never read 
[clang-analyzer-deadcode.DeadStores]
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:323:21: note: Value 
stored to 'client' during its initialization is never read
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:413:21: warning: Value 
stored to 'client' during its initialization is never read 
[clang-analyzer-deadcode.DeadStores]
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:413:21: note: Value 
stored to 'client' during its initialization is never read
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:425:21: warning: Value 
stored to 'client' during its initialization is never read 
[clang-analyzer-deadcode.DeadStores]
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:425:21: note: Value 
stored to 'client' during its initialization is never read
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:439:21: warning: Value 
stored to 'client' during its initialization is never read 
[clang-analyzer-deadcode.DeadStores]
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:439:21: note: Value 
stored to 'client' during its initialization is never read
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:455:21: warning: Value 
stored to 'client' during its initialization is never read 
[clang-analyzer-deadcode.DeadStores]
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:455:21: note: Value 
stored to 'client' during its initialization is never read
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    Suppressed 2 warnings (2 in non-user code).
    Use -header-filter=.* to display errors from all non-system headers. 
Use -system-headers to display errors from system headers as well.
    5 warnings generated.
    Suppressed 5 warnings (5 in non-user code).
    Use -header-filter=.* to display errors from all non-system headers. 
Use -system-headers to display errors from system headers as well.
    6 warnings generated.
    arch/x86/kvm/../../../virt/kvm/eventfd.c:385:2: warning: Value 
stored to 'ret' is never read [clang-analyzer-deadcode.DeadStores]
            ret = 0;
            ^     ~
    arch/x86/kvm/../../../virt/kvm/eventfd.c:385:2: note: Value stored 
to 'ret' is never read
            ret = 0;
            ^     ~
    Suppressed 5 warnings (5 in non-user code).
    Use -header-filter=.* to display errors from all non-system headers. 
Use -system-headers to display errors from system headers as well.
    5 warnings generated.
    Suppressed 5 warnings (5 in non-user code).
    Use -header-filter=.* to display errors from all non-system headers. 
Use -system-headers to display errors from system headers as well.
    5 warnings generated.
    Suppressed 5 warnings (5 in non-user code).
    Use -header-filter=.* to display errors from all non-system headers. 
Use -system-headers to display errors from system headers as well.
    6 warnings generated.
    Suppressed 6 warnings (5 in non-user code, 1 with check filters).
    Use -header-filter=.* to display errors from all non-system headers. 
Use -system-headers to display errors from system headers as well.
    7 warnings generated.
>> arch/x86/kvm/../../../virt/kvm/binary_stats.c:139:3: warning: Value stored to 'remain' is never read [clang-analyzer-deadcode.DeadStores]
                    remain -= copylen;
                    ^         ~~~~~~~
    arch/x86/kvm/../../../virt/kvm/binary_stats.c:139:3: note: Value 
stored to 'remain' is never read
                    remain -= copylen;
                    ^         ~~~~~~~
>> arch/x86/kvm/../../../virt/kvm/binary_stats.c:141:3: warning: Value stored to 'dest' is never read [clang-analyzer-deadcode.DeadStores]
                    dest += copylen;
                    ^       ~~~~~~~
    arch/x86/kvm/../../../virt/kvm/binary_stats.c:141:3: note: Value 
stored to 'dest' is never read
                    dest += copylen;
                    ^       ~~~~~~~
    Suppressed 5 warnings (5 in non-user code).
    Use -header-filter=.* to display errors from all non-system headers. 
Use -system-headers to display errors from system headers as well.
    5 warnings generated.
    Suppressed 5 warnings (5 in non-user code).
    Use -header-filter=.* to display errors from all non-system headers. 
Use -system-headers to display errors from system headers as well.
    7 warnings generated.
    Suppressed 7 warnings (7 in non-user code).
    Use -header-filter=.* to display errors from all non-system headers. 
Use -system-headers to display errors from system headers as well.
    7 warnings generated.
    arch/x86/kvm/emulate.c:1521:9: warning: 2nd function call argument 
is an uninitialized value [clang-analyzer-core.CallAndMessage]
            return linear_read_system(ctxt, *desc_addr_p, desc, 
sizeof(*desc));
                   ^
    arch/x86/kvm/emulate.c:3671:6: note: Assuming field 'modrm_reg' is 
not equal to VCPU_SREG_CS
            if (ctxt->modrm_reg == VCPU_SREG_CS || ctxt->modrm_reg > 
VCPU_SREG_GS)
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    arch/x86/kvm/emulate.c:3671:6: note: Left side of '||' is false
    arch/x86/kvm/emulate.c:3671:41: note: Assuming field 'modrm_reg' is 
<= VCPU_SREG_GS
            if (ctxt->modrm_reg == VCPU_SREG_CS || ctxt->modrm_reg > 
VCPU_SREG_GS)
 
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    arch/x86/kvm/emulate.c:3671:2: note: Taking false branch
            if (ctxt->modrm_reg == VCPU_SREG_CS || ctxt->modrm_reg > 
VCPU_SREG_GS)
            ^
    arch/x86/kvm/emulate.c:3674:6: note: Assuming field 'modrm_reg' is 
not equal to VCPU_SREG_SS
            if (ctxt->modrm_reg == VCPU_SREG_SS)
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    arch/x86/kvm/emulate.c:3674:2: note: Taking false branch
            if (ctxt->modrm_reg == VCPU_SREG_SS)
            ^
    arch/x86/kvm/emulate.c:3679:9: note: Calling 'load_segment_descriptor'
            return load_segment_descriptor(ctxt, sel, ctxt->modrm_reg);
                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    arch/x86/kvm/emulate.c:1727:6: note: 'seg' is not equal to VCPU_SREG_SS
            if (seg == VCPU_SREG_SS && selector == 3 &&
                ^~~
    arch/x86/kvm/emulate.c:1727:26: note: Left side of '&&' is false
            if (seg == VCPU_SREG_SS && selector == 3 &&
                                    ^
    arch/x86/kvm/emulate.c:1731:9: note: Calling '__load_segment_descriptor'
            return __load_segment_descriptor(ctxt, selector, seg, cpl,
                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    arch/x86/kvm/emulate.c:1547:23: note: Assuming the condition is false
            bool null_selector = !(selector & ~0x3); /* 0000-0003 are 
null */
                                 ^~~~~~~~~~~~~~~~~~
    arch/x86/kvm/emulate.c:1548:2: note: 'desc_addr' declared without an 
initial value
            ulong desc_addr;
            ^~~~~~~~~~~~~~~
    arch/x86/kvm/emulate.c:1555:6: note: Assuming field 'mode' is not 
equal to X86EMUL_MODE_REAL
            if (ctxt->mode == X86EMUL_MODE_REAL) {
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    arch/x86/kvm/emulate.c:1555:2: note: Taking false branch
            if (ctxt->mode == X86EMUL_MODE_REAL) {
            ^
    arch/x86/kvm/emulate.c:1561:13: note: 'seg' is <= VCPU_SREG_GS
            } else if (seg <= VCPU_SREG_GS && ctxt->mode == 
X86EMUL_MODE_VM86) {
                       ^~~
    arch/x86/kvm/emulate.c:1561:13: note: Left side of '&&' is true
    arch/x86/kvm/emulate.c:1561:36: note: Assuming field 'mode' is not 
equal to X86EMUL_MODE_VM86
            } else if (seg <= VCPU_SREG_GS && ctxt->mode == 
X86EMUL_MODE_VM86) {
 
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    arch/x86/kvm/emulate.c:1561:9: note: Taking false branch
            } else if (seg <= VCPU_SREG_GS && ctxt->mode == 
X86EMUL_MODE_VM86) {
                   ^
    arch/x86/kvm/emulate.c:1575:6: note: 'seg' is not equal to VCPU_SREG_TR
            if (seg == VCPU_SREG_TR && (selector & (1 << 2)))
                ^~~
    arch/x86/kvm/emulate.c:1575:26: note: Left side of '&&' is false
            if (seg == VCPU_SREG_TR && (selector & (1 << 2)))
                                    ^
    arch/x86/kvm/emulate.c:1579:6: note: 'null_selector' is false
            if (null_selector) {
                ^~~~~~~~~~~~~
    arch/x86/kvm/emulate.c:1579:2: note: Taking false branch
            if (null_selector) {
            ^
    arch/x86/kvm/emulate.c:1603:8: note: Calling 'read_segment_descriptor'
            ret = read_segment_descriptor(ctxt, selector, &seg_desc, 
&desc_addr);
 
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    arch/x86/kvm/emulate.c:1517:7: note: Calling 'get_descriptor_ptr'
            rc = get_descriptor_ptr(ctxt, selector, desc_addr_p);
                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    arch/x86/kvm/emulate.c:1491:6: note: Assuming the condition is true
            if (dt.size < index * 8 + 7)
                ^~~~~~~~~~~~~~~~~~~~~~~
    arch/x86/kvm/emulate.c:1491:2: note: Taking true branch
            if (dt.size < index * 8 + 7)
            ^
    arch/x86/kvm/emulate.c:1517:7: note: Returning from 'get_descriptor_ptr'
            rc = get_descriptor_ptr(ctxt, selector, desc_addr_p);
                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    arch/x86/kvm/emulate.c:1518:6: note: Assuming 'rc' is equal to 
X86EMUL_CONTINUE
            if (rc != X86EMUL_CONTINUE)
                ^~~~~~~~~~~~~~~~~~~~~~
    arch/x86/kvm/emulate.c:1518:2: note: Taking false branch
            if (rc != X86EMUL_CONTINUE)
            ^

vim +/remain +139 arch/x86/kvm/../../../virt/kvm/binary_stats.c

cb082bfab59a224 Jing Zhang 2021-06-18   12  cb082bfab59a224 Jing Zhang 
2021-06-18   13  /**
cb082bfab59a224 Jing Zhang 2021-06-18   14   * kvm_stats_read() - Common 
function to read from the binary statistics
cb082bfab59a224 Jing Zhang 2021-06-18   15   * file descriptor.
cb082bfab59a224 Jing Zhang 2021-06-18   16   *
cb082bfab59a224 Jing Zhang 2021-06-18   17   * @id: identification 
string of the stats
cb082bfab59a224 Jing Zhang 2021-06-18   18   * @header: stats header for 
a vm or a vcpu
cb082bfab59a224 Jing Zhang 2021-06-18   19   * @desc: start address of 
an array of stats descriptors for a vm or a vcpu
cb082bfab59a224 Jing Zhang 2021-06-18   20   * @stats: start address of 
stats data block for a vm or a vcpu
cb082bfab59a224 Jing Zhang 2021-06-18   21   * @size_stats: the size of 
stats data block pointed by @stats
cb082bfab59a224 Jing Zhang 2021-06-18   22   * @user_buffer: start 
address of userspace buffer
cb082bfab59a224 Jing Zhang 2021-06-18   23   * @size: requested read 
size from userspace
cb082bfab59a224 Jing Zhang 2021-06-18   24   * @offset: the start 
position from which the content will be read for the
cb082bfab59a224 Jing Zhang 2021-06-18   25   *          corresponding vm 
or vcp file descriptor
cb082bfab59a224 Jing Zhang 2021-06-18   26   *
cb082bfab59a224 Jing Zhang 2021-06-18   27   * The file content of a 
vm/vcpu file descriptor is now defined as below:
cb082bfab59a224 Jing Zhang 2021-06-18   28   * +-------------+
cb082bfab59a224 Jing Zhang 2021-06-18   29   * |   Header    |
cb082bfab59a224 Jing Zhang 2021-06-18   30   * +-------------+
cb082bfab59a224 Jing Zhang 2021-06-18   31   * |  id string  |
cb082bfab59a224 Jing Zhang 2021-06-18   32   * +-------------+
cb082bfab59a224 Jing Zhang 2021-06-18   33   * | Descriptors |
cb082bfab59a224 Jing Zhang 2021-06-18   34   * +-------------+
cb082bfab59a224 Jing Zhang 2021-06-18   35   * | Stats Data  |
cb082bfab59a224 Jing Zhang 2021-06-18   36   * +-------------+
cb082bfab59a224 Jing Zhang 2021-06-18   37   * Although this function 
allows userspace to read any amount of data (as long
cb082bfab59a224 Jing Zhang 2021-06-18   38   * as in the limit) from any 
position, the typical usage would follow below
cb082bfab59a224 Jing Zhang 2021-06-18   39   * steps:
cb082bfab59a224 Jing Zhang 2021-06-18   40   * 1. Read header from 
offset 0. Get the offset of descriptors and stats data
cb082bfab59a224 Jing Zhang 2021-06-18   41   *    and some other 
necessary information. This is a one-time work for the
cb082bfab59a224 Jing Zhang 2021-06-18   42   *    lifecycle of the 
corresponding vm/vcpu stats fd.
cb082bfab59a224 Jing Zhang 2021-06-18   43   * 2. Read id string from 
its offset. This is a one-time work for the lifecycle
cb082bfab59a224 Jing Zhang 2021-06-18   44   *    of the corresponding 
vm/vcpu stats fd.
cb082bfab59a224 Jing Zhang 2021-06-18   45   * 3. Read descriptors from 
its offset and discover all the stats by parsing
cb082bfab59a224 Jing Zhang 2021-06-18   46   *    descriptors. This is a 
one-time work for the lifecycle of the
cb082bfab59a224 Jing Zhang 2021-06-18   47   *    corresponding vm/vcpu 
stats fd.
cb082bfab59a224 Jing Zhang 2021-06-18   48   * 4. Periodically read 
stats data from its offset using pread.
cb082bfab59a224 Jing Zhang 2021-06-18   49   *
cb082bfab59a224 Jing Zhang 2021-06-18   50   * Return: the number of 
bytes that has been successfully read
cb082bfab59a224 Jing Zhang 2021-06-18   51   */
cb082bfab59a224 Jing Zhang 2021-06-18   52  ssize_t kvm_stats_read(char 
*id, const struct kvm_stats_header *header,
cb082bfab59a224 Jing Zhang 2021-06-18   53  		       const struct 
_kvm_stats_desc *desc,
cb082bfab59a224 Jing Zhang 2021-06-18   54  		       void *stats, size_t 
size_stats,
cb082bfab59a224 Jing Zhang 2021-06-18   55  		       char __user 
*user_buffer, size_t size, loff_t *offset)
cb082bfab59a224 Jing Zhang 2021-06-18   56  {
cb082bfab59a224 Jing Zhang 2021-06-18   57  	ssize_t len;
cb082bfab59a224 Jing Zhang 2021-06-18   58  	ssize_t copylen;
cb082bfab59a224 Jing Zhang 2021-06-18   59  	ssize_t remain = size;
cb082bfab59a224 Jing Zhang 2021-06-18   60  	size_t size_desc;
cb082bfab59a224 Jing Zhang 2021-06-18   61  	size_t size_header;
cb082bfab59a224 Jing Zhang 2021-06-18   62  	void *src;
cb082bfab59a224 Jing Zhang 2021-06-18   63  	loff_t pos = *offset;
cb082bfab59a224 Jing Zhang 2021-06-18   64  	char __user *dest = 
user_buffer;
cb082bfab59a224 Jing Zhang 2021-06-18   65  cb082bfab59a224 Jing Zhang 
2021-06-18   66  	size_header = sizeof(*header);
cb082bfab59a224 Jing Zhang 2021-06-18   67  	size_desc = 
header->num_desc * sizeof(*desc);
cb082bfab59a224 Jing Zhang 2021-06-18   68  cb082bfab59a224 Jing Zhang 
2021-06-18   69  	len = KVM_STATS_NAME_SIZE + size_header + size_desc + 
size_stats - pos;
cb082bfab59a224 Jing Zhang 2021-06-18   70  	len = min(len, remain);
cb082bfab59a224 Jing Zhang 2021-06-18   71  	if (len <= 0)
cb082bfab59a224 Jing Zhang 2021-06-18   72  		return 0;
cb082bfab59a224 Jing Zhang 2021-06-18   73  	remain = len;
cb082bfab59a224 Jing Zhang 2021-06-18   74  cb082bfab59a224 Jing Zhang 
2021-06-18   75  	/*
cb082bfab59a224 Jing Zhang 2021-06-18   76  	 * Copy kvm stats header.
cb082bfab59a224 Jing Zhang 2021-06-18   77  	 * The header is the first 
block of content userspace usually read out.
cb082bfab59a224 Jing Zhang 2021-06-18   78  	 * The pos is 0 and the 
copylen and remain would be the size of header.
cb082bfab59a224 Jing Zhang 2021-06-18   79  	 * The copy of the header 
would be skipped if offset is larger than the
cb082bfab59a224 Jing Zhang 2021-06-18   80  	 * size of header. That 
usually happens when userspace reads stats
cb082bfab59a224 Jing Zhang 2021-06-18   81  	 * descriptors and stats data.
cb082bfab59a224 Jing Zhang 2021-06-18   82  	 */
cb082bfab59a224 Jing Zhang 2021-06-18   83  	copylen = size_header - pos;
cb082bfab59a224 Jing Zhang 2021-06-18   84  	copylen = min(copylen, remain);
cb082bfab59a224 Jing Zhang 2021-06-18   85  	if (copylen > 0) {
cb082bfab59a224 Jing Zhang 2021-06-18   86  		src = (void *)header + pos;
cb082bfab59a224 Jing Zhang 2021-06-18   87  		if (copy_to_user(dest, 
src, copylen))
cb082bfab59a224 Jing Zhang 2021-06-18   88  			return -EFAULT;
cb082bfab59a224 Jing Zhang 2021-06-18   89  		remain -= copylen;
cb082bfab59a224 Jing Zhang 2021-06-18   90  		pos += copylen;
cb082bfab59a224 Jing Zhang 2021-06-18   91  		dest += copylen;
cb082bfab59a224 Jing Zhang 2021-06-18   92  	}
cb082bfab59a224 Jing Zhang 2021-06-18   93  cb082bfab59a224 Jing Zhang 
2021-06-18   94  	/*
cb082bfab59a224 Jing Zhang 2021-06-18   95  	 * Copy kvm stats header id 
string.
cb082bfab59a224 Jing Zhang 2021-06-18   96  	 * The id string is unique 
for every vm/vcpu, which is stored in kvm
cb082bfab59a224 Jing Zhang 2021-06-18   97  	 * and kvm_vcpu structure.
cb082bfab59a224 Jing Zhang 2021-06-18   98  	 * The id string is part of 
the stat header from the perspective of
cb082bfab59a224 Jing Zhang 2021-06-18   99  	 * userspace, it is usually 
read out together with previous constant
cb082bfab59a224 Jing Zhang 2021-06-18  100  	 * header part and could be 
skipped for later descriptors and stats
cb082bfab59a224 Jing Zhang 2021-06-18  101  	 * data readings.
cb082bfab59a224 Jing Zhang 2021-06-18  102  	 */
cb082bfab59a224 Jing Zhang 2021-06-18  103  	copylen = header->id_offset 
+ KVM_STATS_NAME_SIZE - pos;
cb082bfab59a224 Jing Zhang 2021-06-18  104  	copylen = min(copylen, remain);
cb082bfab59a224 Jing Zhang 2021-06-18  105  	if (copylen > 0) {
cb082bfab59a224 Jing Zhang 2021-06-18  106  		src = id + pos - 
header->id_offset;
cb082bfab59a224 Jing Zhang 2021-06-18  107  		if (copy_to_user(dest, 
src, copylen))
cb082bfab59a224 Jing Zhang 2021-06-18  108  			return -EFAULT;
cb082bfab59a224 Jing Zhang 2021-06-18  109  		remain -= copylen;
cb082bfab59a224 Jing Zhang 2021-06-18  110  		pos += copylen;
cb082bfab59a224 Jing Zhang 2021-06-18  111  		dest += copylen;
cb082bfab59a224 Jing Zhang 2021-06-18  112  	}
cb082bfab59a224 Jing Zhang 2021-06-18  113  cb082bfab59a224 Jing Zhang 
2021-06-18  114  	/*
cb082bfab59a224 Jing Zhang 2021-06-18  115  	 * Copy kvm stats descriptors.
cb082bfab59a224 Jing Zhang 2021-06-18  116  	 * The descriptors copy 
would be skipped in the typical case that
cb082bfab59a224 Jing Zhang 2021-06-18  117  	 * userspace periodically 
read stats data, since the pos would be
cb082bfab59a224 Jing Zhang 2021-06-18  118  	 * greater than the end 
address of descriptors
cb082bfab59a224 Jing Zhang 2021-06-18  119  	 * 
(header->header.desc_offset + size_desc) causing copylen <= 0.
cb082bfab59a224 Jing Zhang 2021-06-18  120  	 */
cb082bfab59a224 Jing Zhang 2021-06-18  121  	copylen = 
header->desc_offset + size_desc - pos;
cb082bfab59a224 Jing Zhang 2021-06-18  122  	copylen = min(copylen, remain);
cb082bfab59a224 Jing Zhang 2021-06-18  123  	if (copylen > 0) {
cb082bfab59a224 Jing Zhang 2021-06-18  124  		src = (void *)desc + pos - 
header->desc_offset;
cb082bfab59a224 Jing Zhang 2021-06-18  125  		if (copy_to_user(dest, 
src, copylen))
cb082bfab59a224 Jing Zhang 2021-06-18  126  			return -EFAULT;
cb082bfab59a224 Jing Zhang 2021-06-18  127  		remain -= copylen;
cb082bfab59a224 Jing Zhang 2021-06-18  128  		pos += copylen;
cb082bfab59a224 Jing Zhang 2021-06-18  129  		dest += copylen;
cb082bfab59a224 Jing Zhang 2021-06-18  130  	}
cb082bfab59a224 Jing Zhang 2021-06-18  131  cb082bfab59a224 Jing Zhang 
2021-06-18  132  	/* Copy kvm stats values */
cb082bfab59a224 Jing Zhang 2021-06-18  133  	copylen = 
header->data_offset + size_stats - pos;
cb082bfab59a224 Jing Zhang 2021-06-18  134  	copylen = min(copylen, remain);
cb082bfab59a224 Jing Zhang 2021-06-18  135  	if (copylen > 0) {
cb082bfab59a224 Jing Zhang 2021-06-18  136  		src = stats + pos - 
header->data_offset;
cb082bfab59a224 Jing Zhang 2021-06-18  137  		if (copy_to_user(dest, 
src, copylen))
cb082bfab59a224 Jing Zhang 2021-06-18  138  			return -EFAULT;
cb082bfab59a224 Jing Zhang 2021-06-18 @139  		remain -= copylen;
cb082bfab59a224 Jing Zhang 2021-06-18  140  		pos += copylen;
cb082bfab59a224 Jing Zhang 2021-06-18 @141  		dest += copylen;

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org


[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 28124 bytes --]

[-- Attachment #3: Attached Message Part --]
[-- Type: text/plain, Size: 150 bytes --]

_______________________________________________
kbuild mailing list -- kbuild@lists.01.org
To unsubscribe send an email to kbuild-leave@lists.01.org


^ permalink raw reply	[flat|nested] 4+ messages in thread

* arch/x86/kvm/../../../virt/kvm/binary_stats.c:139:3: warning: Value stored to 'remain' is never read [clang-analyzer-deadcode.DeadStores]
@ 2021-08-10  8:28   ` kernel test robot
  0 siblings, 0 replies; 4+ messages in thread
From: kernel test robot @ 2021-08-10  8:28 UTC (permalink / raw)
  To: kbuild-all

[-- Attachment #1: Type: text/plain, Size: 27014 bytes --]


tree: 
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head:   36a21d51725af2ce0700c6ebcb6b9594aac658a6
commit: cb082bfab59a224a49ae803fed52cd03e8d6b5e0 KVM: stats: Add 
fd-based API to read binary stats data
date:   7 weeks ago
:::::: branch date: 23 hours ago
:::::: commit date: 7 weeks ago
config: x86_64-randconfig-c001-20210806 (attached as .config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project 
42b9c2a17a0b63cccf3ac197a82f91b28e53e643)
reproduce (this is a W=1 build):
         wget 
https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross 
-O ~/bin/make.cross
         chmod +x ~/bin/make.cross
         # install x86_64 cross compiling tool for clang build
         # apt-get install binutils-x86-64-linux-gnu
         # 
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=cb082bfab59a224a49ae803fed52cd03e8d6b5e0
         git remote add linus 
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
         git fetch --no-tags linus master
         git checkout cb082bfab59a224a49ae803fed52cd03e8d6b5e0
         # save the attached .config to linux build tree
         COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross 
ARCH=x86_64 clang-analyzer
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>


clang-analyzer warnings: (new ones prefixed by >>)
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:206:21: note: Value 
stored to 'client' during its initialization is never read
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:207:34: warning: Value 
stored to 'c' during its initialization is never read 
[clang-analyzer-deadcode.DeadStores]
            struct dtv_frontend_properties *c = &fe->dtv_property_cache;
                                            ^   ~~~~~~~~~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:207:34: note: Value 
stored to 'c' during its initialization is never read
            struct dtv_frontend_properties *c = &fe->dtv_property_cache;
                                            ^   ~~~~~~~~~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:220:21: warning: Value 
stored to 'client' during its initialization is never read 
[clang-analyzer-deadcode.DeadStores]
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:220:21: note: Value 
stored to 'client' during its initialization is never read
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:236:21: warning: Value 
stored to 'client' during its initialization is never read 
[clang-analyzer-deadcode.DeadStores]
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:236:21: note: Value 
stored to 'client' during its initialization is never read
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:252:21: warning: Value 
stored to 'client' during its initialization is never read 
[clang-analyzer-deadcode.DeadStores]
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:252:21: note: Value 
stored to 'client' during its initialization is never read
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:253:34: warning: Value 
stored to 'c' during its initialization is never read 
[clang-analyzer-deadcode.DeadStores]
            struct dtv_frontend_properties *c = &fe->dtv_property_cache;
                                            ^   ~~~~~~~~~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:253:34: note: Value 
stored to 'c' during its initialization is never read
            struct dtv_frontend_properties *c = &fe->dtv_property_cache;
                                            ^   ~~~~~~~~~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:270:21: warning: Value 
stored to 'client' during its initialization is never read 
[clang-analyzer-deadcode.DeadStores]
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:270:21: note: Value 
stored to 'client' during its initialization is never read
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:297:21: warning: Value 
stored to 'client' during its initialization is never read 
[clang-analyzer-deadcode.DeadStores]
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:297:21: note: Value 
stored to 'client' during its initialization is never read
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:323:21: warning: Value 
stored to 'client' during its initialization is never read 
[clang-analyzer-deadcode.DeadStores]
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:323:21: note: Value 
stored to 'client' during its initialization is never read
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:413:21: warning: Value 
stored to 'client' during its initialization is never read 
[clang-analyzer-deadcode.DeadStores]
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:413:21: note: Value 
stored to 'client' during its initialization is never read
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:425:21: warning: Value 
stored to 'client' during its initialization is never read 
[clang-analyzer-deadcode.DeadStores]
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:425:21: note: Value 
stored to 'client' during its initialization is never read
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:439:21: warning: Value 
stored to 'client' during its initialization is never read 
[clang-analyzer-deadcode.DeadStores]
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:439:21: note: Value 
stored to 'client' during its initialization is never read
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:455:21: warning: Value 
stored to 'client' during its initialization is never read 
[clang-analyzer-deadcode.DeadStores]
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    drivers/media/dvb-frontends/cxd2820r_core.c:455:21: note: Value 
stored to 'client' during its initialization is never read
            struct i2c_client *client = priv->client[0];
                               ^~~~~~   ~~~~~~~~~~~~~~~
    Suppressed 2 warnings (2 in non-user code).
    Use -header-filter=.* to display errors from all non-system headers. 
Use -system-headers to display errors from system headers as well.
    5 warnings generated.
    Suppressed 5 warnings (5 in non-user code).
    Use -header-filter=.* to display errors from all non-system headers. 
Use -system-headers to display errors from system headers as well.
    6 warnings generated.
    arch/x86/kvm/../../../virt/kvm/eventfd.c:385:2: warning: Value 
stored to 'ret' is never read [clang-analyzer-deadcode.DeadStores]
            ret = 0;
            ^     ~
    arch/x86/kvm/../../../virt/kvm/eventfd.c:385:2: note: Value stored 
to 'ret' is never read
            ret = 0;
            ^     ~
    Suppressed 5 warnings (5 in non-user code).
    Use -header-filter=.* to display errors from all non-system headers. 
Use -system-headers to display errors from system headers as well.
    5 warnings generated.
    Suppressed 5 warnings (5 in non-user code).
    Use -header-filter=.* to display errors from all non-system headers. 
Use -system-headers to display errors from system headers as well.
    5 warnings generated.
    Suppressed 5 warnings (5 in non-user code).
    Use -header-filter=.* to display errors from all non-system headers. 
Use -system-headers to display errors from system headers as well.
    6 warnings generated.
    Suppressed 6 warnings (5 in non-user code, 1 with check filters).
    Use -header-filter=.* to display errors from all non-system headers. 
Use -system-headers to display errors from system headers as well.
    7 warnings generated.
>> arch/x86/kvm/../../../virt/kvm/binary_stats.c:139:3: warning: Value stored to 'remain' is never read [clang-analyzer-deadcode.DeadStores]
                    remain -= copylen;
                    ^         ~~~~~~~
    arch/x86/kvm/../../../virt/kvm/binary_stats.c:139:3: note: Value 
stored to 'remain' is never read
                    remain -= copylen;
                    ^         ~~~~~~~
>> arch/x86/kvm/../../../virt/kvm/binary_stats.c:141:3: warning: Value stored to 'dest' is never read [clang-analyzer-deadcode.DeadStores]
                    dest += copylen;
                    ^       ~~~~~~~
    arch/x86/kvm/../../../virt/kvm/binary_stats.c:141:3: note: Value 
stored to 'dest' is never read
                    dest += copylen;
                    ^       ~~~~~~~
    Suppressed 5 warnings (5 in non-user code).
    Use -header-filter=.* to display errors from all non-system headers. 
Use -system-headers to display errors from system headers as well.
    5 warnings generated.
    Suppressed 5 warnings (5 in non-user code).
    Use -header-filter=.* to display errors from all non-system headers. 
Use -system-headers to display errors from system headers as well.
    7 warnings generated.
    Suppressed 7 warnings (7 in non-user code).
    Use -header-filter=.* to display errors from all non-system headers. 
Use -system-headers to display errors from system headers as well.
    7 warnings generated.
    arch/x86/kvm/emulate.c:1521:9: warning: 2nd function call argument 
is an uninitialized value [clang-analyzer-core.CallAndMessage]
            return linear_read_system(ctxt, *desc_addr_p, desc, 
sizeof(*desc));
                   ^
    arch/x86/kvm/emulate.c:3671:6: note: Assuming field 'modrm_reg' is 
not equal to VCPU_SREG_CS
            if (ctxt->modrm_reg == VCPU_SREG_CS || ctxt->modrm_reg > 
VCPU_SREG_GS)
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    arch/x86/kvm/emulate.c:3671:6: note: Left side of '||' is false
    arch/x86/kvm/emulate.c:3671:41: note: Assuming field 'modrm_reg' is 
<= VCPU_SREG_GS
            if (ctxt->modrm_reg == VCPU_SREG_CS || ctxt->modrm_reg > 
VCPU_SREG_GS)
 
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    arch/x86/kvm/emulate.c:3671:2: note: Taking false branch
            if (ctxt->modrm_reg == VCPU_SREG_CS || ctxt->modrm_reg > 
VCPU_SREG_GS)
            ^
    arch/x86/kvm/emulate.c:3674:6: note: Assuming field 'modrm_reg' is 
not equal to VCPU_SREG_SS
            if (ctxt->modrm_reg == VCPU_SREG_SS)
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    arch/x86/kvm/emulate.c:3674:2: note: Taking false branch
            if (ctxt->modrm_reg == VCPU_SREG_SS)
            ^
    arch/x86/kvm/emulate.c:3679:9: note: Calling 'load_segment_descriptor'
            return load_segment_descriptor(ctxt, sel, ctxt->modrm_reg);
                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    arch/x86/kvm/emulate.c:1727:6: note: 'seg' is not equal to VCPU_SREG_SS
            if (seg == VCPU_SREG_SS && selector == 3 &&
                ^~~
    arch/x86/kvm/emulate.c:1727:26: note: Left side of '&&' is false
            if (seg == VCPU_SREG_SS && selector == 3 &&
                                    ^
    arch/x86/kvm/emulate.c:1731:9: note: Calling '__load_segment_descriptor'
            return __load_segment_descriptor(ctxt, selector, seg, cpl,
                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    arch/x86/kvm/emulate.c:1547:23: note: Assuming the condition is false
            bool null_selector = !(selector & ~0x3); /* 0000-0003 are 
null */
                                 ^~~~~~~~~~~~~~~~~~
    arch/x86/kvm/emulate.c:1548:2: note: 'desc_addr' declared without an 
initial value
            ulong desc_addr;
            ^~~~~~~~~~~~~~~
    arch/x86/kvm/emulate.c:1555:6: note: Assuming field 'mode' is not 
equal to X86EMUL_MODE_REAL
            if (ctxt->mode == X86EMUL_MODE_REAL) {
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    arch/x86/kvm/emulate.c:1555:2: note: Taking false branch
            if (ctxt->mode == X86EMUL_MODE_REAL) {
            ^
    arch/x86/kvm/emulate.c:1561:13: note: 'seg' is <= VCPU_SREG_GS
            } else if (seg <= VCPU_SREG_GS && ctxt->mode == 
X86EMUL_MODE_VM86) {
                       ^~~
    arch/x86/kvm/emulate.c:1561:13: note: Left side of '&&' is true
    arch/x86/kvm/emulate.c:1561:36: note: Assuming field 'mode' is not 
equal to X86EMUL_MODE_VM86
            } else if (seg <= VCPU_SREG_GS && ctxt->mode == 
X86EMUL_MODE_VM86) {
 
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    arch/x86/kvm/emulate.c:1561:9: note: Taking false branch
            } else if (seg <= VCPU_SREG_GS && ctxt->mode == 
X86EMUL_MODE_VM86) {
                   ^
    arch/x86/kvm/emulate.c:1575:6: note: 'seg' is not equal to VCPU_SREG_TR
            if (seg == VCPU_SREG_TR && (selector & (1 << 2)))
                ^~~
    arch/x86/kvm/emulate.c:1575:26: note: Left side of '&&' is false
            if (seg == VCPU_SREG_TR && (selector & (1 << 2)))
                                    ^
    arch/x86/kvm/emulate.c:1579:6: note: 'null_selector' is false
            if (null_selector) {
                ^~~~~~~~~~~~~
    arch/x86/kvm/emulate.c:1579:2: note: Taking false branch
            if (null_selector) {
            ^
    arch/x86/kvm/emulate.c:1603:8: note: Calling 'read_segment_descriptor'
            ret = read_segment_descriptor(ctxt, selector, &seg_desc, 
&desc_addr);
 
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    arch/x86/kvm/emulate.c:1517:7: note: Calling 'get_descriptor_ptr'
            rc = get_descriptor_ptr(ctxt, selector, desc_addr_p);
                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    arch/x86/kvm/emulate.c:1491:6: note: Assuming the condition is true
            if (dt.size < index * 8 + 7)
                ^~~~~~~~~~~~~~~~~~~~~~~
    arch/x86/kvm/emulate.c:1491:2: note: Taking true branch
            if (dt.size < index * 8 + 7)
            ^
    arch/x86/kvm/emulate.c:1517:7: note: Returning from 'get_descriptor_ptr'
            rc = get_descriptor_ptr(ctxt, selector, desc_addr_p);
                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    arch/x86/kvm/emulate.c:1518:6: note: Assuming 'rc' is equal to 
X86EMUL_CONTINUE
            if (rc != X86EMUL_CONTINUE)
                ^~~~~~~~~~~~~~~~~~~~~~
    arch/x86/kvm/emulate.c:1518:2: note: Taking false branch
            if (rc != X86EMUL_CONTINUE)
            ^

vim +/remain +139 arch/x86/kvm/../../../virt/kvm/binary_stats.c

cb082bfab59a224 Jing Zhang 2021-06-18   12  cb082bfab59a224 Jing Zhang 
2021-06-18   13  /**
cb082bfab59a224 Jing Zhang 2021-06-18   14   * kvm_stats_read() - Common 
function to read from the binary statistics
cb082bfab59a224 Jing Zhang 2021-06-18   15   * file descriptor.
cb082bfab59a224 Jing Zhang 2021-06-18   16   *
cb082bfab59a224 Jing Zhang 2021-06-18   17   * @id: identification 
string of the stats
cb082bfab59a224 Jing Zhang 2021-06-18   18   * @header: stats header for 
a vm or a vcpu
cb082bfab59a224 Jing Zhang 2021-06-18   19   * @desc: start address of 
an array of stats descriptors for a vm or a vcpu
cb082bfab59a224 Jing Zhang 2021-06-18   20   * @stats: start address of 
stats data block for a vm or a vcpu
cb082bfab59a224 Jing Zhang 2021-06-18   21   * @size_stats: the size of 
stats data block pointed by @stats
cb082bfab59a224 Jing Zhang 2021-06-18   22   * @user_buffer: start 
address of userspace buffer
cb082bfab59a224 Jing Zhang 2021-06-18   23   * @size: requested read 
size from userspace
cb082bfab59a224 Jing Zhang 2021-06-18   24   * @offset: the start 
position from which the content will be read for the
cb082bfab59a224 Jing Zhang 2021-06-18   25   *          corresponding vm 
or vcp file descriptor
cb082bfab59a224 Jing Zhang 2021-06-18   26   *
cb082bfab59a224 Jing Zhang 2021-06-18   27   * The file content of a 
vm/vcpu file descriptor is now defined as below:
cb082bfab59a224 Jing Zhang 2021-06-18   28   * +-------------+
cb082bfab59a224 Jing Zhang 2021-06-18   29   * |   Header    |
cb082bfab59a224 Jing Zhang 2021-06-18   30   * +-------------+
cb082bfab59a224 Jing Zhang 2021-06-18   31   * |  id string  |
cb082bfab59a224 Jing Zhang 2021-06-18   32   * +-------------+
cb082bfab59a224 Jing Zhang 2021-06-18   33   * | Descriptors |
cb082bfab59a224 Jing Zhang 2021-06-18   34   * +-------------+
cb082bfab59a224 Jing Zhang 2021-06-18   35   * | Stats Data  |
cb082bfab59a224 Jing Zhang 2021-06-18   36   * +-------------+
cb082bfab59a224 Jing Zhang 2021-06-18   37   * Although this function 
allows userspace to read any amount of data (as long
cb082bfab59a224 Jing Zhang 2021-06-18   38   * as in the limit) from any 
position, the typical usage would follow below
cb082bfab59a224 Jing Zhang 2021-06-18   39   * steps:
cb082bfab59a224 Jing Zhang 2021-06-18   40   * 1. Read header from 
offset 0. Get the offset of descriptors and stats data
cb082bfab59a224 Jing Zhang 2021-06-18   41   *    and some other 
necessary information. This is a one-time work for the
cb082bfab59a224 Jing Zhang 2021-06-18   42   *    lifecycle of the 
corresponding vm/vcpu stats fd.
cb082bfab59a224 Jing Zhang 2021-06-18   43   * 2. Read id string from 
its offset. This is a one-time work for the lifecycle
cb082bfab59a224 Jing Zhang 2021-06-18   44   *    of the corresponding 
vm/vcpu stats fd.
cb082bfab59a224 Jing Zhang 2021-06-18   45   * 3. Read descriptors from 
its offset and discover all the stats by parsing
cb082bfab59a224 Jing Zhang 2021-06-18   46   *    descriptors. This is a 
one-time work for the lifecycle of the
cb082bfab59a224 Jing Zhang 2021-06-18   47   *    corresponding vm/vcpu 
stats fd.
cb082bfab59a224 Jing Zhang 2021-06-18   48   * 4. Periodically read 
stats data from its offset using pread.
cb082bfab59a224 Jing Zhang 2021-06-18   49   *
cb082bfab59a224 Jing Zhang 2021-06-18   50   * Return: the number of 
bytes that has been successfully read
cb082bfab59a224 Jing Zhang 2021-06-18   51   */
cb082bfab59a224 Jing Zhang 2021-06-18   52  ssize_t kvm_stats_read(char 
*id, const struct kvm_stats_header *header,
cb082bfab59a224 Jing Zhang 2021-06-18   53  		       const struct 
_kvm_stats_desc *desc,
cb082bfab59a224 Jing Zhang 2021-06-18   54  		       void *stats, size_t 
size_stats,
cb082bfab59a224 Jing Zhang 2021-06-18   55  		       char __user 
*user_buffer, size_t size, loff_t *offset)
cb082bfab59a224 Jing Zhang 2021-06-18   56  {
cb082bfab59a224 Jing Zhang 2021-06-18   57  	ssize_t len;
cb082bfab59a224 Jing Zhang 2021-06-18   58  	ssize_t copylen;
cb082bfab59a224 Jing Zhang 2021-06-18   59  	ssize_t remain = size;
cb082bfab59a224 Jing Zhang 2021-06-18   60  	size_t size_desc;
cb082bfab59a224 Jing Zhang 2021-06-18   61  	size_t size_header;
cb082bfab59a224 Jing Zhang 2021-06-18   62  	void *src;
cb082bfab59a224 Jing Zhang 2021-06-18   63  	loff_t pos = *offset;
cb082bfab59a224 Jing Zhang 2021-06-18   64  	char __user *dest = 
user_buffer;
cb082bfab59a224 Jing Zhang 2021-06-18   65  cb082bfab59a224 Jing Zhang 
2021-06-18   66  	size_header = sizeof(*header);
cb082bfab59a224 Jing Zhang 2021-06-18   67  	size_desc = 
header->num_desc * sizeof(*desc);
cb082bfab59a224 Jing Zhang 2021-06-18   68  cb082bfab59a224 Jing Zhang 
2021-06-18   69  	len = KVM_STATS_NAME_SIZE + size_header + size_desc + 
size_stats - pos;
cb082bfab59a224 Jing Zhang 2021-06-18   70  	len = min(len, remain);
cb082bfab59a224 Jing Zhang 2021-06-18   71  	if (len <= 0)
cb082bfab59a224 Jing Zhang 2021-06-18   72  		return 0;
cb082bfab59a224 Jing Zhang 2021-06-18   73  	remain = len;
cb082bfab59a224 Jing Zhang 2021-06-18   74  cb082bfab59a224 Jing Zhang 
2021-06-18   75  	/*
cb082bfab59a224 Jing Zhang 2021-06-18   76  	 * Copy kvm stats header.
cb082bfab59a224 Jing Zhang 2021-06-18   77  	 * The header is the first 
block of content userspace usually read out.
cb082bfab59a224 Jing Zhang 2021-06-18   78  	 * The pos is 0 and the 
copylen and remain would be the size of header.
cb082bfab59a224 Jing Zhang 2021-06-18   79  	 * The copy of the header 
would be skipped if offset is larger than the
cb082bfab59a224 Jing Zhang 2021-06-18   80  	 * size of header. That 
usually happens when userspace reads stats
cb082bfab59a224 Jing Zhang 2021-06-18   81  	 * descriptors and stats data.
cb082bfab59a224 Jing Zhang 2021-06-18   82  	 */
cb082bfab59a224 Jing Zhang 2021-06-18   83  	copylen = size_header - pos;
cb082bfab59a224 Jing Zhang 2021-06-18   84  	copylen = min(copylen, remain);
cb082bfab59a224 Jing Zhang 2021-06-18   85  	if (copylen > 0) {
cb082bfab59a224 Jing Zhang 2021-06-18   86  		src = (void *)header + pos;
cb082bfab59a224 Jing Zhang 2021-06-18   87  		if (copy_to_user(dest, 
src, copylen))
cb082bfab59a224 Jing Zhang 2021-06-18   88  			return -EFAULT;
cb082bfab59a224 Jing Zhang 2021-06-18   89  		remain -= copylen;
cb082bfab59a224 Jing Zhang 2021-06-18   90  		pos += copylen;
cb082bfab59a224 Jing Zhang 2021-06-18   91  		dest += copylen;
cb082bfab59a224 Jing Zhang 2021-06-18   92  	}
cb082bfab59a224 Jing Zhang 2021-06-18   93  cb082bfab59a224 Jing Zhang 
2021-06-18   94  	/*
cb082bfab59a224 Jing Zhang 2021-06-18   95  	 * Copy kvm stats header id 
string.
cb082bfab59a224 Jing Zhang 2021-06-18   96  	 * The id string is unique 
for every vm/vcpu, which is stored in kvm
cb082bfab59a224 Jing Zhang 2021-06-18   97  	 * and kvm_vcpu structure.
cb082bfab59a224 Jing Zhang 2021-06-18   98  	 * The id string is part of 
the stat header from the perspective of
cb082bfab59a224 Jing Zhang 2021-06-18   99  	 * userspace, it is usually 
read out together with previous constant
cb082bfab59a224 Jing Zhang 2021-06-18  100  	 * header part and could be 
skipped for later descriptors and stats
cb082bfab59a224 Jing Zhang 2021-06-18  101  	 * data readings.
cb082bfab59a224 Jing Zhang 2021-06-18  102  	 */
cb082bfab59a224 Jing Zhang 2021-06-18  103  	copylen = header->id_offset 
+ KVM_STATS_NAME_SIZE - pos;
cb082bfab59a224 Jing Zhang 2021-06-18  104  	copylen = min(copylen, remain);
cb082bfab59a224 Jing Zhang 2021-06-18  105  	if (copylen > 0) {
cb082bfab59a224 Jing Zhang 2021-06-18  106  		src = id + pos - 
header->id_offset;
cb082bfab59a224 Jing Zhang 2021-06-18  107  		if (copy_to_user(dest, 
src, copylen))
cb082bfab59a224 Jing Zhang 2021-06-18  108  			return -EFAULT;
cb082bfab59a224 Jing Zhang 2021-06-18  109  		remain -= copylen;
cb082bfab59a224 Jing Zhang 2021-06-18  110  		pos += copylen;
cb082bfab59a224 Jing Zhang 2021-06-18  111  		dest += copylen;
cb082bfab59a224 Jing Zhang 2021-06-18  112  	}
cb082bfab59a224 Jing Zhang 2021-06-18  113  cb082bfab59a224 Jing Zhang 
2021-06-18  114  	/*
cb082bfab59a224 Jing Zhang 2021-06-18  115  	 * Copy kvm stats descriptors.
cb082bfab59a224 Jing Zhang 2021-06-18  116  	 * The descriptors copy 
would be skipped in the typical case that
cb082bfab59a224 Jing Zhang 2021-06-18  117  	 * userspace periodically 
read stats data, since the pos would be
cb082bfab59a224 Jing Zhang 2021-06-18  118  	 * greater than the end 
address of descriptors
cb082bfab59a224 Jing Zhang 2021-06-18  119  	 * 
(header->header.desc_offset + size_desc) causing copylen <= 0.
cb082bfab59a224 Jing Zhang 2021-06-18  120  	 */
cb082bfab59a224 Jing Zhang 2021-06-18  121  	copylen = 
header->desc_offset + size_desc - pos;
cb082bfab59a224 Jing Zhang 2021-06-18  122  	copylen = min(copylen, remain);
cb082bfab59a224 Jing Zhang 2021-06-18  123  	if (copylen > 0) {
cb082bfab59a224 Jing Zhang 2021-06-18  124  		src = (void *)desc + pos - 
header->desc_offset;
cb082bfab59a224 Jing Zhang 2021-06-18  125  		if (copy_to_user(dest, 
src, copylen))
cb082bfab59a224 Jing Zhang 2021-06-18  126  			return -EFAULT;
cb082bfab59a224 Jing Zhang 2021-06-18  127  		remain -= copylen;
cb082bfab59a224 Jing Zhang 2021-06-18  128  		pos += copylen;
cb082bfab59a224 Jing Zhang 2021-06-18  129  		dest += copylen;
cb082bfab59a224 Jing Zhang 2021-06-18  130  	}
cb082bfab59a224 Jing Zhang 2021-06-18  131  cb082bfab59a224 Jing Zhang 
2021-06-18  132  	/* Copy kvm stats values */
cb082bfab59a224 Jing Zhang 2021-06-18  133  	copylen = 
header->data_offset + size_stats - pos;
cb082bfab59a224 Jing Zhang 2021-06-18  134  	copylen = min(copylen, remain);
cb082bfab59a224 Jing Zhang 2021-06-18  135  	if (copylen > 0) {
cb082bfab59a224 Jing Zhang 2021-06-18  136  		src = stats + pos - 
header->data_offset;
cb082bfab59a224 Jing Zhang 2021-06-18  137  		if (copy_to_user(dest, 
src, copylen))
cb082bfab59a224 Jing Zhang 2021-06-18  138  			return -EFAULT;
cb082bfab59a224 Jing Zhang 2021-06-18 @139  		remain -= copylen;
cb082bfab59a224 Jing Zhang 2021-06-18  140  		pos += copylen;
cb082bfab59a224 Jing Zhang 2021-06-18 @141  		dest += copylen;

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org


[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 28124 bytes --]

[-- Attachment #3: AttachedMessagePart.ksh --]
[-- Type: text/plain, Size: 150 bytes --]

_______________________________________________
kbuild mailing list -- kbuild@lists.01.org
To unsubscribe send an email to kbuild-leave@lists.01.org


^ permalink raw reply	[flat|nested] 4+ messages in thread

* arch/x86/kvm/../../../virt/kvm/binary_stats.c:139:3: warning: Value stored to 'remain' is never read [clang-analyzer-deadcode.DeadStores]
@ 2021-08-10 14:24 kernel test robot
  0 siblings, 0 replies; 4+ messages in thread
From: kernel test robot @ 2021-08-10 14:24 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 27126 bytes --]

CC: clang-built-linux(a)googlegroups.com
CC: kbuild-all(a)lists.01.org
CC: linux-kernel(a)vger.kernel.org
TO: Jing Zhang <jingzhangos@google.com>
CC: Paolo Bonzini <pbonzini@redhat.com>
CC: David Matlack <dmatlack@google.com>
CC: Ricardo Koller <ricarkol@google.com>
CC: Krish Sadhukhan <krish.sadhukhan@oracle.com>
CC: Fuad Tabba <tabba@google.com>

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head:   9a73fa375d58fee5262dd16473c8e7522bdf44de
commit: cb082bfab59a224a49ae803fed52cd03e8d6b5e0 KVM: stats: Add fd-based API to read binary stats data
date:   7 weeks ago
:::::: branch date: 15 hours ago
:::::: commit date: 7 weeks ago
config: x86_64-randconfig-c001-20210806 (attached as .config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project 42b9c2a17a0b63cccf3ac197a82f91b28e53e643)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # install x86_64 cross compiling tool for clang build
        # apt-get install binutils-x86-64-linux-gnu
        # https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=cb082bfab59a224a49ae803fed52cd03e8d6b5e0
        git remote add linus https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
        git fetch --no-tags linus master
        git checkout cb082bfab59a224a49ae803fed52cd03e8d6b5e0
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=x86_64 clang-analyzer 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>


clang-analyzer warnings: (new ones prefixed by >>)
               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/xen/grant-table.c:1360:2: note: Taking true branch
           if (xen_feature(XENFEAT_auto_translated_physmap)) {
           ^
   drivers/xen/grant-table.c:1364:10: note: Assuming 'nr_gframes' is <= field 'count'
                   BUG_ON(xen_auto_xlat_grant_frames.count < nr_gframes);
                          ^
   include/asm-generic/bug.h:63:45: note: expanded from macro 'BUG_ON'
   #define BUG_ON(condition) do { if (unlikely(condition)) BUG(); } while (0)
                                               ^~~~~~~~~
   include/linux/compiler.h:78:42: note: expanded from macro 'unlikely'
   # define unlikely(x)    __builtin_expect(!!(x), 0)
                                               ^
   drivers/xen/grant-table.c:1364:3: note: Taking false branch
                   BUG_ON(xen_auto_xlat_grant_frames.count < nr_gframes);
                   ^
   include/asm-generic/bug.h:63:32: note: expanded from macro 'BUG_ON'
   #define BUG_ON(condition) do { if (unlikely(condition)) BUG(); } while (0)
                                  ^
   drivers/xen/grant-table.c:1364:3: note: Loop condition is false.  Exiting loop
                   BUG_ON(xen_auto_xlat_grant_frames.count < nr_gframes);
                   ^
   include/asm-generic/bug.h:63:27: note: expanded from macro 'BUG_ON'
   #define BUG_ON(condition) do { if (unlikely(condition)) BUG(); } while (0)
                             ^
   drivers/xen/grant-table.c:1374:9: note: Calling 'HYPERVISOR_memory_op'
                           rc = HYPERVISOR_memory_op(XENMEM_add_to_physmap, &xatp);
                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   arch/x86/include/asm/xen/hypercall.h:334:9: note: Assigned value is garbage or undefined
           return _hypercall2(long, memory_op, cmd, arg);
                  ^
   arch/x86/include/asm/xen/hypercall.h:169:2: note: expanded from macro '_hypercall2'
           __HYPERCALL_DECLS;                                              \
           ^~~~~~~~~~~~~~~~~
   arch/x86/include/asm/xen/hypercall.h:113:2: note: expanded from macro '__HYPERCALL_DECLS'
           register unsigned long __arg1 asm(__HYPERCALL_ARG1REG) = __arg1; \
           ^                                                        ~~~~~~
   arch/x86/include/asm/xen/hypercall.h:382:9: warning: Assigned value is garbage or undefined [clang-analyzer-core.uninitialized.Assign]
           return _hypercall3(int, grant_table_op, cmd, uop, count);
                  ^
   arch/x86/include/asm/xen/hypercall.h:180:2: note: expanded from macro '_hypercall3'
           __HYPERCALL_DECLS;                                              \
           ^
   arch/x86/include/asm/xen/hypercall.h:113:2: note: expanded from macro '__HYPERCALL_DECLS'
           register unsigned long __arg1 asm(__HYPERCALL_ARG1REG) = __arg1; \
           ^
   drivers/xen/grant-table.c:1479:19: note: Calling 'gnttab_max_grant_frames'
           max_nr_gframes = gnttab_max_grant_frames();
                            ^~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/xen/grant-table.c:716:25: note: Calling '__max_nr_grant_frames'
           unsigned int xen_max = __max_nr_grant_frames();
                                  ^~~~~~~~~~~~~~~~~~~~~~~
   drivers/xen/grant-table.c:707:7: note: Calling 'HYPERVISOR_grant_table_op'
           rc = HYPERVISOR_grant_table_op(GNTTABOP_query_size, &query, 1);
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   arch/x86/include/asm/xen/hypercall.h:382:9: note: Assigned value is garbage or undefined
           return _hypercall3(int, grant_table_op, cmd, uop, count);
                  ^
   arch/x86/include/asm/xen/hypercall.h:180:2: note: expanded from macro '_hypercall3'
           __HYPERCALL_DECLS;                                              \
           ^~~~~~~~~~~~~~~~~
   arch/x86/include/asm/xen/hypercall.h:113:2: note: expanded from macro '__HYPERCALL_DECLS'
           register unsigned long __arg1 asm(__HYPERCALL_ARG1REG) = __arg1; \
           ^                                                        ~~~~~~
   drivers/xen/grant-table.c:1363:3: warning: Value stored to 'rc' is never read [clang-analyzer-deadcode.DeadStores]
                   rc = 0;
                   ^    ~
   drivers/xen/grant-table.c:1363:3: note: Value stored to 'rc' is never read
                   rc = 0;
                   ^    ~
   Suppressed 2 warnings (2 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   2 warnings generated.
   Suppressed 2 warnings (2 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   5 warnings generated.
   Suppressed 5 warnings (5 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   5 warnings generated.
   Suppressed 5 warnings (5 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   6 warnings generated.
   arch/x86/kvm/../../../virt/kvm/eventfd.c:385:2: warning: Value stored to 'ret' is never read [clang-analyzer-deadcode.DeadStores]
           ret = 0;
           ^     ~
   arch/x86/kvm/../../../virt/kvm/eventfd.c:385:2: note: Value stored to 'ret' is never read
           ret = 0;
           ^     ~
   Suppressed 5 warnings (5 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   5 warnings generated.
   Suppressed 5 warnings (5 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   5 warnings generated.
   Suppressed 5 warnings (5 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   6 warnings generated.
   Suppressed 6 warnings (5 in non-user code, 1 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   7 warnings generated.
>> arch/x86/kvm/../../../virt/kvm/binary_stats.c:139:3: warning: Value stored to 'remain' is never read [clang-analyzer-deadcode.DeadStores]
                   remain -= copylen;
                   ^         ~~~~~~~
   arch/x86/kvm/../../../virt/kvm/binary_stats.c:139:3: note: Value stored to 'remain' is never read
                   remain -= copylen;
                   ^         ~~~~~~~
>> arch/x86/kvm/../../../virt/kvm/binary_stats.c:141:3: warning: Value stored to 'dest' is never read [clang-analyzer-deadcode.DeadStores]
                   dest += copylen;
                   ^       ~~~~~~~
   arch/x86/kvm/../../../virt/kvm/binary_stats.c:141:3: note: Value stored to 'dest' is never read
                   dest += copylen;
                   ^       ~~~~~~~
   Suppressed 5 warnings (5 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   3 warnings generated.
   drivers/mfd/vx855.c:89:2: warning: Value stored to 'ret' is never read [clang-analyzer-deadcode.DeadStores]
           ret = mfd_add_devices(&pdev->dev, -1, vx855_cells, ARRAY_SIZE(vx855_cells),
           ^     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/mfd/vx855.c:89:2: note: Value stored to 'ret' is never read
           ret = mfd_add_devices(&pdev->dev, -1, vx855_cells, ARRAY_SIZE(vx855_cells),
           ^     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   Suppressed 2 warnings (2 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   2 warnings generated.
   Suppressed 2 warnings (2 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   2 warnings generated.
   Suppressed 2 warnings (2 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   2 warnings generated.
   Suppressed 2 warnings (2 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   2 warnings generated.
   Suppressed 2 warnings (2 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   2 warnings generated.
   Suppressed 2 warnings (2 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   3 warnings generated.
   kernel/trace/trace_printk.c:77:5: warning: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcpy'. CWE-119 [clang-analyzer-security.insecureAPI.strcpy]
                                   strcpy(fmt, *iter);
                                   ^~~~~~
   kernel/trace/trace_printk.c:77:5: note: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcpy'. CWE-119
                                   strcpy(fmt, *iter);
                                   ^~~~~~
   Suppressed 2 warnings (2 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   2 warnings generated.
   Suppressed 2 warnings (2 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   2 warnings generated.
   Suppressed 2 warnings (2 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   2 warnings generated.
   Suppressed 2 warnings (2 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   4 warnings generated.
   Suppressed 4 warnings (2 in non-user code, 2 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   2 warnings generated.
   Suppressed 2 warnings (2 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   3 warnings generated.
   drivers/acpi/acpica/rscreate.c:327:5: warning: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcpy'. CWE-119 [clang-analyzer-security.insecureAPI.strcpy]
                                   strcpy(user_prt->source,
                                   ^~~~~~
   drivers/acpi/acpica/rscreate.c:327:5: note: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcpy'. CWE-119
                                   strcpy(user_prt->source,
                                   ^~~~~~
   Suppressed 2 warnings (2 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   2 warnings generated.
   Suppressed 2 warnings (2 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   2 warnings generated.
   Suppressed 2 warnings (2 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   4 warnings generated.
   drivers/misc/eeprom/at24.c:334:2: warning: Value stored to 'client' is never read [clang-analyzer-deadcode.DeadStores]
           client = at24_client->client;
           ^        ~~~~~~~~~~~~~~~~~~~
   drivers/misc/eeprom/at24.c:334:2: note: Value stored to 'client' is never read
           client = at24_client->client;
           ^        ~~~~~~~~~~~~~~~~~~~
   drivers/misc/eeprom/at24.c:397:2: warning: Value stored to 'client' is never read [clang-analyzer-deadcode.DeadStores]
           client = at24_client->client;
           ^        ~~~~~~~~~~~~~~~~~~~
   drivers/misc/eeprom/at24.c:397:2: note: Value stored to 'client' is never read
           client = at24_client->client;
           ^        ~~~~~~~~~~~~~~~~~~~
   Suppressed 2 warnings (2 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   2 warnings generated.
   Suppressed 2 warnings (2 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   6 warnings generated.
   drivers/misc/eeprom/idt_89hpesx.c:977:3: warning: Value stored to 'csraddr_len' is never read [clang-analyzer-deadcode.DeadStores]
                   csraddr_len = strnlen(csraddr_str, count);
                   ^             ~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/misc/eeprom/idt_89hpesx.c:977:3: note: Value stored to 'csraddr_len' is never read
                   csraddr_len = strnlen(csraddr_str, count);
                   ^             ~~~~~~~~~~~~~~~~~~~~~~~~~~~
   Suppressed 5 warnings (2 in non-user code, 3 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   2 warnings generated.
   Suppressed 2 warnings (2 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.

vim +/remain +139 arch/x86/kvm/../../../virt/kvm/binary_stats.c

cb082bfab59a224 Jing Zhang 2021-06-18   12  
cb082bfab59a224 Jing Zhang 2021-06-18   13  /**
cb082bfab59a224 Jing Zhang 2021-06-18   14   * kvm_stats_read() - Common function to read from the binary statistics
cb082bfab59a224 Jing Zhang 2021-06-18   15   * file descriptor.
cb082bfab59a224 Jing Zhang 2021-06-18   16   *
cb082bfab59a224 Jing Zhang 2021-06-18   17   * @id: identification string of the stats
cb082bfab59a224 Jing Zhang 2021-06-18   18   * @header: stats header for a vm or a vcpu
cb082bfab59a224 Jing Zhang 2021-06-18   19   * @desc: start address of an array of stats descriptors for a vm or a vcpu
cb082bfab59a224 Jing Zhang 2021-06-18   20   * @stats: start address of stats data block for a vm or a vcpu
cb082bfab59a224 Jing Zhang 2021-06-18   21   * @size_stats: the size of stats data block pointed by @stats
cb082bfab59a224 Jing Zhang 2021-06-18   22   * @user_buffer: start address of userspace buffer
cb082bfab59a224 Jing Zhang 2021-06-18   23   * @size: requested read size from userspace
cb082bfab59a224 Jing Zhang 2021-06-18   24   * @offset: the start position from which the content will be read for the
cb082bfab59a224 Jing Zhang 2021-06-18   25   *          corresponding vm or vcp file descriptor
cb082bfab59a224 Jing Zhang 2021-06-18   26   *
cb082bfab59a224 Jing Zhang 2021-06-18   27   * The file content of a vm/vcpu file descriptor is now defined as below:
cb082bfab59a224 Jing Zhang 2021-06-18   28   * +-------------+
cb082bfab59a224 Jing Zhang 2021-06-18   29   * |   Header    |
cb082bfab59a224 Jing Zhang 2021-06-18   30   * +-------------+
cb082bfab59a224 Jing Zhang 2021-06-18   31   * |  id string  |
cb082bfab59a224 Jing Zhang 2021-06-18   32   * +-------------+
cb082bfab59a224 Jing Zhang 2021-06-18   33   * | Descriptors |
cb082bfab59a224 Jing Zhang 2021-06-18   34   * +-------------+
cb082bfab59a224 Jing Zhang 2021-06-18   35   * | Stats Data  |
cb082bfab59a224 Jing Zhang 2021-06-18   36   * +-------------+
cb082bfab59a224 Jing Zhang 2021-06-18   37   * Although this function allows userspace to read any amount of data (as long
cb082bfab59a224 Jing Zhang 2021-06-18   38   * as in the limit) from any position, the typical usage would follow below
cb082bfab59a224 Jing Zhang 2021-06-18   39   * steps:
cb082bfab59a224 Jing Zhang 2021-06-18   40   * 1. Read header from offset 0. Get the offset of descriptors and stats data
cb082bfab59a224 Jing Zhang 2021-06-18   41   *    and some other necessary information. This is a one-time work for the
cb082bfab59a224 Jing Zhang 2021-06-18   42   *    lifecycle of the corresponding vm/vcpu stats fd.
cb082bfab59a224 Jing Zhang 2021-06-18   43   * 2. Read id string from its offset. This is a one-time work for the lifecycle
cb082bfab59a224 Jing Zhang 2021-06-18   44   *    of the corresponding vm/vcpu stats fd.
cb082bfab59a224 Jing Zhang 2021-06-18   45   * 3. Read descriptors from its offset and discover all the stats by parsing
cb082bfab59a224 Jing Zhang 2021-06-18   46   *    descriptors. This is a one-time work for the lifecycle of the
cb082bfab59a224 Jing Zhang 2021-06-18   47   *    corresponding vm/vcpu stats fd.
cb082bfab59a224 Jing Zhang 2021-06-18   48   * 4. Periodically read stats data from its offset using pread.
cb082bfab59a224 Jing Zhang 2021-06-18   49   *
cb082bfab59a224 Jing Zhang 2021-06-18   50   * Return: the number of bytes that has been successfully read
cb082bfab59a224 Jing Zhang 2021-06-18   51   */
cb082bfab59a224 Jing Zhang 2021-06-18   52  ssize_t kvm_stats_read(char *id, const struct kvm_stats_header *header,
cb082bfab59a224 Jing Zhang 2021-06-18   53  		       const struct _kvm_stats_desc *desc,
cb082bfab59a224 Jing Zhang 2021-06-18   54  		       void *stats, size_t size_stats,
cb082bfab59a224 Jing Zhang 2021-06-18   55  		       char __user *user_buffer, size_t size, loff_t *offset)
cb082bfab59a224 Jing Zhang 2021-06-18   56  {
cb082bfab59a224 Jing Zhang 2021-06-18   57  	ssize_t len;
cb082bfab59a224 Jing Zhang 2021-06-18   58  	ssize_t copylen;
cb082bfab59a224 Jing Zhang 2021-06-18   59  	ssize_t remain = size;
cb082bfab59a224 Jing Zhang 2021-06-18   60  	size_t size_desc;
cb082bfab59a224 Jing Zhang 2021-06-18   61  	size_t size_header;
cb082bfab59a224 Jing Zhang 2021-06-18   62  	void *src;
cb082bfab59a224 Jing Zhang 2021-06-18   63  	loff_t pos = *offset;
cb082bfab59a224 Jing Zhang 2021-06-18   64  	char __user *dest = user_buffer;
cb082bfab59a224 Jing Zhang 2021-06-18   65  
cb082bfab59a224 Jing Zhang 2021-06-18   66  	size_header = sizeof(*header);
cb082bfab59a224 Jing Zhang 2021-06-18   67  	size_desc = header->num_desc * sizeof(*desc);
cb082bfab59a224 Jing Zhang 2021-06-18   68  
cb082bfab59a224 Jing Zhang 2021-06-18   69  	len = KVM_STATS_NAME_SIZE + size_header + size_desc + size_stats - pos;
cb082bfab59a224 Jing Zhang 2021-06-18   70  	len = min(len, remain);
cb082bfab59a224 Jing Zhang 2021-06-18   71  	if (len <= 0)
cb082bfab59a224 Jing Zhang 2021-06-18   72  		return 0;
cb082bfab59a224 Jing Zhang 2021-06-18   73  	remain = len;
cb082bfab59a224 Jing Zhang 2021-06-18   74  
cb082bfab59a224 Jing Zhang 2021-06-18   75  	/*
cb082bfab59a224 Jing Zhang 2021-06-18   76  	 * Copy kvm stats header.
cb082bfab59a224 Jing Zhang 2021-06-18   77  	 * The header is the first block of content userspace usually read out.
cb082bfab59a224 Jing Zhang 2021-06-18   78  	 * The pos is 0 and the copylen and remain would be the size of header.
cb082bfab59a224 Jing Zhang 2021-06-18   79  	 * The copy of the header would be skipped if offset is larger than the
cb082bfab59a224 Jing Zhang 2021-06-18   80  	 * size of header. That usually happens when userspace reads stats
cb082bfab59a224 Jing Zhang 2021-06-18   81  	 * descriptors and stats data.
cb082bfab59a224 Jing Zhang 2021-06-18   82  	 */
cb082bfab59a224 Jing Zhang 2021-06-18   83  	copylen = size_header - pos;
cb082bfab59a224 Jing Zhang 2021-06-18   84  	copylen = min(copylen, remain);
cb082bfab59a224 Jing Zhang 2021-06-18   85  	if (copylen > 0) {
cb082bfab59a224 Jing Zhang 2021-06-18   86  		src = (void *)header + pos;
cb082bfab59a224 Jing Zhang 2021-06-18   87  		if (copy_to_user(dest, src, copylen))
cb082bfab59a224 Jing Zhang 2021-06-18   88  			return -EFAULT;
cb082bfab59a224 Jing Zhang 2021-06-18   89  		remain -= copylen;
cb082bfab59a224 Jing Zhang 2021-06-18   90  		pos += copylen;
cb082bfab59a224 Jing Zhang 2021-06-18   91  		dest += copylen;
cb082bfab59a224 Jing Zhang 2021-06-18   92  	}
cb082bfab59a224 Jing Zhang 2021-06-18   93  
cb082bfab59a224 Jing Zhang 2021-06-18   94  	/*
cb082bfab59a224 Jing Zhang 2021-06-18   95  	 * Copy kvm stats header id string.
cb082bfab59a224 Jing Zhang 2021-06-18   96  	 * The id string is unique for every vm/vcpu, which is stored in kvm
cb082bfab59a224 Jing Zhang 2021-06-18   97  	 * and kvm_vcpu structure.
cb082bfab59a224 Jing Zhang 2021-06-18   98  	 * The id string is part of the stat header from the perspective of
cb082bfab59a224 Jing Zhang 2021-06-18   99  	 * userspace, it is usually read out together with previous constant
cb082bfab59a224 Jing Zhang 2021-06-18  100  	 * header part and could be skipped for later descriptors and stats
cb082bfab59a224 Jing Zhang 2021-06-18  101  	 * data readings.
cb082bfab59a224 Jing Zhang 2021-06-18  102  	 */
cb082bfab59a224 Jing Zhang 2021-06-18  103  	copylen = header->id_offset + KVM_STATS_NAME_SIZE - pos;
cb082bfab59a224 Jing Zhang 2021-06-18  104  	copylen = min(copylen, remain);
cb082bfab59a224 Jing Zhang 2021-06-18  105  	if (copylen > 0) {
cb082bfab59a224 Jing Zhang 2021-06-18  106  		src = id + pos - header->id_offset;
cb082bfab59a224 Jing Zhang 2021-06-18  107  		if (copy_to_user(dest, src, copylen))
cb082bfab59a224 Jing Zhang 2021-06-18  108  			return -EFAULT;
cb082bfab59a224 Jing Zhang 2021-06-18  109  		remain -= copylen;
cb082bfab59a224 Jing Zhang 2021-06-18  110  		pos += copylen;
cb082bfab59a224 Jing Zhang 2021-06-18  111  		dest += copylen;
cb082bfab59a224 Jing Zhang 2021-06-18  112  	}
cb082bfab59a224 Jing Zhang 2021-06-18  113  
cb082bfab59a224 Jing Zhang 2021-06-18  114  	/*
cb082bfab59a224 Jing Zhang 2021-06-18  115  	 * Copy kvm stats descriptors.
cb082bfab59a224 Jing Zhang 2021-06-18  116  	 * The descriptors copy would be skipped in the typical case that
cb082bfab59a224 Jing Zhang 2021-06-18  117  	 * userspace periodically read stats data, since the pos would be
cb082bfab59a224 Jing Zhang 2021-06-18  118  	 * greater than the end address of descriptors
cb082bfab59a224 Jing Zhang 2021-06-18  119  	 * (header->header.desc_offset + size_desc) causing copylen <= 0.
cb082bfab59a224 Jing Zhang 2021-06-18  120  	 */
cb082bfab59a224 Jing Zhang 2021-06-18  121  	copylen = header->desc_offset + size_desc - pos;
cb082bfab59a224 Jing Zhang 2021-06-18  122  	copylen = min(copylen, remain);
cb082bfab59a224 Jing Zhang 2021-06-18  123  	if (copylen > 0) {
cb082bfab59a224 Jing Zhang 2021-06-18  124  		src = (void *)desc + pos - header->desc_offset;
cb082bfab59a224 Jing Zhang 2021-06-18  125  		if (copy_to_user(dest, src, copylen))
cb082bfab59a224 Jing Zhang 2021-06-18  126  			return -EFAULT;
cb082bfab59a224 Jing Zhang 2021-06-18  127  		remain -= copylen;
cb082bfab59a224 Jing Zhang 2021-06-18  128  		pos += copylen;
cb082bfab59a224 Jing Zhang 2021-06-18  129  		dest += copylen;
cb082bfab59a224 Jing Zhang 2021-06-18  130  	}
cb082bfab59a224 Jing Zhang 2021-06-18  131  
cb082bfab59a224 Jing Zhang 2021-06-18  132  	/* Copy kvm stats values */
cb082bfab59a224 Jing Zhang 2021-06-18  133  	copylen = header->data_offset + size_stats - pos;
cb082bfab59a224 Jing Zhang 2021-06-18  134  	copylen = min(copylen, remain);
cb082bfab59a224 Jing Zhang 2021-06-18  135  	if (copylen > 0) {
cb082bfab59a224 Jing Zhang 2021-06-18  136  		src = stats + pos - header->data_offset;
cb082bfab59a224 Jing Zhang 2021-06-18  137  		if (copy_to_user(dest, src, copylen))
cb082bfab59a224 Jing Zhang 2021-06-18  138  			return -EFAULT;
cb082bfab59a224 Jing Zhang 2021-06-18 @139  		remain -= copylen;
cb082bfab59a224 Jing Zhang 2021-06-18  140  		pos += copylen;
cb082bfab59a224 Jing Zhang 2021-06-18 @141  		dest += copylen;

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 28124 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2021-08-10 14:24 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-08-09 19:59 arch/x86/kvm/../../../virt/kvm/binary_stats.c:139:3: warning: Value stored to 'remain' is never read [clang-analyzer-deadcode.DeadStores] kernel test robot
2021-08-10  8:28 ` kernel test robot
2021-08-10  8:28   ` kernel test robot
2021-08-10 14:24 kernel test robot

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.