CC: kbuild-all(a)lists.01.org CC: linux-kernel(a)vger.kernel.org TO: Subbaraya Sundeep CC: Jakub Kicinski CC: Sunil Goutham CC: Naveen Mamindlapalli tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master head: 8baef6386baaefb776bdd09b5c7630cf057c51c6 commit: 55307fcb925846d760ed80f4a8359dd4331c52bd octeontx2-af: Add mbox messages to install and delete MCAM rules date: 8 months ago :::::: branch date: 3 hours ago :::::: commit date: 8 months ago config: mips-randconfig-m031-20210723 (attached as .config) compiler: mips64-linux-gcc (GCC) 10.3.0 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot Reported-by: Dan Carpenter New smatch warnings: drivers/net/ethernet/marvell/octeontx2/af/rvu_npc_fs.c:637 npc_update_entry() error: buffer overflow 'field->kw_mask' 7 <= 7 drivers/net/ethernet/marvell/octeontx2/af/rvu_npc_fs.c:638 npc_update_entry() error: buffer overflow 'dummy.kw' 7 <= 7 drivers/net/ethernet/marvell/octeontx2/af/rvu_npc_fs.c:643 npc_update_entry() error: buffer overflow 'dummy.kw_mask' 7 <= 7 Old smatch warnings: drivers/net/ethernet/marvell/octeontx2/af/rvu_npc_fs.c:642 npc_update_entry() error: buffer overflow 'field->kw_mask' 7 <= 7 drivers/net/ethernet/marvell/octeontx2/af/rvu_npc_fs.c:651 npc_update_entry() error: buffer overflow 'field->kw_mask' 7 <= 7 drivers/net/ethernet/marvell/octeontx2/af/rvu_npc_fs.c:653 npc_update_entry() error: buffer overflow 'field->kw_mask' 7 <= 8 drivers/net/ethernet/marvell/octeontx2/af/rvu_npc_fs.c:654 npc_update_entry() error: buffer overflow 'dummy.kw' 7 <= 7 drivers/net/ethernet/marvell/octeontx2/af/rvu_npc_fs.c:655 npc_update_entry() error: buffer overflow 'dummy.kw' 7 <= 8 drivers/net/ethernet/marvell/octeontx2/af/rvu_npc_fs.c:659 npc_update_entry() error: buffer overflow 'field->kw_mask' 7 <= 7 drivers/net/ethernet/marvell/octeontx2/af/rvu_npc_fs.c:661 npc_update_entry() error: buffer overflow 'field->kw_mask' 7 <= 8 drivers/net/ethernet/marvell/octeontx2/af/rvu_npc_fs.c:662 npc_update_entry() error: buffer overflow 'dummy.kw_mask' 7 <= 7 drivers/net/ethernet/marvell/octeontx2/af/rvu_npc_fs.c:663 npc_update_entry() error: buffer overflow 'dummy.kw_mask' 7 <= 8 drivers/net/ethernet/marvell/octeontx2/af/rvu_npc_fs.c:1206 rvu_mbox_handler_npc_delete_flow() error: dereferencing freed memory 'iter' vim +637 drivers/net/ethernet/marvell/octeontx2/af/rvu_npc_fs.c 55307fcb925846 Subbaraya Sundeep 2020-11-15 588 55307fcb925846 Subbaraya Sundeep 2020-11-15 589 /* npc_update_entry - Based on the masks generated during 55307fcb925846 Subbaraya Sundeep 2020-11-15 590 * the key scanning, updates the given entry with value and 55307fcb925846 Subbaraya Sundeep 2020-11-15 591 * masks for the field of interest. Maximum 16 bytes of a packet 55307fcb925846 Subbaraya Sundeep 2020-11-15 592 * header can be extracted by HW hence lo and hi are sufficient. 55307fcb925846 Subbaraya Sundeep 2020-11-15 593 * When field bytes are less than or equal to 8 then hi should be 55307fcb925846 Subbaraya Sundeep 2020-11-15 594 * 0 for value and mask. 55307fcb925846 Subbaraya Sundeep 2020-11-15 595 * 55307fcb925846 Subbaraya Sundeep 2020-11-15 596 * If exact match of value is required then mask should be all 1's. 55307fcb925846 Subbaraya Sundeep 2020-11-15 597 * If any bits in mask are 0 then corresponding bits in value are 55307fcb925846 Subbaraya Sundeep 2020-11-15 598 * dont care. 55307fcb925846 Subbaraya Sundeep 2020-11-15 599 */ 55307fcb925846 Subbaraya Sundeep 2020-11-15 600 static void npc_update_entry(struct rvu *rvu, enum key_fields type, 55307fcb925846 Subbaraya Sundeep 2020-11-15 601 struct mcam_entry *entry, u64 val_lo, 55307fcb925846 Subbaraya Sundeep 2020-11-15 602 u64 val_hi, u64 mask_lo, u64 mask_hi, u8 intf) 55307fcb925846 Subbaraya Sundeep 2020-11-15 603 { 55307fcb925846 Subbaraya Sundeep 2020-11-15 604 struct npc_mcam *mcam = &rvu->hw->mcam; 55307fcb925846 Subbaraya Sundeep 2020-11-15 605 struct mcam_entry dummy = { {0} }; 55307fcb925846 Subbaraya Sundeep 2020-11-15 606 struct npc_key_field *field; 55307fcb925846 Subbaraya Sundeep 2020-11-15 607 u64 kw1, kw2, kw3; 55307fcb925846 Subbaraya Sundeep 2020-11-15 608 u8 shift; 55307fcb925846 Subbaraya Sundeep 2020-11-15 609 int i; 55307fcb925846 Subbaraya Sundeep 2020-11-15 610 55307fcb925846 Subbaraya Sundeep 2020-11-15 611 field = &mcam->rx_key_fields[type]; 55307fcb925846 Subbaraya Sundeep 2020-11-15 612 if (is_npc_intf_tx(intf)) 55307fcb925846 Subbaraya Sundeep 2020-11-15 613 field = &mcam->tx_key_fields[type]; 55307fcb925846 Subbaraya Sundeep 2020-11-15 614 55307fcb925846 Subbaraya Sundeep 2020-11-15 615 if (!field->nr_kws) 55307fcb925846 Subbaraya Sundeep 2020-11-15 616 return; 55307fcb925846 Subbaraya Sundeep 2020-11-15 617 55307fcb925846 Subbaraya Sundeep 2020-11-15 618 for (i = 0; i < NPC_MAX_KWS_IN_KEY; i++) { 55307fcb925846 Subbaraya Sundeep 2020-11-15 619 if (!field->kw_mask[i]) 55307fcb925846 Subbaraya Sundeep 2020-11-15 620 continue; 55307fcb925846 Subbaraya Sundeep 2020-11-15 621 /* place key value in kw[x] */ 55307fcb925846 Subbaraya Sundeep 2020-11-15 622 shift = __ffs64(field->kw_mask[i]); 55307fcb925846 Subbaraya Sundeep 2020-11-15 623 /* update entry value */ 55307fcb925846 Subbaraya Sundeep 2020-11-15 624 kw1 = (val_lo << shift) & field->kw_mask[i]; 55307fcb925846 Subbaraya Sundeep 2020-11-15 625 dummy.kw[i] = kw1; 55307fcb925846 Subbaraya Sundeep 2020-11-15 626 /* update entry mask */ 55307fcb925846 Subbaraya Sundeep 2020-11-15 627 kw1 = (mask_lo << shift) & field->kw_mask[i]; 55307fcb925846 Subbaraya Sundeep 2020-11-15 628 dummy.kw_mask[i] = kw1; 55307fcb925846 Subbaraya Sundeep 2020-11-15 629 55307fcb925846 Subbaraya Sundeep 2020-11-15 630 if (field->nr_kws == 1) 55307fcb925846 Subbaraya Sundeep 2020-11-15 631 break; 55307fcb925846 Subbaraya Sundeep 2020-11-15 632 /* place remaining bits of key value in kw[x + 1] */ 55307fcb925846 Subbaraya Sundeep 2020-11-15 633 if (field->nr_kws == 2) { 55307fcb925846 Subbaraya Sundeep 2020-11-15 634 /* update entry value */ 55307fcb925846 Subbaraya Sundeep 2020-11-15 635 kw2 = shift ? val_lo >> (64 - shift) : 0; 55307fcb925846 Subbaraya Sundeep 2020-11-15 636 kw2 |= (val_hi << shift); 55307fcb925846 Subbaraya Sundeep 2020-11-15 @637 kw2 &= field->kw_mask[i + 1]; 55307fcb925846 Subbaraya Sundeep 2020-11-15 @638 dummy.kw[i + 1] = kw2; 55307fcb925846 Subbaraya Sundeep 2020-11-15 639 /* update entry mask */ 55307fcb925846 Subbaraya Sundeep 2020-11-15 640 kw2 = shift ? mask_lo >> (64 - shift) : 0; 55307fcb925846 Subbaraya Sundeep 2020-11-15 641 kw2 |= (mask_hi << shift); 55307fcb925846 Subbaraya Sundeep 2020-11-15 642 kw2 &= field->kw_mask[i + 1]; 55307fcb925846 Subbaraya Sundeep 2020-11-15 @643 dummy.kw_mask[i + 1] = kw2; 55307fcb925846 Subbaraya Sundeep 2020-11-15 644 break; 55307fcb925846 Subbaraya Sundeep 2020-11-15 645 } 55307fcb925846 Subbaraya Sundeep 2020-11-15 646 /* place remaining bits of key value in kw[x + 1], kw[x + 2] */ 55307fcb925846 Subbaraya Sundeep 2020-11-15 647 if (field->nr_kws == 3) { 55307fcb925846 Subbaraya Sundeep 2020-11-15 648 /* update entry value */ 55307fcb925846 Subbaraya Sundeep 2020-11-15 649 kw2 = shift ? val_lo >> (64 - shift) : 0; 55307fcb925846 Subbaraya Sundeep 2020-11-15 650 kw2 |= (val_hi << shift); 55307fcb925846 Subbaraya Sundeep 2020-11-15 651 kw2 &= field->kw_mask[i + 1]; 55307fcb925846 Subbaraya Sundeep 2020-11-15 652 kw3 = shift ? val_hi >> (64 - shift) : 0; 55307fcb925846 Subbaraya Sundeep 2020-11-15 653 kw3 &= field->kw_mask[i + 2]; 55307fcb925846 Subbaraya Sundeep 2020-11-15 654 dummy.kw[i + 1] = kw2; 55307fcb925846 Subbaraya Sundeep 2020-11-15 655 dummy.kw[i + 2] = kw3; 55307fcb925846 Subbaraya Sundeep 2020-11-15 656 /* update entry mask */ 55307fcb925846 Subbaraya Sundeep 2020-11-15 657 kw2 = shift ? mask_lo >> (64 - shift) : 0; 55307fcb925846 Subbaraya Sundeep 2020-11-15 658 kw2 |= (mask_hi << shift); 55307fcb925846 Subbaraya Sundeep 2020-11-15 659 kw2 &= field->kw_mask[i + 1]; 55307fcb925846 Subbaraya Sundeep 2020-11-15 660 kw3 = shift ? mask_hi >> (64 - shift) : 0; 55307fcb925846 Subbaraya Sundeep 2020-11-15 661 kw3 &= field->kw_mask[i + 2]; 55307fcb925846 Subbaraya Sundeep 2020-11-15 662 dummy.kw_mask[i + 1] = kw2; 55307fcb925846 Subbaraya Sundeep 2020-11-15 663 dummy.kw_mask[i + 2] = kw3; 55307fcb925846 Subbaraya Sundeep 2020-11-15 664 break; 55307fcb925846 Subbaraya Sundeep 2020-11-15 665 } 55307fcb925846 Subbaraya Sundeep 2020-11-15 666 } 55307fcb925846 Subbaraya Sundeep 2020-11-15 667 /* dummy is ready with values and masks for given key 55307fcb925846 Subbaraya Sundeep 2020-11-15 668 * field now clear and update input entry with those 55307fcb925846 Subbaraya Sundeep 2020-11-15 669 */ 55307fcb925846 Subbaraya Sundeep 2020-11-15 670 for (i = 0; i < NPC_MAX_KWS_IN_KEY; i++) { 55307fcb925846 Subbaraya Sundeep 2020-11-15 671 if (!field->kw_mask[i]) 55307fcb925846 Subbaraya Sundeep 2020-11-15 672 continue; 55307fcb925846 Subbaraya Sundeep 2020-11-15 673 entry->kw[i] &= ~field->kw_mask[i]; 55307fcb925846 Subbaraya Sundeep 2020-11-15 674 entry->kw_mask[i] &= ~field->kw_mask[i]; 55307fcb925846 Subbaraya Sundeep 2020-11-15 675 55307fcb925846 Subbaraya Sundeep 2020-11-15 676 entry->kw[i] |= dummy.kw[i]; 55307fcb925846 Subbaraya Sundeep 2020-11-15 677 entry->kw_mask[i] |= dummy.kw_mask[i]; 55307fcb925846 Subbaraya Sundeep 2020-11-15 678 } 55307fcb925846 Subbaraya Sundeep 2020-11-15 679 } 55307fcb925846 Subbaraya Sundeep 2020-11-15 680 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org