#ifndef __ASM_L_IOLINKMASK_H #define __ASM_L_IOLINKMASK_H /* * Based on include/linux/nodemask.h * IOLINKmasks provide a bitmap suitable for representing the * set of IOLINK's in a system, one bit position per IOLINK domain number. * * IOLINK can be represented by global domain number and as * pair: node and local link number on the node, * So main macroses and functions operate with domain number and * can have appropriate macroses to operate with pair of node and link #, * for axample: * iolink_set(domain, ...) * node_iolink_set(node, link, ...) * * IOLINK is common name of IO management and can be connected to IOHUB * (controller of peripheral interfaces) or RDMA (DMA with remoute systems) * So macroses have alternative to operate with IOLINKS as IOHUBs and RDMAs, * for example: * iolink_set(...) * iohub_set(...) * rdma_set(...) * * See detailed comments in the file linux/bitmap.h describing the * data type on which these iolinkmasks are based. * * For details of iolinkmask_scnprintf() and iolinkmask_parse(), * see bitmap_scnprintf() and bitmap_parse() in lib/bitmap.c. * For details of iolinklist_scnprintf() and iolinklist_parse(), see * bitmap_scnlistprintf() and bitmap_parselist(), also in bitmap.c. * * The available iolinkmask operations are: * * void iolink_set(iolink, mask) turn on bit 'iolink' in mask * void iolink_clear(iolink, mask) turn off bit 'iolink' in mask * void iolinks_setall(mask) set all bits * void iolinks_clear(mask) clear all bits * int iolink_isset(iolink, mask) true iff bit 'iolink' set in mask * int iolink_test_and_set(iolink, mask) test and set bit 'iolink' in mask * * void iolinks_and(dst, src1, src2) dst = src1 & src2 [intersection] * void iolinks_or(dst, src1, src2) dst = src1 | src2 [union] * void iolinks_xor(dst, src1, src2) dst = src1 ^ src2 * void iolinks_andnot(dst, src1, src2) dst = src1 & ~src2 * void iolinks_complement(dst, src) dst = ~src * * int iolinks_equal(mask1, mask2) Does mask1 == mask2? * int iolinks_intersects(mask1, mask2) Do mask1 and mask2 intersect? * int iolinks_subset(mask1, mask2) Is mask1 a subset of mask2? * int iolinks_empty(mask) Is mask empty (no bits sets)? * int iolinks_full(mask) Is mask full (all bits sets)? * int iolinks_weight(mask) Hamming weight - number of set bits * * void iolinks_shift_right(dst, src, n) Shift right * void iolinks_shift_left(dst, src, n) Shift left * * int first_iolink(mask) Number lowest set bit, or MAX_NUMIOLINKS * int next_iolink(iolink, mask) Next iolink past 'iolink', or MAX_NUMIOLINKS * int first_unset_iolink(mask) First iolink not set in mask, or * MAX_NUMIOLINKS. * * iolinkmask_t iolinkmask_of_iolink(iolink) Return iolinkmask with bit 'iolink' set * IOLINK_MASK_ALL Initializer - all bits set * IOLINK_MASK_NONE Initializer - no bits set * unsigned long *iolinks_addr(mask) Array of unsigned long's in mask * * int iolinkmask_scnprintf(buf, len, mask) Format iolinkmask for printing * int iolinkmask_parse(ubuf, ulen, mask) Parse ascii string as iolinkmask * int iolinklist_scnprintf(buf, len, mask) Format iolinkmask as list for printing * int iolinklist_parse(buf, map) Parse ascii string as iolinklist * * for_each_iolink_mask(iolink, mask) for-loop iolink over mask * * int num_online_iolinks() Number of online IOLINKs * int num_possible_iolinks() Number of all possible IOLINKs * * int iolink_online(iolink) Is some iolink domain online? * int iolink_possible(iolink) Is some iolink domain possible? * * iolink_set_online(iolink) set bit 'iolink' in iolink_online_map * iolink_set_offline(iolink) clear bit 'iolink' in iolink_online_map * * for_each_iolink(iolink) for-loop iolink over iolink_possible_map * for_each_online_iolink(iolink) for-loop iolink over iolink_online_map * * Subtlety: * 1) The 'type-checked' form of iolink_isset() causes gcc (3.3.2, anyway) * to generate slightly worse code. So use a simple one-line #define * for iolink_isset(), instead of wrapping an inline inside a macro, the * way we do the other calls. */ #include #include #include #include #include #include #define MAX_NUMIOLINKS MACH_MAX_NUMIOLINKS #define MAX_NUMIOHUBS MAX_NUMIOLINKS #define NODE_NUMIOLINKS MACH_NODE_NUMIOLINKS typedef struct { DECLARE_BITMAP(bits, MAX_NUMIOLINKS); } iolinkmask_t; extern iolinkmask_t _unused_iolinkmask_arg_; #define iolink_set(domain, dst) __iolink_set((domain), &(dst)) #define node_iolink_set(node, link, dst) \ iolink_set(node_iolink_to_domain((node), (link)), (dst)) #define iohub_set(domain, dst) iolink_set((domain), (dst)) #define node_iohub_set(node, link, dst) \ iohub_set(node_iohub_to_domain((node), (link)), (dst)) #define rdma_set(domain, dst) iolink_set((domain), (dst)) #define node_rdma_set(node, link, dst) \ rdma_set(node_rdma_to_domain((node), (link)), (dst)) static inline void __iolink_set(int domain, volatile iolinkmask_t *dstp) { set_bit(domain, dstp->bits); } #define iolink_clear(domain, dst) __iolink_clear((domain), &(dst)) #define node_iolink_clear(node, link, dst) \ iolink_clear(node_iolink_to_domain((node), (link)), (dst)) #define iohub_clear(domain, dst) iolink_clear((domain), (dst)) #define node_iohub_clear(node, link, dst) \ iohub_clear(node_iohub_to_domain((node), (link)), (dst)) #define rdma_clear(domain, dst) iolink_clear((domain), (dst)) #define node_rdma_clear(node, link, dst) \ rdma_clear(node_rdma_to_domain((node), (link)), (dst)) static inline void __iolink_clear(int domain, volatile iolinkmask_t *dstp) { clear_bit(domain, dstp->bits); } #define iolinks_setall(dst) __iolinks_setall(&(dst), MAX_NUMIOLINKS) static inline void __iolinks_setall(iolinkmask_t *dstp, int nbits) { bitmap_fill(dstp->bits, nbits); } #define iolinks_clear(dst) __iolinks_clear(&(dst), MAX_NUMIOLINKS) static inline void __iolinks_clear(iolinkmask_t *dstp, int nbits) { bitmap_zero(dstp->bits, nbits); } /* No static inline type checking - see Subtlety (1) above. */ #define iolink_isset(domain, iolinkmask) test_bit((domain), (iolinkmask).bits) #define node_iolink_isset(node, link, iolinkmask) \ iolink_isset(node_iolink_to_domain((node), (link)), \ (iolinkmask).bits) #define iohub_isset(domain, iolinkmask) iolink_isset((domain), (iolinkmask)) #define node_iohub_isset(node, link, iolinkmask) \ iohub_isset(node_iohub_to_domain((node), (link)), \ (iolinkmask).bits) #define rdma_isset(domain, iolinkmask) iolink_isset((domain), (iolinkmask)) #define node_rdma_isset(node, link, iolinkmask) \ rdma_isset(node_rdma_to_domain((node), (link)), \ (iolinkmask).bits) #define iolink_test_and_set(domain, iolinkmask) \ __iolink_test_and_set((domain), &(iolinkmask)) #define node_iolink_test_and_set(node, link, iolinkmask) \ iolink_test_and_set(node_iolink_to_domain((node), (link)), \ (iolinkmask)) #define iohub_test_and_set(domain, iolinkmask) \ iolink_test_and_set((domain), (iolinkmask)) #define node_iohub_test_and_set(node, link, iolinkmask) \ iohub_test_and_set(node_iohub_to_domain((node), (link)), \ (iolinkmask)) #define rdma_test_and_set(domain, iolinkmask) \ iolink_test_and_set((domain), (iolinkmask)) #define node_rdma_test_and_set(node, link, iolinkmask) \ rdma_test_and_set(node_rdma_to_domain((node), (link)), \ (iolinkmask)) static inline int __iolink_test_and_set(int domain, iolinkmask_t *addr) { return test_and_set_bit(domain, addr->bits); } #define iolinks_and(dst, src1, src2) \ __iolinks_and(&(dst), &(src1), &(src2), MAX_NUMIOLINKS) static inline void __iolinks_and(iolinkmask_t *dstp, const iolinkmask_t *src1p, const iolinkmask_t *src2p, int nbits) { bitmap_and(dstp->bits, src1p->bits, src2p->bits, nbits); } #define iolinks_or(dst, src1, src2) \ __iolinks_or(&(dst), &(src1), &(src2), MAX_NUMIOLINKS) static inline void __iolinks_or(iolinkmask_t *dstp, const iolinkmask_t *src1p, const iolinkmask_t *src2p, int nbits) { bitmap_or(dstp->bits, src1p->bits, src2p->bits, nbits); } #define iolinks_xor(dst, src1, src2) \ __iolinks_xor(&(dst), &(src1), &(src2), MAX_NUMIOLINKS) static inline void __iolinks_xor(iolinkmask_t *dstp, const iolinkmask_t *src1p, const iolinkmask_t *src2p, int nbits) { bitmap_xor(dstp->bits, src1p->bits, src2p->bits, nbits); } #define iolinks_andnot(dst, src1, src2) \ __iolinks_andnot(&(dst), &(src1), &(src2), MAX_NUMIOLINKS) static inline void __iolinks_andnot(iolinkmask_t *dstp, const iolinkmask_t *src1p, const iolinkmask_t *src2p, int nbits) { bitmap_andnot(dstp->bits, src1p->bits, src2p->bits, nbits); } #define iolinks_complement(dst, src) \ __iolinks_complement(&(dst), &(src), MAX_NUMIOLINKS) static inline void __iolinks_complement(iolinkmask_t *dstp, const iolinkmask_t *srcp, int nbits) { bitmap_complement(dstp->bits, srcp->bits, nbits); } #define iolinks_equal(src1, src2) \ __iolinks_equal(&(src1), &(src2), MAX_NUMIOLINKS) static inline int __iolinks_equal(const iolinkmask_t *src1p, const iolinkmask_t *src2p, int nbits) { return bitmap_equal(src1p->bits, src2p->bits, nbits); } #define iolinks_intersects(src1, src2) \ __iolinks_intersects(&(src1), &(src2), MAX_NUMIOLINKS) static inline int __iolinks_intersects(const iolinkmask_t *src1p, const iolinkmask_t *src2p, int nbits) { return bitmap_intersects(src1p->bits, src2p->bits, nbits); } #define iolinks_subset(src1, src2) \ __iolinks_subset(&(src1), &(src2), MAX_NUMIOLINKS) static inline int __iolinks_subset(const iolinkmask_t *src1p, const iolinkmask_t *src2p, int nbits) { return bitmap_subset(src1p->bits, src2p->bits, nbits); } #define iolinks_empty(src) __iolinks_empty(&(src), MAX_NUMIOLINKS) static inline int __iolinks_empty(const iolinkmask_t *srcp, int nbits) { return bitmap_empty(srcp->bits, nbits); } #define iolinks_full(iolinkmask) __iolinks_full(&(iolinkmask), MAX_NUMIOLINKS) static inline int __iolinks_full(const iolinkmask_t *srcp, int nbits) { return bitmap_full(srcp->bits, nbits); } #define iolinks_weight(iolinkmask) __iolinks_weight(&(iolinkmask), MAX_NUMIOLINKS) static inline int __iolinks_weight(const iolinkmask_t *srcp, int nbits) { return bitmap_weight(srcp->bits, nbits); } #define iolinks_shift_right(dst, src, n) \ __iolinks_shift_right(&(dst), &(src), (n), MAX_NUMIOLINKS) static inline void __iolinks_shift_right(iolinkmask_t *dstp, const iolinkmask_t *srcp, int n, int nbits) { bitmap_shift_right(dstp->bits, srcp->bits, n, nbits); } #define iolinks_shift_left(dst, src, n) \ __iolinks_shift_left(&(dst), &(src), (n), MAX_NUMIOLINKS) static inline void __iolinks_shift_left(iolinkmask_t *dstp, const iolinkmask_t *srcp, int n, int nbits) { bitmap_shift_left(dstp->bits, srcp->bits, n, nbits); } /* FIXME: better would be to fix all architectures to never return > MAX_NUMIOLINKS, then the silly min_ts could be dropped. */ #define first_iolink(src) __first_iolink(&(src)) static inline int __first_iolink(const iolinkmask_t *srcp) { return min_t(int, MAX_NUMIOLINKS, find_first_bit(srcp->bits, MAX_NUMIOLINKS)); } #define next_iolink(n, src) __next_iolink((n), &(src)) static inline int __next_iolink(int n, const iolinkmask_t *srcp) { return min_t(int, MAX_NUMIOLINKS, find_next_bit(srcp->bits, MAX_NUMIOLINKS, n+1)); } #define iolinkmask_of_iolink(domain) \ ({ \ typeof(_unused_iolinkmask_arg_) m; \ if (sizeof(m) == sizeof(unsigned long)) { \ m.bits[0] = 1UL<<(domain); \ } else { \ iolinks_clear(m); \ iolink_set((domain), m); \ } \ m; \ }) #define iolinkmask_of_node_iolink(node, link) \ iolinkmask_of_iolink(node_iohub_to_domain((node), (link))) #define first_unset_iolink(mask) __first_unset_iolink(&(mask)) static inline int __first_unset_iolink(const iolinkmask_t *maskp) { return min_t(int,MAX_NUMIOLINKS, find_first_zero_bit(maskp->bits, MAX_NUMIOLINKS)); } #define IOLINK_MASK_LAST_WORD BITMAP_LAST_WORD_MASK(MAX_NUMIOLINKS) #if MAX_NUMIOLINKS <= BITS_PER_LONG #define IOLINK_MASK_ALL \ ((iolinkmask_t) { { \ [BITS_TO_LONGS(MAX_NUMIOLINKS)-1] = IOLINK_MASK_LAST_WORD \ } }) #else #define IOLINK_MASK_ALL \ ((iolinkmask_t) { { \ [0 ... BITS_TO_LONGS(MAX_NUMIOLINKS)-2] = ~0UL, \ [BITS_TO_LONGS(MAX_NUMIOLINKS)-1] = IOLINK_MASK_LAST_WORD \ } }) #endif #define IOLINK_MASK_NONE \ ((iolinkmask_t) { { \ [0 ... BITS_TO_LONGS(MAX_NUMIOLINKS)-1] = 0UL \ } }) #define CHUNKSZ 32 #define nbits_to_hold_value(val) fls(val) #define BASEDEC 10 /* fancier cpuset lists input in decimal */ /** * bitmap_scnprintf - convert bitmap to an ASCII hex string. * @buf: byte buffer into which string is placed * @buflen: reserved size of @buf, in bytes * @maskp: pointer to bitmap to convert * @nmaskbits: size of bitmap, in bits * * Exactly @nmaskbits bits are displayed. Hex digits are grouped into * comma-separated sets of eight digits per set. Returns the number of * characters which were written to *buf, excluding the trailing \0. */ static int bitmap_scnprintf(char *buf, unsigned int buflen, const unsigned long *maskp, int nmaskbits) { int i, word, bit, len = 0; unsigned long val; const char *sep = ""; int chunksz; u32 chunkmask; chunksz = nmaskbits & (CHUNKSZ - 1); if (chunksz == 0) chunksz = CHUNKSZ; i = ALIGN(nmaskbits, CHUNKSZ) - CHUNKSZ; for (; i >= 0; i -= CHUNKSZ) { chunkmask = ((1ULL << chunksz) - 1); word = i / BITS_PER_LONG; bit = i % BITS_PER_LONG; val = (maskp[word] >> bit) & chunkmask; len += scnprintf(buf+len, buflen-len, "%s%0*lx", sep, (chunksz+3)/4, val); chunksz = CHUNKSZ; sep = ","; } return len; } #undef CHUNKSZ /* * bscnl_emit(buf, buflen, rbot, rtop, bp) * * Helper routine for bitmap_scnlistprintf(). Write decimal number * or range to buf, suppressing output past buf+buflen, with optional * comma-prefix. Return len of what was written to *buf, excluding the * trailing \0. */ static inline int bscnl_emit(char *buf, int buflen, int rbot, int rtop, int len) { if (len > 0) len += scnprintf(buf + len, buflen - len, ","); if (rbot == rtop) len += scnprintf(buf + len, buflen - len, "%d", rbot); else len += scnprintf(buf + len, buflen - len, "%d-%d", rbot, rtop); return len; } /** * bitmap_scnlistprintf - convert bitmap to list format ASCII string * @buf: byte buffer into which string is placed * @buflen: reserved size of @buf, in bytes * @maskp: pointer to bitmap to convert * @nmaskbits: size of bitmap, in bits * * Output format is a comma-separated list of decimal numbers and * ranges. Consecutively set bits are shown as two hyphen-separated * decimal numbers, the smallest and largest bit numbers set in * the range. Output format is compatible with the format * accepted as input by bitmap_parselist(). * * The return value is the number of characters which were written to *buf * excluding the trailing '\0', as per ISO C99's scnprintf. */ static int bitmap_scnlistprintf(char *buf, unsigned int buflen, const unsigned long *maskp, int nmaskbits) { int len = 0; /* current bit is 'cur', most recently seen range is [rbot, rtop] */ int cur, rbot, rtop; if (buflen == 0) return 0; buf[0] = 0; cur = find_first_bit(maskp, nmaskbits); rbot = cur; while (cur < nmaskbits) { rtop = cur; cur = find_next_bit(maskp, nmaskbits, cur+1); if (cur >= nmaskbits || cur > rtop + 1) { len = bscnl_emit(buf, buflen, rbot, rtop, len); rbot = cur; } } return len; } #define iolinks_addr(src) ((src).bits) #define iolinkmask_scnprintf(buf, len, src) \ __iolinkmask_scnprintf((buf), (len), &(src), MAX_NUMIOLINKS) static inline int __iolinkmask_scnprintf(char *buf, int len, const iolinkmask_t *srcp, int nbits) { return bitmap_scnprintf(buf, len, srcp->bits, nbits); } #define iolinkmask_parse(ubuf, ulen, dst) \ __iolinkmask_parse((ubuf), (ulen), &(dst), MAX_NUMIOLINKS) static inline int __iolinkmask_parse(const char __user *buf, int len, iolinkmask_t *dstp, int nbits) { return bitmap_parse(buf, len, dstp->bits, nbits); } #define iolinklist_scnprintf(buf, len, src) \ __iolinklist_scnprintf((buf), (len), &(src), MAX_NUMIOLINKS) static inline int __iolinklist_scnprintf(char *buf, int len, const iolinkmask_t *srcp, int nbits) { return bitmap_scnlistprintf(buf, len, srcp->bits, nbits); } #define iolinklist_parse(buf, dst) __iolinklist_parse((buf), &(dst), MAX_NUMIOLINKS) static inline int __iolinklist_parse(const char *buf, iolinkmask_t *dstp, int nbits) { return bitmap_parselist(buf, dstp->bits, nbits); } #if defined(CONFIG_IOHUB_DOMAINS) && MAX_NUMIOLINKS > 1 #define for_each_iolink_mask(domain, mask) \ for ((domain) = first_iolink(mask); \ (domain) < MAX_NUMIOLINKS; \ (domain) = next_iolink((domain), (mask))) #define for_each_node_iolink_mask(domain, node, link, mask) \ for ((domain) = first_iolink(mask), \ (node) = iolink_domain_to_node((domain)), \ (link) = iolink_domain_to_link((domain)); \ (domain) < MAX_NUMIOLINKS; \ (domain) = next_iolink((domain), (mask)), \ (node) = iolink_domain_to_node((domain)), \ (link) = iolink_domain_to_link((domain))) #else /* MAX_NUMIOLINKS == 1 */ #define for_each_iolink_mask(domain, mask) \ if (HAS_MACHINE_E2K_IOHUB) \ for ((domain) = 0; (domain) < 1; (domain)++) #define for_each_node_iolink_mask(domain, node, link, mask) \ if (HAS_MACHINE_E2K_IOHUB) \ for ((domain) = 0, (node) = 0, (link) = 0; \ (domain) < 1; (domain)++) #endif /* MAX_NUMIOLINKS */ /* * The following particular system iolinkmasks and operations * on them manage all possible and online iolinks. */ #if defined(CONFIG_IOHUB_DOMAINS) && MAX_NUMIOLINKS > 1 extern int iolinks_num; extern iolinkmask_t iolink_iohub_map; extern iolinkmask_t iolink_online_iohub_map; extern int iolink_iohub_num; extern int iolink_online_iohub_num; extern iolinkmask_t iolink_rdma_map; extern iolinkmask_t iolink_online_rdma_map; extern int iolink_rdma_num; extern int iolink_online_rdma_num; #define num_online_iolinks() (num_online_iohubs() + num_online_rdmas()) #define num_possible_iolinks() iolinks_num #define num_online_iohubs() iolink_online_iohub_num #define num_possible_iohubs() iolink_iohub_num #define num_online_rdmas() iolink_online_rdma_num #define num_possible_rdmas() iolink_rdma_num #define iolink_online(domain) (iohub_online(domain) || rdma_online(domain)) #define iolink_possible(domain) (iohab_possible(domain) || \ rdma_possible(domain)) #define node_iolink_online(node, link) \ iolink_online(node_iolink_to_domain(node, link)) #define node_iolink_possible(node, link) \ iolink_possible(node_iolink_to_domain(node, link)) #define iohub_online(domain) iolink_isset((domain), iolink_online_iohub_map) #define iohab_possible(domain) iolink_isset((domain), iolink_iohub_map) #define node_iohub_online(node, link) \ iohub_online(node_iohub_to_domain(node, link)) #define node_iohub_possible(node, link) \ iohab_possible(node_iohub_to_domain(node, link)) #define first_iohub_online() first_iolink(iolink_online_iohub_map) #define rdma_online(domain) iolink_isset((domain), iolink_online_rdma_map) #define rdma_possible(domain) iolink_isset((domain), iolink_rdma_map) #define node_rdma_online(node, link) \ rdma_online(node_rdma_to_domain(node, link)) #define node_rdma_possible(node, link) \ rdma_possible(node_rdma_to_domain(node, link)) #else #define iolinks_num 1 #define iolink_iohub_num 1 #define num_online_iolinks() 1 #define num_possible_iolinks() 1 #define num_online_iohubs() 1 #define num_possible_iohubs() 1 #define num_online_rdmas() 0 #define num_possible_rdmas() 0 #define iolink_online(domain) ((domain) == 0) #define iolink_possible(domain) ((domain) == 0) #define node_iolink_online(node, link) \ ((node) == 0 && (link) == 0) #define node_iolink_possible(node, link) \ ((node) == 0 && (link) == 0) #define iohub_online(domain) ((domain) == 0) #define iohab_possible(domain) ((domain) == 0) #define node_iohub_online(node, link) \ ((node) == 0 && (link) == 0) #define node_iohub_possible(node, link) \ ((node) == 0 && (link) == 0) #define first_iohub_online() 0 #define rdma_online(domain) 0 #define rdma_possible(domain) 0 #define node_rdma_online(node, link) 0 #define node_rdma_possible(node, link) 0 #endif #define iohub_set_online(domain) \ set_bit((domain), iolink_online_iohub_map.bits) #define iohub_set_offline(domain) \ clear_bit((domain), iolink_online_iohub_map.bits) #define node_iohub_set_online(node, link) \ iohub_set_online(node_iohub_to_domain((node), (link)) #define node_iohub_set_offline(node, link) \ iohub_set_offline(node_iohub_to_domain((node), (link)) #define rdma_set_online(domain) \ set_bit((domain), iolink_online_rdma_map.bits) #define rdma_set_offline(domain) \ clear_bit((domain), iolink_online_rdma_map.bits) #define node_rdma_set_online(node, link) \ rdma_set_online(node_rdma_to_domain((node), (link)) #define node_rdma_set_offline(node, link) \ rdma_set_offline(node_rdma_to_domain((node), (link)) #define for_each_iohub(domain) \ for_each_iolink_mask((domain), iolink_iohub_map) #define for_each_online_iohub(domain) \ for_each_iolink_mask((domain), iolink_online_iohub_map) #define for_each_node_iohub(domain, node, link) \ for_each_node_iolink_mask((domain), (node), (link), \ iolink_iohub_map) #define for_each_online_node_iohub(domain, node, link) \ for_each_node_iolink_mask((domain), (node), (link), \ iolink_online_iohub_map) #define for_each_rdma(domain) \ for_each_iolink_mask((domain), iolink_rdma_map) #define for_each_online_rdma(domain) \ for_each_iolink_mask((domain), iolink_online_rdma_map) #define for_each_node_rdma(domain, node, link) \ for_each_node_iolink_mask((domain), (node), (link), \ iolink_rdma_map) #define for_each_online_node_rdma(domain, node, link) \ for_each_node_iolink_mask((domain), (node), (link), \ iolink_online_rdma_map) #endif /* __ASM_L_IOLINKMASK_H */