From: Shaun Tancheff Date: Tue, 27 Oct 2020 21:03:13 +0000 (-0500) Subject: LU-14080 gnilnd: updates for SUSE 15 SP2 X-Git-Tag: 2.14.0-RC1~58 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=4b0e495e3c52296a248e37d54665aade87d6901d LU-14080 gnilnd: updates for SUSE 15 SP2 gnilnd updates for SUSE 15 SP2 Use -Werror when checking for -Wno-stringop-truncation to ensure the compile test is valid Adjust for kernel dropping time_t, timeval, timespec Adjust for kernel switching to timer_setup Adjust for kernel dropping global_page_state(), use nr_free_pages instead Cleanup string format for stricter checking Test-Parameters: trivial HPE-bug-id: LUS-9453 Signed-off-by: Shaun Tancheff Change-Id: I5dcda1497fa5b1f2cf4a215517700f07374fcf7f Reviewed-on: https://review.whamcloud.com/40426 Tested-by: jenkins Tested-by: Maloo Reviewed-by: James Simmons Reviewed-by: Petros Koutoupis Reviewed-by: Oleg Drokin --- diff --git a/config/lustre-build.m4 b/config/lustre-build.m4 index e6219eb..4d089bd 100644 --- a/config/lustre-build.m4 +++ b/config/lustre-build.m4 @@ -386,7 +386,7 @@ AC_DEFUN([LB_CC_NO_STRINGOP_TRUNCATION], [ AC_MSG_CHECKING([for -Wno-stringop-truncation support]) saved_flags="$CFLAGS" - CFLAGS="$CFLAGS -Wno-stringop-truncation" + CFLAGS="$CFLAGS -Werror -Wno-stringop-truncation" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [ EXTRA_KCFLAGS="$EXTRA_KCFLAGS -Wno-stringop-truncation" diff --git a/lnet/klnds/gnilnd/gnilnd.c b/lnet/klnds/gnilnd/gnilnd.c index 2548fde..84fc55c 100644 --- a/lnet/klnds/gnilnd/gnilnd.c +++ b/lnet/klnds/gnilnd/gnilnd.c @@ -2053,9 +2053,10 @@ kgnilnd_dev_fini(kgn_device_t *dev) LASSERTF(atomic_read(&dev->gnd_n_mdd) == 0 && atomic_read(&dev->gnd_n_mdd_held) == 0 && atomic64_read(&dev->gnd_nbytes_map) == 0, - "%d SMSG mappings of %ld bytes still mapped or held %d\n", + "%d SMSG mappings of %lld bytes still mapped or held %d\n", atomic_read(&dev->gnd_n_mdd), - atomic64_read(&dev->gnd_nbytes_map), atomic_read(&dev->gnd_n_mdd_held)); + (u64)atomic64_read(&dev->gnd_nbytes_map), + atomic_read(&dev->gnd_n_mdd_held)); LASSERT(list_empty(&dev->gnd_map_list)); @@ -2116,7 +2117,7 @@ kgnilnd_dev_fini(kgn_device_t *dev) int kgnilnd_base_startup(void) { - struct timeval tv; + struct timespec64 ts; long long pkmem = libcfs_kmem_read(); int rc; int i; @@ -2146,10 +2147,10 @@ int kgnilnd_base_startup(void) * initialised with seconds + microseconds at startup time. So we * rely on NOT creating connections more frequently on average than * 1MHz to ensure we don't use old connstamps when we reboot. */ - do_gettimeofday(&tv); + ktime_get_ts64(&ts); kgnilnd_data.kgn_connstamp = kgnilnd_data.kgn_peerstamp = - (((__u64)tv.tv_sec) * 1000000) + tv.tv_usec; + (ts.tv_sec * 1000000) + (ts.tv_nsec / 100); init_rwsem(&kgnilnd_data.kgn_net_rw_sem); @@ -2194,12 +2195,14 @@ int kgnilnd_base_startup(void) atomic_set(&dev->gnd_ndgrams, 0); atomic_set(&dev->gnd_nwcdgrams, 0); /* setup timer for RDMAQ processing */ - setup_timer(&dev->gnd_rdmaq_timer, kgnilnd_schedule_device_timer, - (unsigned long)dev); + cfs_timer_setup(&dev->gnd_rdmaq_timer, + kgnilnd_schedule_device_timer, + (unsigned long)dev, 0); /* setup timer for mapping processing */ - setup_timer(&dev->gnd_map_timer, kgnilnd_schedule_device_timer, - (unsigned long)dev); + cfs_timer_setup(&dev->gnd_map_timer, + kgnilnd_schedule_device_timer, + (unsigned long)dev, 0); } diff --git a/lnet/klnds/gnilnd/gnilnd.h b/lnet/klnds/gnilnd/gnilnd.h index 92d45155..571f9b9 100644 --- a/lnet/klnds/gnilnd/gnilnd.h +++ b/lnet/klnds/gnilnd/gnilnd.h @@ -28,6 +28,8 @@ #ifndef _GNILND_GNILND_H_ #define _GNILND_GNILND_H_ +#define DEBUG_SUBSYSTEM S_LND + #include #include #include @@ -59,8 +61,6 @@ #include #include -#define DEBUG_SUBSYSTEM S_LND - #include #include @@ -808,7 +808,7 @@ typedef struct kgn_rx { kgn_msg_t *grx_msg; /* message */ struct lnet_msg *grx_lntmsg; /* lnet msg for this rx (eager only) */ int grx_eager; /* if eager, we copied msg to somewhere */ - struct timespec grx_received; /* time this msg received */ + struct timespec64 grx_received; /* time this msg received */ } kgn_rx_t; typedef struct kgn_data { @@ -1821,7 +1821,8 @@ void kgnilnd_consume_rx(kgn_rx_t *rx); void kgnilnd_schedule_device(kgn_device_t *dev); void kgnilnd_device_callback(__u32 devid, __u64 arg); -void kgnilnd_schedule_device_timer(unsigned long arg); +void kgnilnd_schedule_device_timer(cfs_timer_cb_arg_t data); +void kgnilnd_schedule_device_timer_rd(cfs_timer_cb_arg_t data); int kgnilnd_reaper(void *arg); int kgnilnd_scheduler(void *arg); diff --git a/lnet/klnds/gnilnd/gnilnd_cb.c b/lnet/klnds/gnilnd/gnilnd_cb.c index b1e9c25..5f838b1 100644 --- a/lnet/klnds/gnilnd/gnilnd_cb.c +++ b/lnet/klnds/gnilnd/gnilnd_cb.c @@ -87,9 +87,16 @@ kgnilnd_schedule_device(kgn_device_t *dev) } } -void kgnilnd_schedule_device_timer(unsigned long arg) +void kgnilnd_schedule_device_timer(cfs_timer_cb_arg_t data) { - kgn_device_t *dev = (kgn_device_t *) arg; + kgn_device_t *dev = cfs_from_timer(dev, data, gnd_map_timer); + + kgnilnd_schedule_device(dev); +} + +void kgnilnd_schedule_device_timer_rd(cfs_timer_cb_arg_t data) +{ + kgn_device_t *dev = cfs_from_timer(dev, data, gnd_rdmaq_timer); kgnilnd_schedule_device(dev); } @@ -869,7 +876,7 @@ kgnilnd_verify_rdma_cksum(kgn_tx_t *tx, __u16 rx_cksum, int put_len) kgnilnd_dump_blob(D_BUFFS, "RDMA payload", tx->tx_buffer, nob); } - /* fall through to dump log */ + /* fallthrough */ case 1: libcfs_debug_dumplog(); break; @@ -953,9 +960,10 @@ kgnilnd_mem_del_map_list(kgn_device_t *dev, kgn_tx_t *tx) tx->tx_msg.gnm_type == GNILND_MSG_GET_REQ) { atomic64_sub(bytes, &dev->gnd_rdmaq_bytes_out); LASSERTF(atomic64_read(&dev->gnd_rdmaq_bytes_out) >= 0, - "bytes_out negative! %ld\n", atomic64_read(&dev->gnd_rdmaq_bytes_out)); + "bytes_out negative! %lld\n", + (s64)atomic64_read(&dev->gnd_rdmaq_bytes_out)); GNIDBG_TX(D_NETTRACE, tx, "rdma -- %d to %lld", - bytes, atomic64_read(&dev->gnd_rdmaq_bytes_out)); + bytes, (s64)atomic64_read(&dev->gnd_rdmaq_bytes_out)); } atomic_dec(&dev->gnd_n_mdd); @@ -1654,7 +1662,8 @@ kgnilnd_queue_tx(kgn_conn_t *conn, kgn_tx_t *tx) /* it was sent, break out of switch to avoid default case of queueing */ break; } - /* needs to queue to try again, so fall through to default case */ + /* needs to queue to try again, so... */ + /* fall through... */ case GNILND_MSG_NOOP: /* Just make sure this goes out first for this conn */ add_tail = 0; @@ -2394,7 +2403,7 @@ kgnilnd_recv(struct lnet_ni *ni, void *private, struct lnet_msg *lntmsg, case 2: kgnilnd_dump_blob(D_BUFFS, "bad payload checksum", &rxmsg[1], rxmsg->gnm_payload_len); - /* fall through to dump */ + /* fallthrough */ case 1: libcfs_debug_dumplog(); break; @@ -2908,7 +2917,7 @@ kgnilnd_update_reaper_timeout(long timeout) } static void -kgnilnd_reaper_poke_with_stick(unsigned long arg) +kgnilnd_reaper_poke_with_stick(cfs_timer_cb_arg_t arg) { wake_up(&kgnilnd_data.kgn_reaper_waitq); } @@ -2951,8 +2960,8 @@ kgnilnd_reaper(void *arg) prepare_to_wait(&kgnilnd_data.kgn_reaper_waitq, &wait, TASK_INTERRUPTIBLE); spin_unlock(&kgnilnd_data.kgn_reaper_lock); - setup_timer(&timer, kgnilnd_reaper_poke_with_stick, - next_check_time); + cfs_timer_setup(&timer, kgnilnd_reaper_poke_with_stick, + next_check_time, 0); mod_timer(&timer, (long) jiffies + timeout); /* check flag variables before committing */ @@ -3729,7 +3738,7 @@ kgnilnd_process_fmaq(kgn_conn_t *conn) case GNILND_MSG_PUT_REQ: case GNILND_MSG_GET_REQ_REV: tx->tx_msg.gnm_u.putreq.gnprm_cookie = tx->tx_id.txe_cookie; - + /* fallthrough */ case GNILND_MSG_PUT_ACK: case GNILND_MSG_PUT_REQ_REV: case GNILND_MSG_GET_ACK_REV: @@ -3809,10 +3818,9 @@ kgnilnd_process_rdmaq(kgn_device_t *dev) new_ok -= atomic64_read(&dev->gnd_rdmaq_bytes_out); atomic64_set(&dev->gnd_rdmaq_bytes_ok, new_ok); - CDEBUG(D_NET, "resetting rdmaq bytes to %ld, deadline +%lu -> %lu, " - "current out %ld\n", - atomic64_read(&dev->gnd_rdmaq_bytes_ok), dead_bump, dev->gnd_rdmaq_deadline, - atomic64_read(&dev->gnd_rdmaq_bytes_out)); + CDEBUG(D_NET, "resetting rdmaq bytes to %lld, deadline +%lu -> %lu, current out %lld\n", + (s64)atomic64_read(&dev->gnd_rdmaq_bytes_ok), dead_bump, dev->gnd_rdmaq_deadline, + (s64)atomic64_read(&dev->gnd_rdmaq_bytes_out)); } spin_unlock(&dev->gnd_rdmaq_lock); } @@ -4103,7 +4111,7 @@ kgnilnd_check_fma_rx(kgn_conn_t *conn) rx->grx_msg = msg; rx->grx_conn = conn; rx->grx_eager = 0; - rx->grx_received = current_kernel_time(); + ktime_get_ts64(&rx->grx_received); if (CFS_FAIL_CHECK(CFS_FAIL_GNI_NET_LOOKUP)) { rc = -ENONET; diff --git a/lnet/klnds/gnilnd/gnilnd_conn.c b/lnet/klnds/gnilnd/gnilnd_conn.c index 12d16a3..dab5633 100644 --- a/lnet/klnds/gnilnd/gnilnd_conn.c +++ b/lnet/klnds/gnilnd/gnilnd_conn.c @@ -24,6 +24,7 @@ */ #include "gnilnd.h" +#include void kgnilnd_setup_smsg_attr(gni_smsg_attr_t *smsg_attr) @@ -101,11 +102,11 @@ kgnilnd_alloc_fmablk(kgn_device_t *device, int use_phys) * to memory exhaustion during massive reconnects during a network * outage. Limit the amount of fma blocks to use by always keeping * a percent of pages free initially set to 25% of total memory. */ - if (global_page_state(NR_FREE_PAGES) < kgnilnd_data.free_pages_limit) { + if (nr_free_pages() < kgnilnd_data.free_pages_limit) { LCONSOLE_INFO("Exceeding free page limit of %ld. " "Free pages available %ld\n", kgnilnd_data.free_pages_limit, - global_page_state(NR_FREE_PAGES)); + nr_free_pages()); return -ENOMEM; } #endif @@ -2428,13 +2429,17 @@ kgnilnd_repost_wc_dgrams(kgn_device_t *dev) RETURN(did_something); } +struct kgnilnd_dgram_timer { + struct timer_list timer; + kgn_device_t *dev; +}; + static void -kgnilnd_dgram_poke_with_stick(unsigned long arg) +kgnilnd_dgram_poke_with_stick(cfs_timer_cb_arg_t arg) { - int dev_id = arg; - kgn_device_t *dev = &kgnilnd_data.kgn_devices[dev_id]; + struct kgnilnd_dgram_timer *t = cfs_from_timer(t, arg, timer); - wake_up(&dev->gnd_dgram_waitq); + wake_up(&t->dev->gnd_dgram_waitq); } /* use single thread for dgrams - should be sufficient for performance */ @@ -2446,8 +2451,8 @@ kgnilnd_dgram_mover(void *arg) int rc, did_something; unsigned long next_purge_check = jiffies - 1; unsigned long timeout; - struct timer_list timer; - unsigned long deadline = 0; + struct kgnilnd_dgram_timer timer; + unsigned long deadline = 0; DEFINE_WAIT(wait); snprintf(name, sizeof(name), "kgnilnd_dg_%02d", dev->gnd_id); @@ -2515,8 +2520,11 @@ kgnilnd_dgram_mover(void *arg) prepare_to_wait(&dev->gnd_dgram_waitq, &wait, TASK_INTERRUPTIBLE); - setup_timer(&timer, kgnilnd_dgram_poke_with_stick, dev->gnd_id); - mod_timer(&timer, (long) jiffies + timeout); + cfs_timer_setup(&timer.timer, + kgnilnd_dgram_poke_with_stick, + dev, 0); + timer.dev = dev; + mod_timer(&timer.timer, (long) jiffies + timeout); /* last second chance for others to poke us */ did_something += xchg(&dev->gnd_dgram_ready, GNILND_DGRAM_IDLE); @@ -2535,7 +2543,7 @@ kgnilnd_dgram_mover(void *arg) deadline = jiffies + cfs_time_seconds(*kgnilnd_tunables.kgn_dgram_timeout); } - del_singleshot_timer_sync(&timer); + del_singleshot_timer_sync(&timer.timer); finish_wait(&dev->gnd_dgram_waitq, &wait); } diff --git a/lnet/klnds/gnilnd/gnilnd_proc.c b/lnet/klnds/gnilnd/gnilnd_proc.c index 13fb4a5..dfb01f5 100644 --- a/lnet/klnds/gnilnd/gnilnd_proc.c +++ b/lnet/klnds/gnilnd/gnilnd_proc.c @@ -207,7 +207,7 @@ static int kgnilnd_stats_seq_show(struct seq_file *sf, void *v) { kgn_device_t *dev; - struct timeval now; + struct timespec64 now; if (kgnilnd_data.kgn_init < GNILND_INIT_ALL) { seq_printf(sf, "kgnilnd is not initialized yet\n"); @@ -219,9 +219,9 @@ kgnilnd_stats_seq_show(struct seq_file *sf, void *v) /* sampling is racy, but so is reading this file! */ smp_rmb(); - do_gettimeofday(&now); + ktime_get_ts64(&now); - seq_printf(sf, "time: %lu.%lu\n" + seq_printf(sf, "time: %llu.%lu\n" "ntx: %d\n" "npeers: %d\n" "nconns: %d\n" @@ -231,12 +231,12 @@ kgnilnd_stats_seq_show(struct seq_file *sf, void *v) "n_mdd: %d\n" "n_mdd_held: %d\n" "n_eager_allocs: %d\n" - "GART map bytes: %ld\n" + "GART map bytes: %lld\n" "TX queued maps: %d\n" "TX phys nmaps: %d\n" "TX phys bytes: %lu\n" - "RDMAQ bytes_auth: %ld\n" - "RDMAQ bytes_left: %ld\n" + "RDMAQ bytes_auth: %lld\n" + "RDMAQ bytes_left: %lld\n" "RDMAQ nstalls: %d\n" "dev mutex delay: %ld\n" "dev n_yield: %d\n" @@ -245,20 +245,20 @@ kgnilnd_stats_seq_show(struct seq_file *sf, void *v) "SMSG fast_ok: %d\n" "SMSG fast_block: %d\n" "SMSG ntx: %u\n" - "SMSG tx_bytes: %lu\n" + "SMSG tx_bytes: %llu\n" "SMSG nrx: %u\n" - "SMSG rx_bytes: %lu\n" + "SMSG rx_bytes: %llu\n" "RDMA ntx: %u\n" - "RDMA tx_bytes: %lu\n" + "RDMA tx_bytes: %llu\n" "RDMA nrx: %u\n" - "RDMA rx_bytes: %lu\n" + "RDMA rx_bytes: %llu\n" "VMAP short: %d\n" "VMAP cksum: %d\n" "KMAP short: %d\n" "RDMA REV length: %d\n" "RDMA REV offset: %d\n" "RDMA REV copy: %d\n", - now.tv_sec, now.tv_usec, + (s64)now.tv_sec, now.tv_nsec, atomic_read(&kgnilnd_data.kgn_ntx), atomic_read(&kgnilnd_data.kgn_npeers), atomic_read(&kgnilnd_data.kgn_nconns), @@ -267,11 +267,11 @@ kgnilnd_stats_seq_show(struct seq_file *sf, void *v) atomic_read(&dev->gnd_nfmablk), atomic_read(&dev->gnd_n_mdd), atomic_read(&dev->gnd_n_mdd_held), atomic_read(&kgnilnd_data.kgn_neager_allocs), - atomic64_read(&dev->gnd_nbytes_map), + (s64)atomic64_read(&dev->gnd_nbytes_map), atomic_read(&dev->gnd_nq_map), dev->gnd_map_nphys, dev->gnd_map_physnop * PAGE_SIZE, - atomic64_read(&dev->gnd_rdmaq_bytes_out), - atomic64_read(&dev->gnd_rdmaq_bytes_ok), + (s64)atomic64_read(&dev->gnd_rdmaq_bytes_out), + (s64)atomic64_read(&dev->gnd_rdmaq_bytes_ok), atomic_read(&dev->gnd_rdmaq_nstalls), dev->gnd_mutex_delay, atomic_read(&dev->gnd_n_yield), @@ -280,13 +280,13 @@ kgnilnd_stats_seq_show(struct seq_file *sf, void *v) atomic_read(&dev->gnd_fast_ok), atomic_read(&dev->gnd_fast_block), atomic_read(&dev->gnd_short_ntx), - atomic64_read(&dev->gnd_short_txbytes), + (s64)atomic64_read(&dev->gnd_short_txbytes), atomic_read(&dev->gnd_short_nrx), - atomic64_read(&dev->gnd_short_rxbytes), + (s64)atomic64_read(&dev->gnd_short_rxbytes), atomic_read(&dev->gnd_rdma_ntx), - atomic64_read(&dev->gnd_rdma_txbytes), + (s64)atomic64_read(&dev->gnd_rdma_txbytes), atomic_read(&dev->gnd_rdma_nrx), - atomic64_read(&dev->gnd_rdma_rxbytes), + (s64)atomic64_read(&dev->gnd_rdma_rxbytes), atomic_read(&kgnilnd_data.kgn_nvmap_short), atomic_read(&kgnilnd_data.kgn_nvmap_cksum), atomic_read(&kgnilnd_data.kgn_nkmap_short), @@ -1007,7 +1007,7 @@ kgnilnd_proc_peer_conns_seq_show(struct seq_file *sf, void *v) * 2012-12-11T16:06:16.966751 123@gni ... */ getnstimeofday(&now); - time_to_tm(now.tv_sec, 0, &ctm); + time64_to_tm(now.tv_sec, 0, &ctm); jifs = jiffies; write_lock(&kgnilnd_data.kgn_peer_conn_lock); diff --git a/lnet/klnds/gnilnd/gnilnd_sysctl.c b/lnet/klnds/gnilnd/gnilnd_sysctl.c index 4b472f1..c95f8d6 100644 --- a/lnet/klnds/gnilnd/gnilnd_sysctl.c +++ b/lnet/klnds/gnilnd/gnilnd_sysctl.c @@ -276,7 +276,7 @@ static struct ctl_table kgnilnd_table[] = { .mode = 0644, .proc_handler = &proc_peer_state, }, - { 0 } + { .procname = NULL } }; static struct ctl_table kgnilnd_top_table[2] = { @@ -287,7 +287,7 @@ static struct ctl_table kgnilnd_top_table[2] = { .mode = 0555, .child = kgnilnd_table }, - { 0 } + { .procname = NULL } }; void kgnilnd_insert_sysctl(void)