Re: [PATCH 06/12] xen-blkfront: add callbacks for PM suspend and hibernation
From: kbuild test robot
Date: Wed May 20 2020 - 01:05:42 EST
Hi Anchal,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on linus/master]
[also build test ERROR on v5.7-rc6]
[cannot apply to xen-tip/linux-next tip/irq/core tip/auto-latest next-20200519]
[if your patch is applied to the wrong git tree, please drop us a note to help
improve the system. BTW, we also suggest to use '--base' option to specify the
base tree in git format-patch, please see https://stackoverflow.com/a/37406982]
url: https://github.com/0day-ci/linux/commits/Anchal-Agarwal/Fix-PM-hibernation-in-Xen-guests/20200520-073211
base: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 03fb3acae4be8a6b680ffedb220a8b6c07260b40
config: x86_64-randconfig-a016-20200519 (attached as .config)
compiler: clang version 11.0.0 (https://github.com/llvm/llvm-project e6658079aca6d971b4e9d7137a3a2ecbc9c34aec)
reproduce:
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
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=x86_64
If you fix the issue, kindly add following tag as appropriate
Reported-by: kbuild test robot <lkp@xxxxxxxxx>
All error/warnings (new ones prefixed by >>, old ones prefixed by <<):
>> drivers/block/xen-blkfront.c:2699:30: warning: missing terminating '"' character [-Winvalid-pp-token]
xenbus_dev_error(dev, err, "Hibernation Failed.
^
>> drivers/block/xen-blkfront.c:2699:30: error: expected expression
drivers/block/xen-blkfront.c:2700:26: warning: missing terminating '"' character [-Winvalid-pp-token]
The ring is still busy");
^
>> drivers/block/xen-blkfront.c:2726:1: error: function definition is not allowed here
{
^
>> drivers/block/xen-blkfront.c:2762:10: error: use of undeclared identifier 'blkfront_restore'
.thaw = blkfront_restore,
^
drivers/block/xen-blkfront.c:2763:13: error: use of undeclared identifier 'blkfront_restore'
.restore = blkfront_restore
^
drivers/block/xen-blkfront.c:2767:1: error: function definition is not allowed here
{
^
drivers/block/xen-blkfront.c:2800:1: error: function definition is not allowed here
{
^
drivers/block/xen-blkfront.c:2822:1: error: function definition is not allowed here
{
^
>> drivers/block/xen-blkfront.c:2863:13: error: use of undeclared identifier 'xlblk_init'
module_init(xlblk_init);
^
drivers/block/xen-blkfront.c:2867:1: error: function definition is not allowed here
{
^
>> drivers/block/xen-blkfront.c:2874:13: error: use of undeclared identifier 'xlblk_exit'
module_exit(xlblk_exit);
^
>> drivers/block/xen-blkfront.c:2880:24: error: expected '}'
MODULE_ALIAS("xenblk");
^
drivers/block/xen-blkfront.c:2674:1: note: to match this '{'
{
^
>> drivers/block/xen-blkfront.c:2738:45: warning: ISO C90 forbids mixing declarations and code [-Wdeclaration-after-statement]
static const struct block_device_operations xlvbd_block_fops =
^
3 warnings and 11 errors generated.
vim +2699 drivers/block/xen-blkfront.c
2672
2673 static int blkfront_freeze(struct xenbus_device *dev)
2674 {
2675 unsigned int i;
2676 struct blkfront_info *info = dev_get_drvdata(&dev->dev);
2677 struct blkfront_ring_info *rinfo;
2678 /* This would be reasonable timeout as used in xenbus_dev_shutdown() */
2679 unsigned int timeout = 5 * HZ;
2680 unsigned long flags;
2681 int err = 0;
2682
2683 info->connected = BLKIF_STATE_FREEZING;
2684
2685 blk_mq_freeze_queue(info->rq);
2686 blk_mq_quiesce_queue(info->rq);
2687
2688 for_each_rinfo(info, rinfo, i) {
2689 /* No more gnttab callback work. */
2690 gnttab_cancel_free_callback(&rinfo->callback);
2691 /* Flush gnttab callback work. Must be done with no locks held. */
2692 flush_work(&rinfo->work);
2693 }
2694
2695 for_each_rinfo(info, rinfo, i) {
2696 spin_lock_irqsave(&rinfo->ring_lock, flags);
2697 if (RING_FULL(&rinfo->ring)
2698 || RING_HAS_UNCONSUMED_RESPONSES(&rinfo->ring)) {
> 2699 xenbus_dev_error(dev, err, "Hibernation Failed.
2700 The ring is still busy");
2701 info->connected = BLKIF_STATE_CONNECTED;
2702 spin_unlock_irqrestore(&rinfo->ring_lock, flags);
2703 return -EBUSY;
2704 }
2705 spin_unlock_irqrestore(&rinfo->ring_lock, flags);
2706 }
2707 /* Kick the backend to disconnect */
2708 xenbus_switch_state(dev, XenbusStateClosing);
2709
2710 /*
2711 * We don't want to move forward before the frontend is diconnected
2712 * from the backend cleanly.
2713 */
2714 timeout = wait_for_completion_timeout(&info->wait_backend_disconnected,
2715 timeout);
2716 if (!timeout) {
2717 err = -EBUSY;
2718 xenbus_dev_error(dev, err, "Freezing timed out;"
2719 "the device may become inconsistent state");
2720 }
2721
2722 return err;
2723 }
2724
2725 static int blkfront_restore(struct xenbus_device *dev)
> 2726 {
2727 struct blkfront_info *info = dev_get_drvdata(&dev->dev);
2728 int err = 0;
2729
2730 err = talk_to_blkback(dev, info);
2731 blk_mq_unquiesce_queue(info->rq);
2732 blk_mq_unfreeze_queue(info->rq);
2733 if (!err)
2734 blk_mq_update_nr_hw_queues(&info->tag_set, info->nr_rings);
2735 return err;
2736 }
2737
> 2738 static const struct block_device_operations xlvbd_block_fops =
2739 {
2740 .owner = THIS_MODULE,
2741 .open = blkif_open,
2742 .release = blkif_release,
2743 .getgeo = blkif_getgeo,
2744 .ioctl = blkif_ioctl,
2745 .compat_ioctl = blkdev_compat_ptr_ioctl,
2746 };
2747
2748
2749 static const struct xenbus_device_id blkfront_ids[] = {
2750 { "vbd" },
2751 { "" }
2752 };
2753
2754 static struct xenbus_driver blkfront_driver = {
2755 .ids = blkfront_ids,
2756 .probe = blkfront_probe,
2757 .remove = blkfront_remove,
2758 .resume = blkfront_resume,
2759 .otherend_changed = blkback_changed,
2760 .is_ready = blkfront_is_ready,
2761 .freeze = blkfront_freeze,
> 2762 .thaw = blkfront_restore,
2763 .restore = blkfront_restore
2764 };
2765
2766 static void purge_persistent_grants(struct blkfront_info *info)
> 2767 {
2768 unsigned int i;
2769 unsigned long flags;
2770 struct blkfront_ring_info *rinfo;
2771
2772 for_each_rinfo(info, rinfo, i) {
2773 struct grant *gnt_list_entry, *tmp;
2774
2775 spin_lock_irqsave(&rinfo->ring_lock, flags);
2776
2777 if (rinfo->persistent_gnts_c == 0) {
2778 spin_unlock_irqrestore(&rinfo->ring_lock, flags);
2779 continue;
2780 }
2781
2782 list_for_each_entry_safe(gnt_list_entry, tmp, &rinfo->grants,
2783 node) {
2784 if (gnt_list_entry->gref == GRANT_INVALID_REF ||
2785 gnttab_query_foreign_access(gnt_list_entry->gref))
2786 continue;
2787
2788 list_del(&gnt_list_entry->node);
2789 gnttab_end_foreign_access(gnt_list_entry->gref, 0, 0UL);
2790 rinfo->persistent_gnts_c--;
2791 gnt_list_entry->gref = GRANT_INVALID_REF;
2792 list_add_tail(&gnt_list_entry->node, &rinfo->grants);
2793 }
2794
2795 spin_unlock_irqrestore(&rinfo->ring_lock, flags);
2796 }
2797 }
2798
2799 static void blkfront_delay_work(struct work_struct *work)
2800 {
2801 struct blkfront_info *info;
2802 bool need_schedule_work = false;
2803
2804 mutex_lock(&blkfront_mutex);
2805
2806 list_for_each_entry(info, &info_list, info_list) {
2807 if (info->feature_persistent) {
2808 need_schedule_work = true;
2809 mutex_lock(&info->mutex);
2810 purge_persistent_grants(info);
2811 mutex_unlock(&info->mutex);
2812 }
2813 }
2814
2815 if (need_schedule_work)
2816 schedule_delayed_work(&blkfront_work, HZ * 10);
2817
2818 mutex_unlock(&blkfront_mutex);
2819 }
2820
2821 static int __init xlblk_init(void)
> 2822 {
2823 int ret;
2824 int nr_cpus = num_online_cpus();
2825
2826 if (!xen_domain())
2827 return -ENODEV;
2828
2829 if (!xen_has_pv_disk_devices())
2830 return -ENODEV;
2831
2832 if (register_blkdev(XENVBD_MAJOR, DEV_NAME)) {
2833 pr_warn("xen_blk: can't get major %d with name %s\n",
2834 XENVBD_MAJOR, DEV_NAME);
2835 return -ENODEV;
2836 }
2837
2838 if (xen_blkif_max_segments < BLKIF_MAX_SEGMENTS_PER_REQUEST)
2839 xen_blkif_max_segments = BLKIF_MAX_SEGMENTS_PER_REQUEST;
2840
2841 if (xen_blkif_max_ring_order > XENBUS_MAX_RING_GRANT_ORDER) {
2842 pr_info("Invalid max_ring_order (%d), will use default max: %d.\n",
2843 xen_blkif_max_ring_order, XENBUS_MAX_RING_GRANT_ORDER);
2844 xen_blkif_max_ring_order = XENBUS_MAX_RING_GRANT_ORDER;
2845 }
2846
2847 if (xen_blkif_max_queues > nr_cpus) {
2848 pr_info("Invalid max_queues (%d), will use default max: %d.\n",
2849 xen_blkif_max_queues, nr_cpus);
2850 xen_blkif_max_queues = nr_cpus;
2851 }
2852
2853 INIT_DELAYED_WORK(&blkfront_work, blkfront_delay_work);
2854
2855 ret = xenbus_register_frontend(&blkfront_driver);
2856 if (ret) {
2857 unregister_blkdev(XENVBD_MAJOR, DEV_NAME);
2858 return ret;
2859 }
2860
2861 return 0;
2862 }
> 2863 module_init(xlblk_init);
2864
2865
2866 static void __exit xlblk_exit(void)
2867 {
2868 cancel_delayed_work_sync(&blkfront_work);
2869
2870 xenbus_unregister_driver(&blkfront_driver);
2871 unregister_blkdev(XENVBD_MAJOR, DEV_NAME);
2872 kfree(minors);
2873 }
> 2874 module_exit(xlblk_exit);
2875
2876 MODULE_DESCRIPTION("Xen virtual block device frontend");
2877 MODULE_LICENSE("GPL");
2878 MODULE_ALIAS_BLOCKDEV_MAJOR(XENVBD_MAJOR);
2879 MODULE_ALIAS("xen:vbd");
> 2880 MODULE_ALIAS("xenblk");
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@xxxxxxxxxxxx
Attachment:
.config.gz
Description: application/gzip