Opcode OPC_MeshInterface

部署运行你感兴趣的模型镜像
udword MeshInterface::CheckTopology()	const
{
	// Check topology. If the model contains degenerate faces, collision report can be wrong in some cases.
	// e.g. it happens with the standard MAX teapot. So clean your meshes first... If you don't have a mesh cleaner
	// you can try this: www.codercorner.com/Consolidation.zip

	udword NbDegenerate = 0;

	VertexPointers VP;

	// Using callbacks, we don't have access to vertex indices. Nevertheless we still can check for
	// redundant vertex pointers, which cover all possibilities (callbacks/pointers/strides).
	for(udword i=0;i<mNbTris;i++)
	{
		GetTriangle(VP, i);

		if(		(VP.Vertex[0]==VP.Vertex[1])
			||	(VP.Vertex[1]==VP.Vertex[2])
			||	(VP.Vertex[2]==VP.Vertex[0]))	NbDegenerate++;
	}

	return NbDegenerate;
}


判断三角形的退化个数。

但是有一个缺点,应为它是按照顶点的索引号来进行判断。

所以我们必须对网格数据进行预处理,转化为类off格式的内部数据结构。

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

/* * Vhost-user RDMA device : init and packets forwarding * * Copyright (C) 2025 KylinSoft Inc. and/or its affiliates. All rights reserved. * * Author: Xiong Weimin <xiongweimin@kylinos.cn> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. */ #ifndef __VHOST_RDMA_PKT_H__ #define __VHOST_RDMA_PKT_H__ #include <stdint.h> #include <rte_byteorder.h> #ifndef BIT #define BIT(x) (1 << (x)) #endif #define WR_MAX_QPT (8) #define OPCODE_NONE (-1) #define VHOST_NUM_OPCODE 256 enum vhost_rdma_wr_mask { WR_INLINE_MASK = BIT(0), WR_ATOMIC_MASK = BIT(1), WR_SEND_MASK = BIT(2), WR_READ_MASK = BIT(3), WR_WRITE_MASK = BIT(4), WR_LOCAL_OP_MASK = BIT(5), WR_READ_OR_WRITE_MASK = WR_READ_MASK | WR_WRITE_MASK, WR_READ_WRITE_OR_SEND_MASK = WR_READ_OR_WRITE_MASK | WR_SEND_MASK, WR_WRITE_OR_SEND_MASK = WR_WRITE_MASK | WR_SEND_MASK, WR_ATOMIC_OR_READ_MASK = WR_ATOMIC_MASK | WR_READ_MASK, }; struct vhost_rdma_wr_opcode_info { const char *name; enum vhost_rdma_wr_mask mask[WR_MAX_QPT]; }; extern struct vhost_rdma_wr_opcode_info vhost_rdma_wr_opcode_info[]; enum vhost_rdma_hdr_type { VHOST_RDMA_LRH, VHOST_RDMA_GRH, VHOST_RDMA_BTH, VHOST_RDMA_RETH, VHOST_RDMA_AETH, VHOST_RDMA_ATMETH, VHOST_RDMA_ATMACK, VHOST_RDMA_IETH, VHOST_RDMA_RDETH, VHOST_RDMA_DETH, VHOST_RDMA_IMMDT, VHOST_RDMA_PAYLOAD, NUM_HDR_TYPES }; enum vhost_rdma_hdr_mask { VHOST_LRH_MASK = BIT(VHOST_RDMA_LRH), VHOST_GRH_MASK = BIT(VHOST_RDMA_GRH), VHOST_BTH_MASK = BIT(VHOST_RDMA_BTH), VHOST_IMMDT_MASK = BIT(VHOST_RDMA_IMMDT), VHOST_RETH_MASK = BIT(VHOST_RDMA_RETH), VHOST_AETH_MASK = BIT(VHOST_RDMA_AETH), VHOST_ATMETH_MASK = BIT(VHOST_RDMA_ATMETH), VHOST_ATMACK_MASK = BIT(VHOST_RDMA_ATMACK), VHOST_IETH_MASK = BIT(VHOST_RDMA_IETH), VHOST_RDETH_MASK = BIT(VHOST_RDMA_RDETH), VHOST_DETH_MASK = BIT(VHOST_RDMA_DETH), VHOST_PAYLOAD_MASK = BIT(VHOST_RDMA_PAYLOAD), VHOST_REQ_MASK = BIT(NUM_HDR_TYPES + 0), VHOST_ACK_MASK = BIT(NUM_HDR_TYPES + 1), VHOST_SEND_MASK = BIT(NUM_HDR_TYPES + 2), VHOST_WRITE_MASK = BIT(NUM_HDR_TYPES + 3), VHOST_READ_MASK = BIT(NUM_HDR_TYPES + 4), VHOST_ATOMIC_MASK = BIT(NUM_HDR_TYPES + 5), VHOST_RWR_MASK = BIT(NUM_HDR_TYPES + 6), VHOST_COMP_MASK = BIT(NUM_HDR_TYPES + 7), VHOST_START_MASK = BIT(NUM_HDR_TYPES + 8), VHOST_MIDDLE_MASK = BIT(NUM_HDR_TYPES + 9), VHOST_END_MASK = BIT(NUM_HDR_TYPES + 10), VHOST_LOOPBACK_MASK = BIT(NUM_HDR_TYPES + 12), VHOST_READ_OR_ATOMIC = (VHOST_READ_MASK | VHOST_ATOMIC_MASK), VHOST_WRITE_OR_SEND = (VHOST_WRITE_MASK | VHOST_SEND_MASK), }; struct vhost_rdma_opcode_info { const char *name; int length; int offset[NUM_HDR_TYPES]; enum vhost_rdma_hdr_mask mask; }; extern struct vhost_rdma_opcode_info vhost_rdma_opcode[VHOST_NUM_OPCODE]; #define IB_OPCODE(transport, op) \ IB_OPCODE_ ## transport ## _ ## op = \ IB_OPCODE_ ## transport + IB_OPCODE_ ## op enum { /* transport types -- just used to define real constants */ IB_OPCODE_RC = 0x00, IB_OPCODE_UC = 0x20, IB_OPCODE_RD = 0x40, IB_OPCODE_UD = 0x60, /* per IBTA 1.3 vol 1 Table 38, A10.3.2 */ IB_OPCODE_CNP = 0x80, /* Manufacturer specific */ IB_OPCODE_MSP = 0xe0, /* operations -- just used to define real constants */ IB_OPCODE_SEND_FIRST = 0x00, IB_OPCODE_SEND_MIDDLE = 0x01, IB_OPCODE_SEND_LAST = 0x02, IB_OPCODE_SEND_LAST_WITH_IMMEDIATE = 0x03, IB_OPCODE_SEND_ONLY = 0x04, IB_OPCODE_SEND_ONLY_WITH_IMMEDIATE = 0x05, IB_OPCODE_RDMA_WRITE_FIRST = 0x06, IB_OPCODE_RDMA_WRITE_MIDDLE = 0x07, IB_OPCODE_RDMA_WRITE_LAST = 0x08, IB_OPCODE_RDMA_WRITE_LAST_WITH_IMMEDIATE = 0x09, IB_OPCODE_RDMA_WRITE_ONLY = 0x0a, IB_OPCODE_RDMA_WRITE_ONLY_WITH_IMMEDIATE = 0x0b, IB_OPCODE_RDMA_READ_REQUEST = 0x0c, IB_OPCODE_RDMA_READ_RESPONSE_FIRST = 0x0d, IB_OPCODE_RDMA_READ_RESPONSE_MIDDLE = 0x0e, IB_OPCODE_RDMA_READ_RESPONSE_LAST = 0x0f, IB_OPCODE_RDMA_READ_RESPONSE_ONLY = 0x10, IB_OPCODE_ACKNOWLEDGE = 0x11, IB_OPCODE_ATOMIC_ACKNOWLEDGE = 0x12, IB_OPCODE_COMPARE_SWAP = 0x13, IB_OPCODE_FETCH_ADD = 0x14, /* opcode 0x15 is reserved */ IB_OPCODE_SEND_LAST_WITH_INVALIDATE = 0x16, IB_OPCODE_SEND_ONLY_WITH_INVALIDATE = 0x17, /* real constants follow -- see comment about above IB_OPCODE() macro for more details */ /* RC */ IB_OPCODE(RC, SEND_FIRST), IB_OPCODE(RC, SEND_MIDDLE), IB_OPCODE(RC, SEND_LAST), IB_OPCODE(RC, SEND_LAST_WITH_IMMEDIATE), IB_OPCODE(RC, SEND_ONLY), IB_OPCODE(RC, SEND_ONLY_WITH_IMMEDIATE), IB_OPCODE(RC, RDMA_WRITE_FIRST), IB_OPCODE(RC, RDMA_WRITE_MIDDLE), IB_OPCODE(RC, RDMA_WRITE_LAST), IB_OPCODE(RC, RDMA_WRITE_LAST_WITH_IMMEDIATE), IB_OPCODE(RC, RDMA_WRITE_ONLY), IB_OPCODE(RC, RDMA_WRITE_ONLY_WITH_IMMEDIATE), IB_OPCODE(RC, RDMA_READ_REQUEST), IB_OPCODE(RC, RDMA_READ_RESPONSE_FIRST), IB_OPCODE(RC, RDMA_READ_RESPONSE_MIDDLE), IB_OPCODE(RC, RDMA_READ_RESPONSE_LAST), IB_OPCODE(RC, RDMA_READ_RESPONSE_ONLY), IB_OPCODE(RC, ACKNOWLEDGE), IB_OPCODE(RC, ATOMIC_ACKNOWLEDGE), IB_OPCODE(RC, COMPARE_SWAP), IB_OPCODE(RC, FETCH_ADD), IB_OPCODE(RC, SEND_LAST_WITH_INVALIDATE), IB_OPCODE(RC, SEND_ONLY_WITH_INVALIDATE), /* UC */ IB_OPCODE(UC, SEND_FIRST), IB_OPCODE(UC, SEND_MIDDLE), IB_OPCODE(UC, SEND_LAST), IB_OPCODE(UC, SEND_LAST_WITH_IMMEDIATE), IB_OPCODE(UC, SEND_ONLY), IB_OPCODE(UC, SEND_ONLY_WITH_IMMEDIATE), IB_OPCODE(UC, RDMA_WRITE_FIRST), IB_OPCODE(UC, RDMA_WRITE_MIDDLE), IB_OPCODE(UC, RDMA_WRITE_LAST), IB_OPCODE(UC, RDMA_WRITE_LAST_WITH_IMMEDIATE), IB_OPCODE(UC, RDMA_WRITE_ONLY), IB_OPCODE(UC, RDMA_WRITE_ONLY_WITH_IMMEDIATE), /* RD */ IB_OPCODE(RD, SEND_FIRST), IB_OPCODE(RD, SEND_MIDDLE), IB_OPCODE(RD, SEND_LAST), IB_OPCODE(RD, SEND_LAST_WITH_IMMEDIATE), IB_OPCODE(RD, SEND_ONLY), IB_OPCODE(RD, SEND_ONLY_WITH_IMMEDIATE), IB_OPCODE(RD, RDMA_WRITE_FIRST), IB_OPCODE(RD, RDMA_WRITE_MIDDLE), IB_OPCODE(RD, RDMA_WRITE_LAST), IB_OPCODE(RD, RDMA_WRITE_LAST_WITH_IMMEDIATE), IB_OPCODE(RD, RDMA_WRITE_ONLY), IB_OPCODE(RD, RDMA_WRITE_ONLY_WITH_IMMEDIATE), IB_OPCODE(RD, RDMA_READ_REQUEST), IB_OPCODE(RD, RDMA_READ_RESPONSE_FIRST), IB_OPCODE(RD, RDMA_READ_RESPONSE_MIDDLE), IB_OPCODE(RD, RDMA_READ_RESPONSE_LAST), IB_OPCODE(RD, RDMA_READ_RESPONSE_ONLY), IB_OPCODE(RD, ACKNOWLEDGE), IB_OPCODE(RD, ATOMIC_ACKNOWLEDGE), IB_OPCODE(RD, COMPARE_SWAP), IB_OPCODE(RD, FETCH_ADD), /* UD */ IB_OPCODE(UD, SEND_ONLY), IB_OPCODE(UD, SEND_ONLY_WITH_IMMEDIATE) }; struct vhost_rdma_pkt_info { struct vhost_rdma_dev *dev; /* device that owns packet */ struct vhost_rdma_qp *qp; /* qp that owns packet */ struct vhost_rdma_send_wqe *wqe; /* send wqe */ uint8_t *hdr; /* points to bth */ uint32_t mask; /* useful info about pkt */ uint32_t psn; /* bth psn of packet */ uint16_t pkey_index; /* partition of pkt */ uint16_t paylen; /* length of bth - icrc */ uint8_t port_num; /* port pkt received on */ uint8_t opcode; /* bth opcode of packet */ }; #endif 同上
最新发布
10-10
<think>嗯,用户遇到了一个相当专业的SCSI错误"unsupportedscsiopcodecheck_condition",这通常发生在存储设备通信过程中。用户明确要求解决方案,看来ta可能是个系统管理员或IT支持人员,正在处理服务器或存储阵列的故障。从技术深度来看,这个错误涉及SCSI协议层,需要分层次排查。首先想到几个关键方向:物理连接问题是最常见的诱因,比如损坏的光纤线或松动的SAS接头;其次是固件/驱动不兼容,特别是企业级存储设备对驱动版本很敏感;最后也不能排除存储设备本身故障。用户没有提供环境细节,但根据错误代码特征,大概率出现在以下场景:虚拟化环境(如VMwareESXi连接SAN)、物理服务器(特别是使用HBA卡的情况)、或者NAS/SAN存储阵列。需要特别注意HPProLiant服务器的引用[2]提示——这类设备对SCSI操作码有特定要求。解决方案应该按难易程度排序:先检查物理层(线缆、LED状态),这是最快能排除的;再验证驱动和固件版本,尤其是当设备品牌混用时;最后才考虑硬件诊断。特别要提醒用户备份重要数据,因为持续的SCSI错误可能导致数据损坏。考虑到用户可能急需解决生产环境问题,在回答中需要强调几个紧急处理步骤:立即检查存储日志、隔离故障设备、暂停可能的数据写入操作。对于更深层的故障定位,比如解读SCSI感知码,可能需要专业存储厂商支持。相关问题的设计要覆盖延伸场景:NVMe设备是否会出现类似错误?虚拟化环境有何特殊处理?这些都能帮助用户建立系统化的排查思路。最后补充HP服务器的参考很必要,因为用户引用中提到了ProLiant,可能暗示当前环境。</think>针对"unsupported scsi opcode check_condition"错误,这是SCSI设备通信中的关键错误,需按以下步骤排查: --- ### **错误原因分析** 1. **物理连接故障** - 损坏/松动的线缆(SAS/SATA/光纤) - HBA(主机总线适配器)或RAID卡接口接触不良 - 存储设备(硬盘/SSD)背板供电不稳 2. **驱动与固件问题** - HBA/RAID卡驱动过期或不兼容 - 存储设备固件存在缺陷(常见于企业级SSD) - 操作系统内核SCSI模块异常 3. **硬件故障** - 存储介质坏道或控制器故障 - HBA/RAID卡电子元件损坏 - SCSI终结器配置错误(旧式SCSI链) 4. **配置与协议冲突** - 存储阵列LUN映射错误 - SCSI操作码不被设备支持(如尝试NVMe命令操作SCSI设备) - 多路径软件(如Linux DM-MPIO)配置冲突 --- ### **解决方案步骤** #### **第一阶段:基础检查** 1. **物理层诊断** ```bash # Linux查看SCSI设备状态 dmesg | grep -i "scsi\|sense" cat /proc/scsi/scsi ``` - 重新插拔线缆,更换备用端口 - 观察设备LED状态:闪烁异常需立即更换 2. **更新固件与驱动** - 下载**设备厂商官方**最新固件(如Broadcom/QLogic HBA卡) - 更新操作系统驱动: ```bash # Ubuntu更新驱动 sudo apt update && sudo apt install --reinstall scsi-modules ``` #### **第二阶段:高级诊断** 3. **解析SCSI感知数据** 使用`sg_logs`工具获取详细错误码: ```bash # 安装工具 sudo apt install sg3-utils # 获取设备感知信息(替换sdb为实际设备) sg_logs -a /dev/sdb ``` - **关键代码解读**: - `0x02/0x04/0x08`:硬件故障 - `0x03/0x0b`:固件/配置错误 - `0x05/0x14`:非法SCSI指令 4. **协议层测试** 使用`sg_vpd`验证设备支持的操作码: ```bash sg_vpd -p opcodes /dev/sdb ``` - 检查输出是否包含报错中的操作码 #### **第三阶段:硬件隔离** 5. **交叉测试** - 将设备移至另一台服务器测试 - 更换HBA/RAID卡测试端口 - 使用`badblocks`检测介质损坏: ```bash sudo badblocks -sv /dev/sdb ``` --- ### **企业级场景特殊处理** - **虚拟化环境**(VMware/Hyper-V): 禁用VMkernel的SCSI过滤模块(如`vmw_ahci`),检查存储策略兼容性 - **SAN存储**: 在存储阵列侧检查LUN屏蔽(LUN Masking)和主机组配置 - **多路径环境**: 临时停用多路径软件,直连单一路径测试 > **紧急措施**:若出现**Check Condition**伴随`I/O error`,立即停止写入操作,防止数据损坏! --- ### **典型故障案例参考** 1. **案例1**:某HP DL380服务器因RAID卡固件Bug导致相同报错 - **解决方案**:升级HPE SSA(Smart Storage Administrator)至最新版[^2] 2. **案例2**:Linux 5.10内核与LSI 9300 HBA驱动冲突 - **解决方案**:降级至`mpt3sas`驱动v2.62或打内核补丁 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值