块设备调用逻辑(linux 5.4)

这篇具有很好参考价值的文章主要介绍了块设备调用逻辑(linux 5.4)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

[ 2133.109595]  dump_stack+0x6d/0x8b
[ 2133.109596]  _rw_page+0xaf/0xbe [blk]
[ 2133.109597]  mem_blk_submit_bio.cold+0xc2/0x16d [blk]
[ 2133.109598]  generic_make_request+0xcf/0x320
[ 2133.109599]  submit_bio+0x48/0x1d0
[ 2133.109600]  ? bio_add_page+0x6a/0x90
[ 2133.109600]  submit_bh_wbc+0x182/0x1b0
[ 2133.109601]  __block_write_full_page+0x210/0x440
[ 2133.109602]  ? touch_buffer+0x70/0x70
[ 2133.109603]  block_write_full_page+0xb0/0x110
[ 2133.109604]  blkdev_writepage+0x18/0x20
[ 2133.109605]  __writepage+0x1d/0x50
[ 2133.109606]  write_cache_pages+0x1ae/0x4b0
[ 2133.109607]  ? __wb_calc_thresh+0x130/0x130
[ 2133.109608]  ? block_write_end+0x38/0x90
[ 2133.109609]  ? block_write_begin+0x4d/0xf0
[ 2133.109610]  ? balance_dirty_pages_ratelimited+0x259/0x390
[ 2133.109611]  ? generic_perform_write+0x13b/0x1c0
[ 2133.109612]  generic_writepages+0x57/0x90
[ 2133.109613]  blkdev_writepages+0xe/0x10
[ 2133.109614]  do_writepages+0x43/0xd0
[ 2133.109615]  ? blkdev_write_iter+0xcd/0x160
[ 2133.109616]  __filemap_fdatawrite_range+0xd5/0x110
[ 2133.109617]  file_write_and_wait_range+0x74/0xc0
[ 2133.109618]  blkdev_fsync+0x1b/0x50
[ 2133.109619]  vfs_fsync_range+0x49/0x80
[ 2133.109619]  do_fsync+0x3d/0x70
[ 2133.109620]  __x64_sys_fsync+0x14/0x20
[ 2133.109621]  do_syscall_64+0x57/0x190
[ 2133.109622]  entry_SYSCALL_64_after_hwframe+0x5c/0xc1
[ 2133.109623] RIP: 0033:0x7f68ba6bd1a7
[ 2133.109623] Code: 64 89 01 48 83 c8 ff c3 66 2e 0f 1f 84 00 00 00 00 00 90 f3 0f 1e fa 64 8b 04 25 18 00 00 00 85 c0 75 10 b8 4a 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 41 c3 48 83 ec 18 89 7c 24 0c e8 23 f4 f7 ff
[ 2133.109624] RSP: 002b:00007ffe75697478 EFLAGS: 00000246 ORIG_RAX: 000000000000004a
[ 2133.109624] RAX: ffffffffffffffda RBX: 000055a9657ad5b0 RCX: 00007f68ba6bd1a7
[ 2133.109625] RDX: 0000000000000000 RSI: 000055a9657ad5b0 RDI: 0000000000000003
[ 2133.109625] RBP: 0000000000000000 R08: 0000000000000000 R09: 00007f68ba7952f0
[ 2133.109625] R10: 000055a9657a7010 R11: 0000000000000246 R12: 0000000000000000
[ 2133.109626] R13: 0000000000000000 R14: 00007ffe756974f8 R15: 000055a9657ac770

[  282.777255] CPU: 0 PID: 2801 Comm: mount Tainted: G           OE     5.4.233-20230608 #11
[  282.777257] Hardware name: VMware, Inc. VMware20,1/440BX Desktop Reference Platform, BIOS VMW201.00V.20648489.B64.2210180829 10/18/2022
[  282.777258] Call Trace:
[  282.777262]  dump_stack+0x6d/0x8b
[  282.777265]  spu_mem_blk_rw_page+0x48/0x5f [spu_blk]
[  282.777269]  bdev_read_page+0x79/0xa0
[  282.777272]  do_mpage_readpage+0x626/0x810
[  282.777277]  ? lru_cache_add+0xe/0x10
[  282.777280]  mpage_readpages+0xe4/0x1a0
[  282.777284]  ? blkdev_direct_IO+0x4b0/0x4b0
[  282.777288]  blkdev_readpages+0x1d/0x20
[  282.777290]  read_pages+0x71/0x1a0
[  282.777293]  __do_page_cache_readahead+0x12f/0x1a0
[  282.777295]  force_page_cache_readahead+0x98/0x110
[  282.777297]  page_cache_sync_readahead+0xaf/0xc0
[  282.777300]  generic_file_read_iter+0x942/0xda0
[  282.777302]  ? lru_cache_add_active_or_unevictable+0x3a/0xb0
[  282.777304]  blkdev_read_iter+0x4a/0x60
[  282.777307]  new_sync_read+0x122/0x1b0
[  282.777310]  __vfs_read+0x29/0x40
[  282.777312]  vfs_read+0xab/0x160
[  282.777314]  ksys_read+0x67/0xe0
[  282.777317]  __x64_sys_read+0x1a/0x20
[  282.777320]  do_syscall_64+0x57/0x190
[  282.777323]  entry_SYSCALL_64_after_hwframe+0x5c/0xc1
[  282.777324] RIP: 0033:0x7f25b85c0fd2
[  282.777326] Code: c0 e9 c2 fe ff ff 50 48 8d 3d aa cb 0a 00 e8 d5 1a 02 00 0f 1f 44 00 00 f3 0f 1e fa 64 8b 04 25 18 00 00 00 85 c0 75 10 0f 05 <48> 3d 00 f0 ff ff 77 56 c3 0f 1f 44 00 00 48 83 ec 28 48 89 54 24
[  282.777327] RSP: 002b:00007ffd78506a58 EFLAGS: 00000246 ORIG_RAX: 0000000000000000
[  282.777328] RAX: ffffffffffffffda RBX: 00007f25b7f88028 RCX: 00007f25b85c0fd2
[  282.777329] RDX: 0000000000040000 RSI: 00007f25b7f88038 RDI: 0000000000000003
[  282.777330] RBP: 000055cabafa39a0 R08: 00007f25b7f88010 R09: 0000000000000000
[  282.777331] R10: 0000000000000022 R11: 0000000000000246 R12: 000000003ffc0000
[  282.777333] R13: 0000000000040000 R14: 00007f25b7f88010 R15: 000055cabafa39f0
[  282.777429] [spu_mem_blk_rw_page] cpu 0 pid 2801 comm mount             sector 2097032 page_address 0xffff987a23212000 op 0 page_idx 262129


static const struct block_device_operations xblk_fops = {
	.owner = THIS_MODULE,
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 9, 0)
	.submit_bio = mem_blk_submit_bio,
#endif
	.rw_page = mem_blk_rw_page,
};

static int mem_blk_disk_init(void)
{
    int err = 0;
    xblk.file = filp_open( BLK_FILE_PATH, O_RDWR | O_CREAT, 0644);
    if ( IS_ERR(xblk.file) ) {
        pr_err("Failed to open file\n");
        err = PTR_ERR(xblk.file);
        return err;
    }

	xblk_major = register_blkdev(0, "mem_blk");
	if (xblk_major < 0) {
        filp_close( xblk.file, NULL );
		pr_err("register_blkdev returns %d\n", xblk_major);
		return xblk_major;
	}
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 14, 0)
	xblk.mem_blk_disk = blk_alloc_disk(NUMA_NO_NODE);
#else
	xblk.mem_blk_disk = alloc_disk(1);
#endif
	if (xblk.mem_blk_disk == NULL) {
		pr_err("alloc_disk failed.");
        filp_close( xblk.file, NULL );
		return -ENOMEM;
	}
	xblk.mem_blk_disk->major = xblk_major;
	xblk.mem_blk_disk->first_minor = 0;
	xblk.mem_blk_disk->minors = 1;
	xblk.mem_blk_disk->fops = &xblk_fops;
	xblk.mem_blk_disk->private_data = &xblk;
	strlcpy(xblk.mem_blk_disk->disk_name, "mem_blk", 12);
	set_capacity(xblk.mem_blk_disk, g_size_gb * 1024 * 1024 * 2); 
    // g_size_gb is in GB, sector size is 512B

#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 14, 0)
	xblk.mem_blk_disk->queue = xblk.mem_blk_queue;
#endif
	/* align partitions on 4k */
	blk_queue_physical_block_size(xblk.mem_blk_disk->queue, PAGE_SIZE);
	/* Tell the block layer that this is not a rotational device */
	blk_queue_flag_set(QUEUE_FLAG_NONROT, xblk.mem_blk_disk->queue);
	blk_queue_flag_clear(QUEUE_FLAG_ADD_RANDOM, xblk.mem_blk_disk->queue);

	add_disk(xblk.mem_blk_disk);
	return 0;
}
struct bio_vec {
	struct page	*bv_page;  //数据所在的页
	unsigned int	bv_len; //数据长度
	unsigned int	bv_offset;  //数据在页中的偏移
};

struct bvec_iter {
	sector_t		bi_sector;	/* 扇区号*/
	unsigned int		bi_size;	/* 数据段剩余个数*/

	unsigned int		bi_idx;		/* current index into bvl_vec */

	unsigned int            bi_bvec_done;	/* number of bytes completed in
						   current bvec */
};
static blk_qc_t mem_blk_submit_bio(struct request_queue *queue, struct bio *bio)
#endif
{
	sector_t sector = bio->bi_iter.bi_sector;
	struct bio_vec bvec;
	struct bvec_iter iter;

	bio_for_each_segment(bvec, bio, iter) {
		unsigned int len = bvec.bv_len;
		int err;
		// printk("[mem_blk_submit_bio] len %d offset %d sector %lld op %d\n", 
        //                         len, bvec.bv_offset, sector, bio_op(bio));
		if (len != PAGE_SIZE) {
			pr_info("[mem_blk_submit_bio] unexpected page size %d\n", len);
			goto io_error;
		}
		//数据读写操作
		if (err)
			goto io_error;
		sector += len >> SECTOR_SHIFT;
	}
	bio_endio(bio);
	return BLK_QC_T_NONE;
io_error:
	bio_io_error(bio);
	return BLK_QC_T_NONE;
}

文章来源地址https://www.toymoban.com/news/detail-690962.html

到了这里,关于块设备调用逻辑(linux 5.4)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux运维】shell脚本检查服务器内存和CPU利用率

    在管理服务器时候写了一个 shell脚本,在服务上实现每天凌晨3点查系统的指定文件夹下的容量大小,如果超过10G就要删除3天前的内容,还要时刻查询内存和cpu利用率,如果超过80%就要提示用户出现过载 将以上代码保存为一个.sh文件,然后通过crontab在每天凌晨3点运行即可:

    2024年02月09日
    浏览(67)
  • Linux 服务器 CPU 详细信息查看、物理 CPU 以及逻辑 CPU

    什么是CPU CPU: (Central Processing Unit)也称为中央处理器,主要通过内部总线,建立起芯片内各部件之间的信息传输通路 查看CPU详细信息 : 我们平常在操作Linux服务器时,如何能够知道服务器的CPU的详细信息呢 [xxx@xxx ~]#  cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c 16: CPU 核心数 Intel®

    2024年01月25日
    浏览(62)
  • Linux服务器常见运维性能测试(1)综合跑分unixbench、superbench

    最近需要测试一批服务器的相关硬件性能,以及在常规环境下的硬件运行稳定情况,需要持续拷机测试稳定性。所以找了一些测试用例。本次测试包括在服务器的高低温下性能记录及压力测试,高低电压下性能记录及压力测试,常规环境下CPU满载稳定运行的功率记录。 这个系

    2024年02月04日
    浏览(82)
  • Linux本地部署1Panel服务器运维管理面板并实现公网访问

    1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器,包括主机监控、文件管理、数据库管理、容器管理等 下面我们介绍在Linux 本地安装1Panel 并结合cpolar 内网穿透工具实现远程访问1Panel 管理界面 执行如下命令一键安装 1Panel: 安

    2024年02月04日
    浏览(98)
  • [1Panel]开源,现代化,新一代的 Linux 服务器运维管理面板

    本期测评试用一下1Panel这款面板。1Panel是国内飞致云旗下开源产品。整个界面简洁清爽,后端使用GO开发,前端使用VUE的Element-Plus作为UI框架,整个面板的管理都是基于docker的,想法很先进。官方还提供了视频的使用教程,本期为大家按照本专栏的基本内容进行多方面的测评。

    2024年02月07日
    浏览(94)
  • Linux服务器常见运维性能测试(3)CPU测试super_pi、sysbench

    最近需要测试一批服务器的相关硬件性能,以及在常规环境下的硬件运行稳定情况,需要持续拷机测试稳定性。所以找了一些测试用例。本次测试包括在服务器的高低温下性能记录及压力测试,高低电压下性能记录及压力测试,常规环境下CPU满载稳定运行的功率记录。 这个系

    2024年02月02日
    浏览(55)
  • 华为云云耀云服务器L实例评测 | Linux系统宝塔运维部署H5游戏

    本章节内容,我们主要介绍华为云耀服务器L实例,从云服务的优势讲起,然后讲解华为云耀服务器L实例资源面板如何操作,如何使用宝塔运维服务,如何使用运维工具可视化安装nginx,最后部署一个自研的H5的小游戏(6岁的小朋友玩的很开心😁)。 前端的同学如果想把自己

    2024年02月07日
    浏览(58)
  • Linux设备配置DNS服务器,实现正向解析和反向解析,实现DNS主从服务器同步,实现批量域名正/反向解析

    本文基于Linux上CentOS 7版本配合bind(named)服务进行演示 目录 一.DNS域名服务器原理及作用等介绍 1.DNS简介:  2.原理简单介绍 3.常见域名后缀 4.DNS域名服务器类型 5.DNS服务器的对应关系查询方式 6.具体解析过程 二.bind(named)服务配置文件介绍 1.主配置文件在/etc/named.conf 2.数

    2024年02月08日
    浏览(42)
  • 网络设备中VRRP协议和Linux服务器中keepalived的两个区别

    VRRP全称是Virtual Router Redundancy Protocol,即虚拟路由冗余协议。它的主要目的是在一个网络中提供冗余的路由。当一个三层网络设备或服务器出现故障时,VRRP可以确保网络仍能正常工作。VRRP通过在这些设备之间使用IP组播或单播通信来实现冗余。它可以确保在网络中有多个物理

    2024年02月02日
    浏览(45)
  • Ubuntu是一种现代化的开源Linux操作系统,适用于企业服务器、桌面电脑、云和IoT物联网设备

    Ubuntu是一种现代化的开源Linux操作系统,适用于企业服务器、桌面电脑、云和IoT物联网设备。您可以从Ubuntu官网下载Ubuntu桌面版、Ubuntu服务器版、Ubuntu for Raspberry Pi和IoT设备版、Ubuntu Core以及所有Ubuntu版本。 Ubuntu是一种现代化的开源Linux操作系统,它适用于广泛的设备和应用场

    2024年01月16日
    浏览(72)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包