Hi Tom, [auto build test WARNING on net/master] url: https://github.com/0day-ci/linux/commits/Tom-Herbert/net-Allow-flow-dissector-to-handle-non-4-byte-aligned-headers/20160201-053832 config: xtensa-allyesconfig (attached as .config) reproduce: wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree make.cross ARCH=xtensa All warnings (new ones prefixed by >>): In file included from arch/xtensa/include/generated/asm/bug.h:1:0, from include/linux/bug.h:4, from include/linux/thread_info.h:11, from include/asm-generic/preempt.h:4, from arch/xtensa/include/generated/asm/preempt.h:1, from include/linux/preempt.h:59, from include/linux/spinlock.h:50, from include/linux/mm_types.h:8, from include/linux/kmemcheck.h:4, from include/linux/skbuff.h:18, from net/core/flow_dissector.c:2: net/core/flow_dissector.c: In function '__skb_flow_dissect': >> net/core/flow_dissector.c:148:15: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] if (WARN_ON(((u64)data & 0x1))) ^ include/asm-generic/bug.h:86:25: note: in definition of macro 'WARN_ON' int __ret_warn_on = !!(condition); \ ^ vim +148 net/core/flow_dissector.c 1 #include > 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #include 16 #include 17 #include 18 #include 19 #include 20 #include 21 22 static bool dissector_uses_key(const struct flow_dissector *flow_dissector, 23 enum flow_dissector_key_id key_id) 24 { 25 return flow_dissector->used_keys & (1 << key_id); 26 } 27 28 static void dissector_set_key(struct flow_dissector *flow_dissector, 29 enum flow_dissector_key_id key_id) 30 { 31 flow_dissector->used_keys |= (1 << key_id); 32 } 33 34 static void *skb_flow_dissector_target(struct flow_dissector *flow_dissector, 35 enum flow_dissector_key_id key_id, 36 void *target_container) 37 { 38 return ((char *) target_container) + flow_dissector->offset[key_id]; 39 } 40 41 void skb_flow_dissector_init(struct flow_dissector *flow_dissector, 42 const struct flow_dissector_key *key, 43 unsigned int key_count) 44 { 45 unsigned int i; 46 47 memset(flow_dissector, 0, sizeof(*flow_dissector)); 48 49 for (i = 0; i < key_count; i++, key++) { 50 /* User should make sure that every key target offset is withing 51 * boundaries of unsigned short. 52 */ 53 BUG_ON(key->offset > USHRT_MAX); 54 BUG_ON(dissector_uses_key(flow_dissector, 55 key->key_id)); 56 57 dissector_set_key(flow_dissector, key->key_id); 58 flow_dissector->offset[key->key_id] = key->offset; 59 } 60 61 /* Ensure that the dissector always includes control and basic key. 62 * That way we are able to avoid handling lack of these in fast path. 63 */ 64 BUG_ON(!dissector_uses_key(flow_dissector, 65 FLOW_DISSECTOR_KEY_CONTROL)); 66 BUG_ON(!dissector_uses_key(flow_dissector, 67 FLOW_DISSECTOR_KEY_BASIC)); 68 } 69 EXPORT_SYMBOL(skb_flow_dissector_init); 70 71 /** 72 * __skb_flow_get_ports - extract the upper layer ports and return them 73 * @skb: sk_buff to extract the ports from 74 * @thoff: transport header offset 75 * @ip_proto: protocol for which to get port offset 76 * @data: raw buffer pointer to the packet, if NULL use skb->data 77 * @hlen: packet header length, if @data is NULL use skb_headlen(skb) 78 * 79 * The function will try to retrieve the ports at offset thoff + poff where poff 80 * is the protocol port offset returned from proto_ports_offset 81 */ 82 __be32 __skb_flow_get_ports(const struct sk_buff *skb, int thoff, u8 ip_proto, 83 void *data, int hlen) 84 { 85 int poff = proto_ports_offset(ip_proto); 86 87 if (!data) { 88 data = skb->data; 89 hlen = skb_headlen(skb); 90 } 91 92 if (poff >= 0) { 93 __be32 *ports, _ports; 94 95 ports = __skb_header_pointer(skb, thoff + poff, 96 sizeof(_ports), data, hlen, &_ports); 97 if (ports) 98 return get_unaligned_be32(ports); 99 } 100 101 return 0; 102 } 103 EXPORT_SYMBOL(__skb_flow_get_ports); 104 105 /** 106 * __skb_flow_dissect - extract the flow_keys struct and return it 107 * @skb: sk_buff to extract the flow from, can be NULL if the rest are specified 108 * @flow_dissector: list of keys to dissect 109 * @target_container: target structure to put dissected values into 110 * @data: raw buffer pointer to the packet, if NULL use skb->data 111 * @proto: protocol for which to get the flow, if @data is NULL use skb->protocol 112 * @nhoff: network header offset, if @data is NULL use skb_network_offset(skb) 113 * @hlen: packet header length, if @data is NULL use skb_headlen(skb) 114 * 115 * The function will try to retrieve individual keys into target specified 116 * by flow_dissector from either the skbuff or a raw buffer specified by the 117 * rest parameters. 118 * 119 * This function does not assume 4-byte alignment, but it does assume 2-byte 120 * alignment (false is returned for 1-byte alignment). get_unaligned_be32 121 * is called to get thirty-two values out of the packet. 122 * 123 * Caller must take care of zeroing target container memory. 124 */ 125 bool __skb_flow_dissect(const struct sk_buff *skb, 126 struct flow_dissector *flow_dissector, 127 void *target_container, 128 void *data, __be16 proto, int nhoff, int hlen, 129 unsigned int flags) 130 { 131 struct flow_dissector_key_control *key_control; 132 struct flow_dissector_key_basic *key_basic; 133 struct flow_dissector_key_addrs *key_addrs; 134 struct flow_dissector_key_ports *key_ports; 135 struct flow_dissector_key_tags *key_tags; 136 struct flow_dissector_key_keyid *key_keyid; 137 u8 ip_proto = 0; 138 bool ret = false; 139 140 if (!data) { 141 data = skb->data; 142 proto = skb->protocol; 143 nhoff = skb_network_offset(skb); 144 hlen = skb_headlen(skb); 145 } 146 147 #ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS > 148 if (WARN_ON(((u64)data & 0x1))) 149 return false; 150 #endif 151 --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation