tree: https://github.com/cminyard/linux-ipmi for-next head: f68d16759343cdbe44de07b9569b0b992291d13c commit: 8365203515c64c9f7c11d14cdcccdac58c793598 [1/2] ipmi: rate limit ipmi smi_event failure message config: arc-randconfig-r011-20210812 (attached as .config) compiler: arc-elf-gcc (GCC) 10.3.0 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 # https://github.com/cminyard/linux-ipmi/commit/8365203515c64c9f7c11d14cdcccdac58c793598 git remote add ipmi https://github.com/cminyard/linux-ipmi git fetch --no-tags ipmi for-next git checkout 8365203515c64c9f7c11d14cdcccdac58c793598 # save the attached .config to linux build tree mkdir build_dir COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-10.3.0 make.cross O=build_dir ARCH=arc SHELL=/bin/bash If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot All error/warnings (new ones prefixed by >>): In file included from include/linux/device.h:15, from include/linux/acpi.h:15, from include/linux/ipmi.h:21, from drivers/char/ipmi/ipmi_si_intf.c:40: drivers/char/ipmi/ipmi_si_intf.c: In function 'handle_transaction_done': >> drivers/char/ipmi/ipmi_si_intf.c:689:5: error: expected ')' before 'msg' 689 | msg[2]); | ^~~ include/linux/dev_printk.h:19:22: note: in definition of macro 'dev_fmt' 19 | #define dev_fmt(fmt) fmt | ^~~ include/linux/dev_printk.h:176:3: note: in expansion of macro 'dev_warn' 176 | dev_level(dev, fmt, ##__VA_ARGS__); \ | ^~~~~~~~~ include/linux/dev_printk.h:188:2: note: in expansion of macro 'dev_level_ratelimited' 188 | dev_level_ratelimited(dev_warn, dev, fmt, ##__VA_ARGS__) | ^~~~~~~~~~~~~~~~~~~~~ drivers/char/ipmi/ipmi_si_intf.c:686:4: note: in expansion of macro 'dev_warn_ratelimited' 686 | dev_warn_ratelimited(smi_info->io.dev, | ^~~~~~~~~~~~~~~~~~~~ >> drivers/char/ipmi/ipmi_si_intf.c:687:5: warning: format '%x' expects a matching 'unsigned int' argument [-Wformat=] 687 | "Couldn't get irq info: %x,\n" | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/dev_printk.h:19:22: note: in definition of macro 'dev_fmt' 19 | #define dev_fmt(fmt) fmt | ^~~ include/linux/dev_printk.h:176:3: note: in expansion of macro 'dev_warn' 176 | dev_level(dev, fmt, ##__VA_ARGS__); \ | ^~~~~~~~~ include/linux/dev_printk.h:188:2: note: in expansion of macro 'dev_level_ratelimited' 188 | dev_level_ratelimited(dev_warn, dev, fmt, ##__VA_ARGS__) | ^~~~~~~~~~~~~~~~~~~~~ drivers/char/ipmi/ipmi_si_intf.c:686:4: note: in expansion of macro 'dev_warn_ratelimited' 686 | dev_warn_ratelimited(smi_info->io.dev, | ^~~~~~~~~~~~~~~~~~~~ drivers/char/ipmi/ipmi_si_intf.c:687:30: note: format string is defined here 687 | "Couldn't get irq info: %x,\n" | ~^ | | | unsigned int vim +689 drivers/char/ipmi/ipmi_si_intf.c 536 537 static void handle_transaction_done(struct smi_info *smi_info) 538 { 539 struct ipmi_smi_msg *msg; 540 541 debug_timestamp("Done"); 542 switch (smi_info->si_state) { 543 case SI_NORMAL: 544 if (!smi_info->curr_msg) 545 break; 546 547 smi_info->curr_msg->rsp_size 548 = smi_info->handlers->get_result( 549 smi_info->si_sm, 550 smi_info->curr_msg->rsp, 551 IPMI_MAX_MSG_LENGTH); 552 553 /* 554 * Do this here becase deliver_recv_msg() releases the 555 * lock, and a new message can be put in during the 556 * time the lock is released. 557 */ 558 msg = smi_info->curr_msg; 559 smi_info->curr_msg = NULL; 560 deliver_recv_msg(smi_info, msg); 561 break; 562 563 case SI_GETTING_FLAGS: 564 { 565 unsigned char msg[4]; 566 unsigned int len; 567 568 /* We got the flags from the SMI, now handle them. */ 569 len = smi_info->handlers->get_result(smi_info->si_sm, msg, 4); 570 if (msg[2] != 0) { 571 /* Error fetching flags, just give up for now. */ 572 smi_info->si_state = SI_NORMAL; 573 } else if (len < 4) { 574 /* 575 * Hmm, no flags. That's technically illegal, but 576 * don't use uninitialized data. 577 */ 578 smi_info->si_state = SI_NORMAL; 579 } else { 580 smi_info->msg_flags = msg[3]; 581 handle_flags(smi_info); 582 } 583 break; 584 } 585 586 case SI_CLEARING_FLAGS: 587 { 588 unsigned char msg[3]; 589 590 /* We cleared the flags. */ 591 smi_info->handlers->get_result(smi_info->si_sm, msg, 3); 592 if (msg[2] != 0) { 593 /* Error clearing flags */ 594 dev_warn_ratelimited(smi_info->io.dev, 595 "Error clearing flags: %2.2x\n", msg[2]); 596 } 597 smi_info->si_state = SI_NORMAL; 598 break; 599 } 600 601 case SI_GETTING_EVENTS: 602 { 603 smi_info->curr_msg->rsp_size 604 = smi_info->handlers->get_result( 605 smi_info->si_sm, 606 smi_info->curr_msg->rsp, 607 IPMI_MAX_MSG_LENGTH); 608 609 /* 610 * Do this here becase deliver_recv_msg() releases the 611 * lock, and a new message can be put in during the 612 * time the lock is released. 613 */ 614 msg = smi_info->curr_msg; 615 smi_info->curr_msg = NULL; 616 if (msg->rsp[2] != 0) { 617 /* Error getting event, probably done. */ 618 msg->done(msg); 619 620 /* Take off the event flag. */ 621 smi_info->msg_flags &= ~EVENT_MSG_BUFFER_FULL; 622 handle_flags(smi_info); 623 } else { 624 smi_inc_stat(smi_info, events); 625 626 /* 627 * Do this before we deliver the message 628 * because delivering the message releases the 629 * lock and something else can mess with the 630 * state. 631 */ 632 handle_flags(smi_info); 633 634 deliver_recv_msg(smi_info, msg); 635 } 636 break; 637 } 638 639 case SI_GETTING_MESSAGES: 640 { 641 smi_info->curr_msg->rsp_size 642 = smi_info->handlers->get_result( 643 smi_info->si_sm, 644 smi_info->curr_msg->rsp, 645 IPMI_MAX_MSG_LENGTH); 646 647 /* 648 * Do this here becase deliver_recv_msg() releases the 649 * lock, and a new message can be put in during the 650 * time the lock is released. 651 */ 652 msg = smi_info->curr_msg; 653 smi_info->curr_msg = NULL; 654 if (msg->rsp[2] != 0) { 655 /* Error getting event, probably done. */ 656 msg->done(msg); 657 658 /* Take off the msg flag. */ 659 smi_info->msg_flags &= ~RECEIVE_MSG_AVAIL; 660 handle_flags(smi_info); 661 } else { 662 smi_inc_stat(smi_info, incoming_messages); 663 664 /* 665 * Do this before we deliver the message 666 * because delivering the message releases the 667 * lock and something else can mess with the 668 * state. 669 */ 670 handle_flags(smi_info); 671 672 deliver_recv_msg(smi_info, msg); 673 } 674 break; 675 } 676 677 case SI_CHECKING_ENABLES: 678 { 679 unsigned char msg[4]; 680 u8 enables; 681 bool irq_on; 682 683 /* We got the flags from the SMI, now handle them. */ 684 smi_info->handlers->get_result(smi_info->si_sm, msg, 4); 685 if (msg[2] != 0) { 686 dev_warn_ratelimited(smi_info->io.dev, > 687 "Couldn't get irq info: %x,\n" 688 "Maybe ok, but ipmi might run very slowly.\n" > 689 msg[2]); 690 smi_info->si_state = SI_NORMAL; 691 break; 692 } 693 enables = current_global_enables(smi_info, 0, &irq_on); 694 if (smi_info->io.si_type == SI_BT) 695 /* BT has its own interrupt enable bit. */ 696 check_bt_irq(smi_info, irq_on); 697 if (enables != (msg[3] & GLOBAL_ENABLES_MASK)) { 698 /* Enables are not correct, fix them. */ 699 msg[0] = (IPMI_NETFN_APP_REQUEST << 2); 700 msg[1] = IPMI_SET_BMC_GLOBAL_ENABLES_CMD; 701 msg[2] = enables | (msg[3] & ~GLOBAL_ENABLES_MASK); 702 smi_info->handlers->start_transaction( 703 smi_info->si_sm, msg, 3); 704 smi_info->si_state = SI_SETTING_ENABLES; 705 } else if (smi_info->supports_event_msg_buff) { 706 smi_info->curr_msg = ipmi_alloc_smi_msg(); 707 if (!smi_info->curr_msg) { 708 smi_info->si_state = SI_NORMAL; 709 break; 710 } 711 start_getting_events(smi_info); 712 } else { 713 smi_info->si_state = SI_NORMAL; 714 } 715 break; 716 } 717 718 case SI_SETTING_ENABLES: 719 { 720 unsigned char msg[4]; 721 722 smi_info->handlers->get_result(smi_info->si_sm, msg, 4); 723 if (msg[2] != 0) 724 dev_warn_ratelimited(smi_info->io.dev, 725 "Could not set the global enables: 0x%x.\n", 726 msg[2]); 727 728 if (smi_info->supports_event_msg_buff) { 729 smi_info->curr_msg = ipmi_alloc_smi_msg(); 730 if (!smi_info->curr_msg) { 731 smi_info->si_state = SI_NORMAL; 732 break; 733 } 734 start_getting_events(smi_info); 735 } else { 736 smi_info->si_state = SI_NORMAL; 737 } 738 break; 739 } 740 } 741 } 742 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org