* Re: [PATCH 1/3] powerpc: boot: include compiler_attributes.h
From: Michael Ellerman @ 2020-11-17 23:46 UTC (permalink / raw)
To: Nick Desaulniers, Gustavo A . R . Silva, Nathan Chancellor,
Miguel Ojeda
Cc: Nick Desaulniers, linux-kernel, clang-built-linux, Paul Mackerras,
linuxppc-dev
In-Reply-To: <20201116043532.4032932-2-ndesaulniers@google.com>
Nick Desaulniers <ndesaulniers@google.com> writes:
> The kernel uses `-include` to include include/linux/compiler_types.h
> into all translation units (see scripts/Makefile.lib), which #includes
> compiler_attributes.h.
>
> arch/powerpc/boot/ uses different compiler flags from the rest of the
> kernel. As such, it doesn't contain the definitions from these headers,
> and redefines a few that it needs.
>
> For the purpose of enabling -Wimplicit-fallthrough for ppc, include
> compiler_types.h via `-include`.
>
> Link: https://github.com/ClangBuiltLinux/linux/issues/236
> Signed-off-by: Nick Desaulniers <ndesaulniers@google.com>
> ---
> We could just `#include "include/linux/compiler_types.h"` in the few .c
> sources used from lib/ (there are proper header guards in
> compiler_types.h).
>
> It was also noted in 6a9dc5fd6170 that we could -D__KERNEL__ and
> -include compiler_types.h like the main kernel does, though testing that
> produces a whole sea of warnings to cleanup. This approach is minimally
> invasive.
>
> arch/powerpc/boot/Makefile | 1 +
> arch/powerpc/boot/decompress.c | 1 -
> 2 files changed, 1 insertion(+), 1 deletion(-)
Acked-by: Michael Ellerman <mpe@ellerman.id.au>
cheers
^ permalink raw reply
* Re: [PATCH 2/3] Revert "lib: Revert use of fallthrough pseudo-keyword in lib/"
From: Gustavo A. R. Silva @ 2020-11-17 23:45 UTC (permalink / raw)
To: Nick Desaulniers
Cc: Miguel Ojeda, LKML, clang-built-linux, Paul Mackerras,
Nathan Chancellor, linuxppc-dev
In-Reply-To: <CAKwvOdmNW3iynqi_+2c1P-6Prq1a8iVufoaZh2NAbsaBLeZZ4Q@mail.gmail.com>
On Tue, Nov 17, 2020 at 02:28:43PM -0800, Nick Desaulniers wrote:
> On Tue, Nov 17, 2020 at 2:16 PM Gustavo A. R. Silva
> <gustavoars@kernel.org> wrote:
> >
> > I'm happy to take this series in my tree. I'm planing to send a
> > pull-request for -rc5 with more related changes. So, I can include
> > this in the same PR.
> >
> > In the meantime I'll add this to my testing tree, so it can be
> > build-tested by the 0-day folks. :)
>
> SGTM, and thank you. I'm sure you saw the existing warning about
> indentation. Do we want to modify the revert patch, or put another
> patch on top?
In this case, it'd be much better to modify the revert patch. I also
saw someone made a comment to the first patch of the series. If you
can address both issues and send v2 it'd be great. Anyways, as those
are trivial changes, I already added the series to my testing tree for
0-day build-testing.
Thanks
--
Gustavo
^ permalink raw reply
* Re: [PATCH] powerpc: Drop -me200 addition to build flags
From: Michael Ellerman @ 2020-11-17 23:15 UTC (permalink / raw)
To: Michael Ellerman, linuxppc-dev
Cc: oss, natechancellor, ndesaulniers, linux-kernel
In-Reply-To: <20201116120913.165317-1-mpe@ellerman.id.au>
On Mon, 16 Nov 2020 23:09:13 +1100, Michael Ellerman wrote:
> Currently a build with CONFIG_E200=y will fail with:
>
> Error: invalid switch -me200
> Error: unrecognized option -me200
>
> Upstream binutils has never supported an -me200 option. Presumably it
> was supported at some point by either a fork or Freescale internal
> binutils.
>
> [...]
Applied to powerpc/fixes.
[1/1] powerpc: Drop -me200 addition to build flags
https://git.kernel.org/powerpc/c/e02152ba2810f7c88cb54e71cda096268dfa9241
cheers
^ permalink raw reply
* Re: [PATCH 1/3] powerpc: boot: include compiler_attributes.h
From: Arvind Sankar @ 2020-11-17 22:30 UTC (permalink / raw)
To: Nick Desaulniers
Cc: clang-built-linux, Gustavo A . R . Silva, linux-kernel,
Miguel Ojeda, Paul Mackerras, Nathan Chancellor, linuxppc-dev
In-Reply-To: <20201116043532.4032932-2-ndesaulniers@google.com>
On Sun, Nov 15, 2020 at 08:35:30PM -0800, Nick Desaulniers wrote:
> The kernel uses `-include` to include include/linux/compiler_types.h
> into all translation units (see scripts/Makefile.lib), which #includes
> compiler_attributes.h.
>
> arch/powerpc/boot/ uses different compiler flags from the rest of the
> kernel. As such, it doesn't contain the definitions from these headers,
> and redefines a few that it needs.
>
> For the purpose of enabling -Wimplicit-fallthrough for ppc, include
> compiler_types.h via `-include`.
This should be "compiler_attributes.h".
>
> Link: https://github.com/ClangBuiltLinux/linux/issues/236
> Signed-off-by: Nick Desaulniers <ndesaulniers@google.com>
> ---
> We could just `#include "include/linux/compiler_types.h"` in the few .c
> sources used from lib/ (there are proper header guards in
> compiler_types.h).
>
> It was also noted in 6a9dc5fd6170 that we could -D__KERNEL__ and
> -include compiler_types.h like the main kernel does, though testing that
> produces a whole sea of warnings to cleanup. This approach is minimally
> invasive.
>
> arch/powerpc/boot/Makefile | 1 +
> arch/powerpc/boot/decompress.c | 1 -
> 2 files changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile
> index f8ce6d2dde7b..1659963a8f1d 100644
> --- a/arch/powerpc/boot/Makefile
> +++ b/arch/powerpc/boot/Makefile
> @@ -31,6 +31,7 @@ endif
> BOOTCFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
> -fno-strict-aliasing -O2 -msoft-float -mno-altivec -mno-vsx \
> -pipe -fomit-frame-pointer -fno-builtin -fPIC -nostdinc \
> + -include $(srctree)/include/linux/compiler_attributes.h \
> $(LINUXINCLUDE)
>
> ifdef CONFIG_PPC64_BOOT_WRAPPER
> diff --git a/arch/powerpc/boot/decompress.c b/arch/powerpc/boot/decompress.c
> index 8bf39ef7d2df..6098b879ac97 100644
> --- a/arch/powerpc/boot/decompress.c
> +++ b/arch/powerpc/boot/decompress.c
> @@ -21,7 +21,6 @@
>
> #define STATIC static
> #define INIT
> -#define __always_inline inline
>
> /*
> * The build process will copy the required zlib source files and headers
> --
> 2.29.2.299.gdc1121823c-goog
>
^ permalink raw reply
* Re: [PATCH 4/6] ibmvfc: add FC payload retrieval routines for versioned vfcFrames
From: Brian King @ 2020-11-17 22:14 UTC (permalink / raw)
To: Tyrel Datwyler, james.bottomley
Cc: brking, linuxppc-dev, linux-scsi, martin.petersen, linux-kernel
In-Reply-To: <20201112010442.102589-4-tyreld@linux.ibm.com>
On 11/11/20 7:04 PM, Tyrel Datwyler wrote:
> The FC iu and response payloads are located at different offsets
> depending on the ibmvfc_cmd version. This is a result of the version 2
> vfcFrame definition adding an extra 64bytes of reserved space to the
> structure prior to the payloads.
>
> Add helper routines to determine the current vfcFrame version and
> returning pointers to the proper iu or response structures within that
> ibmvfc_cmd.
>
> Signed-off-by: Tyrel Datwyler <tyreld@linux.ibm.com>
> ---
> drivers/scsi/ibmvscsi/ibmvfc.c | 76 ++++++++++++++++++++++++----------
> 1 file changed, 53 insertions(+), 23 deletions(-)
>
> diff --git a/drivers/scsi/ibmvscsi/ibmvfc.c b/drivers/scsi/ibmvscsi/ibmvfc.c
> index aa3445bec42c..5e666f7c9266 100644
> --- a/drivers/scsi/ibmvscsi/ibmvfc.c
> +++ b/drivers/scsi/ibmvscsi/ibmvfc.c
> @@ -138,6 +138,22 @@ static void ibmvfc_tgt_move_login(struct ibmvfc_target *);
>
> static const char *unknown_error = "unknown error";
>
> +static struct ibmvfc_fcp_cmd_iu *ibmvfc_get_fcp_iu(struct ibmvfc_host *vhost, struct ibmvfc_cmd *vfc_cmd)
> +{
> + if (be64_to_cpu(vhost->login_buf->resp.capabilities) & IBMVFC_HANDLE_VF_WWPN)
Suggest adding a flag to the vhost structure that you setup after login in order to
simplify this check and avoid chasing multiple pointers along with a byte swap.
Maybe something like:
vhost->is_v2
> + return &vfc_cmd->v2.iu;
> + else
> + return &vfc_cmd->v1.iu;
> +}
> +
> +static struct ibmvfc_fcp_rsp *ibmvfc_get_fcp_rsp(struct ibmvfc_host *vhost, struct ibmvfc_cmd *vfc_cmd)
> +{
> + if (be64_to_cpu(vhost->login_buf->resp.capabilities) & IBMVFC_HANDLE_VF_WWPN)
Same here
> + return &vfc_cmd->v2.rsp;
> + else
> + return &vfc_cmd->v1.rsp;
> +}
> +
> #ifdef CONFIG_SCSI_IBMVFC_TRACE
> /**
> * ibmvfc_trc_start - Log a start trace entry
--
Brian King
Power Linux I/O
IBM Linux Technology Center
^ permalink raw reply
* Re: [PATCH 2/3] Revert "lib: Revert use of fallthrough pseudo-keyword in lib/"
From: Nick Desaulniers @ 2020-11-17 22:28 UTC (permalink / raw)
To: Gustavo A. R. Silva
Cc: Miguel Ojeda, LKML, clang-built-linux, Paul Mackerras,
Nathan Chancellor, linuxppc-dev
In-Reply-To: <20201117221629.GA4679@embeddedor>
On Tue, Nov 17, 2020 at 2:16 PM Gustavo A. R. Silva
<gustavoars@kernel.org> wrote:
>
> I'm happy to take this series in my tree. I'm planing to send a
> pull-request for -rc5 with more related changes. So, I can include
> this in the same PR.
>
> In the meantime I'll add this to my testing tree, so it can be
> build-tested by the 0-day folks. :)
SGTM, and thank you. I'm sure you saw the existing warning about
indentation. Do we want to modify the revert patch, or put another
patch on top?
--
Thanks,
~Nick Desaulniers
^ permalink raw reply
* Re: [PATCH 6/6] ibmvfc: advertise client support for targetWWPN using v2 commands
From: Brian King @ 2020-11-17 22:23 UTC (permalink / raw)
To: Tyrel Datwyler, james.bottomley
Cc: brking, linuxppc-dev, linux-scsi, martin.petersen, linux-kernel
In-Reply-To: <20201112010442.102589-6-tyreld@linux.ibm.com>
Everything else in this series looks OK to me.
Thanks,
Brian
--
Brian King
Power Linux I/O
IBM Linux Technology Center
^ permalink raw reply
* Re: [PATCH 4/6] ibmvfc: add FC payload retrieval routines for versioned vfcFrames
From: Brian King @ 2020-11-17 22:21 UTC (permalink / raw)
To: Tyrel Datwyler, james.bottomley
Cc: brking, linuxppc-dev, linux-scsi, martin.petersen, linux-kernel
In-Reply-To: <9e38f449-d2e6-6408-4fef-cfb5351393cc@linux.vnet.ibm.com>
On 11/17/20 4:14 PM, Brian King wrote:
> On 11/11/20 7:04 PM, Tyrel Datwyler wrote:
>> The FC iu and response payloads are located at different offsets
>> depending on the ibmvfc_cmd version. This is a result of the version 2
>> vfcFrame definition adding an extra 64bytes of reserved space to the
>> structure prior to the payloads.
>>
>> Add helper routines to determine the current vfcFrame version and
>> returning pointers to the proper iu or response structures within that
>> ibmvfc_cmd.
>>
>> Signed-off-by: Tyrel Datwyler <tyreld@linux.ibm.com>
>> ---
>> drivers/scsi/ibmvscsi/ibmvfc.c | 76 ++++++++++++++++++++++++----------
>> 1 file changed, 53 insertions(+), 23 deletions(-)
>>
>> diff --git a/drivers/scsi/ibmvscsi/ibmvfc.c b/drivers/scsi/ibmvscsi/ibmvfc.c
>> index aa3445bec42c..5e666f7c9266 100644
>> --- a/drivers/scsi/ibmvscsi/ibmvfc.c
>> +++ b/drivers/scsi/ibmvscsi/ibmvfc.c
>> @@ -138,6 +138,22 @@ static void ibmvfc_tgt_move_login(struct ibmvfc_target *);
>>
>> static const char *unknown_error = "unknown error";
>>
>> +static struct ibmvfc_fcp_cmd_iu *ibmvfc_get_fcp_iu(struct ibmvfc_host *vhost, struct ibmvfc_cmd *vfc_cmd)
>> +{
>> + if (be64_to_cpu(vhost->login_buf->resp.capabilities) & IBMVFC_HANDLE_VF_WWPN)
>
> Suggest adding a flag to the vhost structure that you setup after login in order to
> simplify this check and avoid chasing multiple pointers along with a byte swap.
>
> Maybe something like:
>
> vhost->is_v2
Even better might be vhost->version which you'd set to 1 or 2 and then you could directly
use that to set the field in the command structures later.
--
Brian King
Power Linux I/O
IBM Linux Technology Center
^ permalink raw reply
* Re: [PATCH 2/3] Revert "lib: Revert use of fallthrough pseudo-keyword in lib/"
From: Gustavo A. R. Silva @ 2020-11-17 22:16 UTC (permalink / raw)
To: Nick Desaulniers
Cc: Miguel Ojeda, LKML, clang-built-linux, Paul Mackerras,
Nathan Chancellor, linuxppc-dev
In-Reply-To: <CAKwvOdk_sphJGQarEWJLzGZWkdzO9dqmcRmys3Retw3vn2Fwag@mail.gmail.com>
On Tue, Nov 17, 2020 at 11:10:26AM -0800, Nick Desaulniers wrote:
> On Mon, Nov 16, 2020 at 7:02 PM Nathan Chancellor
> <natechancellor@gmail.com> wrote:
> >
> > On Sun, Nov 15, 2020 at 08:35:31PM -0800, Nick Desaulniers wrote:
> > > This reverts commit 6a9dc5fd6170 ("lib: Revert use of fallthrough
> > > pseudo-keyword in lib/")
>
> Gustavo, whose tree did 6a9dc5fd6170 and df561f6688fe go up to
Mine.
> mainline in? I'm not sure whether you or MPE (ppc) or someone else
> should pick it this series?
I'm happy to take this series in my tree. I'm planing to send a
pull-request for -rc5 with more related changes. So, I can include
this in the same PR.
In the meantime I'll add this to my testing tree, so it can be
build-tested by the 0-day folks. :)
Thanks
--
Gustavo
>
> > >
> > > Now that we can build arch/powerpc/boot/ free of -Wimplicit-fallthrough,
> > > re-enable these fixes for lib/.
> > >
> > > Link: https://github.com/ClangBuiltLinux/linux/issues/236
> > > Signed-off-by: Nick Desaulniers <ndesaulniers@google.com>
> >
> > Reviewed-by: Nathan Chancellor <natechancellor@gmail.com>
> > Tested-by: Nathan Chancellor <natechancellor@gmail.com>
> >
> > > ---
> > > lib/asn1_decoder.c | 4 ++--
> > > lib/assoc_array.c | 2 +-
> > > lib/bootconfig.c | 4 ++--
> > > lib/cmdline.c | 10 +++++-----
> > > lib/dim/net_dim.c | 2 +-
> > > lib/dim/rdma_dim.c | 4 ++--
> > > lib/glob.c | 2 +-
> > > lib/siphash.c | 36 ++++++++++++++++++------------------
> > > lib/ts_fsm.c | 2 +-
> > > lib/vsprintf.c | 14 +++++++-------
> > > lib/xz/xz_dec_lzma2.c | 4 ++--
> > > lib/xz/xz_dec_stream.c | 16 ++++++++--------
> > > lib/zstd/bitstream.h | 10 +++++-----
> > > lib/zstd/compress.c | 2 +-
> > > lib/zstd/decompress.c | 12 ++++++------
> > > lib/zstd/huf_compress.c | 4 ++--
> > > 16 files changed, 64 insertions(+), 64 deletions(-)
> > >
> > > diff --git a/lib/asn1_decoder.c b/lib/asn1_decoder.c
> > > index 58f72b25f8e9..13da529e2e72 100644
> > > --- a/lib/asn1_decoder.c
> > > +++ b/lib/asn1_decoder.c
> > > @@ -381,7 +381,7 @@ int asn1_ber_decoder(const struct asn1_decoder *decoder,
> > > case ASN1_OP_END_SET_ACT:
> > > if (unlikely(!(flags & FLAG_MATCHED)))
> > > goto tag_mismatch;
> > > - /* fall through */
> > > + fallthrough;
> > >
> > > case ASN1_OP_END_SEQ:
> > > case ASN1_OP_END_SET_OF:
> > > @@ -448,7 +448,7 @@ int asn1_ber_decoder(const struct asn1_decoder *decoder,
> > > pc += asn1_op_lengths[op];
> > > goto next_op;
> > > }
> > > - /* fall through */
> > > + fallthrough;
> > >
> > > case ASN1_OP_ACT:
> > > ret = actions[machine[pc + 1]](context, hdr, tag, data + tdp, len);
> > > diff --git a/lib/assoc_array.c b/lib/assoc_array.c
> > > index 6f4bcf524554..04c98799c3ba 100644
> > > --- a/lib/assoc_array.c
> > > +++ b/lib/assoc_array.c
> > > @@ -1113,7 +1113,7 @@ struct assoc_array_edit *assoc_array_delete(struct assoc_array *array,
> > > index_key))
> > > goto found_leaf;
> > > }
> > > - /* fall through */
> > > + fallthrough;
> > > case assoc_array_walk_tree_empty:
> > > case assoc_array_walk_found_wrong_shortcut:
> > > default:
> > > diff --git a/lib/bootconfig.c b/lib/bootconfig.c
> > > index 649ed44f199c..9f8c70a98fcf 100644
> > > --- a/lib/bootconfig.c
> > > +++ b/lib/bootconfig.c
> > > @@ -827,7 +827,7 @@ int __init xbc_init(char *buf, const char **emsg, int *epos)
> > > q - 2);
> > > break;
> > > }
> > > - /* fall through */
> > > + fallthrough;
> > > case '=':
> > > ret = xbc_parse_kv(&p, q, c);
> > > break;
> > > @@ -836,7 +836,7 @@ int __init xbc_init(char *buf, const char **emsg, int *epos)
> > > break;
> > > case '#':
> > > q = skip_comment(q);
> > > - /* fall through */
> > > + fallthrough;
> > > case ';':
> > > case '\n':
> > > ret = xbc_parse_key(&p, q);
> > > diff --git a/lib/cmdline.c b/lib/cmdline.c
> > > index 9e186234edc0..46f2cb4ce6d1 100644
> > > --- a/lib/cmdline.c
> > > +++ b/lib/cmdline.c
> > > @@ -144,23 +144,23 @@ unsigned long long memparse(const char *ptr, char **retptr)
> > > case 'E':
> > > case 'e':
> > > ret <<= 10;
> > > - /* fall through */
> > > + fallthrough;
> > > case 'P':
> > > case 'p':
> > > ret <<= 10;
> > > - /* fall through */
> > > + fallthrough;
> > > case 'T':
> > > case 't':
> > > ret <<= 10;
> > > - /* fall through */
> > > + fallthrough;
> > > case 'G':
> > > case 'g':
> > > ret <<= 10;
> > > - /* fall through */
> > > + fallthrough;
> > > case 'M':
> > > case 'm':
> > > ret <<= 10;
> > > - /* fall through */
> > > + fallthrough;
> > > case 'K':
> > > case 'k':
> > > ret <<= 10;
> > > diff --git a/lib/dim/net_dim.c b/lib/dim/net_dim.c
> > > index a4db51c21266..06811d866775 100644
> > > --- a/lib/dim/net_dim.c
> > > +++ b/lib/dim/net_dim.c
> > > @@ -233,7 +233,7 @@ void net_dim(struct dim *dim, struct dim_sample end_sample)
> > > schedule_work(&dim->work);
> > > break;
> > > }
> > > - /* fall through */
> > > + fallthrough;
> > > case DIM_START_MEASURE:
> > > dim_update_sample(end_sample.event_ctr, end_sample.pkt_ctr,
> > > end_sample.byte_ctr, &dim->start_sample);
> > > diff --git a/lib/dim/rdma_dim.c b/lib/dim/rdma_dim.c
> > > index f7e26c7b4749..15462d54758d 100644
> > > --- a/lib/dim/rdma_dim.c
> > > +++ b/lib/dim/rdma_dim.c
> > > @@ -59,7 +59,7 @@ static bool rdma_dim_decision(struct dim_stats *curr_stats, struct dim *dim)
> > > break;
> > > case DIM_STATS_WORSE:
> > > dim_turn(dim);
> > > - /* fall through */
> > > + fallthrough;
> > > case DIM_STATS_BETTER:
> > > step_res = rdma_dim_step(dim);
> > > if (step_res == DIM_ON_EDGE)
> > > @@ -94,7 +94,7 @@ void rdma_dim(struct dim *dim, u64 completions)
> > > schedule_work(&dim->work);
> > > break;
> > > }
> > > - /* fall through */
> > > + fallthrough;
> > > case DIM_START_MEASURE:
> > > dim->state = DIM_MEASURE_IN_PROGRESS;
> > > dim_update_sample_with_comps(curr_sample->event_ctr, 0, 0,
> > > diff --git a/lib/glob.c b/lib/glob.c
> > > index 52e3ed7e4a9b..85ecbda45cd8 100644
> > > --- a/lib/glob.c
> > > +++ b/lib/glob.c
> > > @@ -102,7 +102,7 @@ bool __pure glob_match(char const *pat, char const *str)
> > > break;
> > > case '\\':
> > > d = *pat++;
> > > - /* fall through */
> > > + fallthrough;
> > > default: /* Literal character */
> > > literal:
> > > if (c == d) {
> > > diff --git a/lib/siphash.c b/lib/siphash.c
> > > index c47bb6ff2149..a90112ee72a1 100644
> > > --- a/lib/siphash.c
> > > +++ b/lib/siphash.c
> > > @@ -68,11 +68,11 @@ u64 __siphash_aligned(const void *data, size_t len, const siphash_key_t *key)
> > > bytemask_from_count(left)));
> > > #else
> > > switch (left) {
> > > - case 7: b |= ((u64)end[6]) << 48; /* fall through */
> > > - case 6: b |= ((u64)end[5]) << 40; /* fall through */
> > > - case 5: b |= ((u64)end[4]) << 32; /* fall through */
> > > + case 7: b |= ((u64)end[6]) << 48; fallthrough;
> > > + case 6: b |= ((u64)end[5]) << 40; fallthrough;
> > > + case 5: b |= ((u64)end[4]) << 32; fallthrough;
> > > case 4: b |= le32_to_cpup(data); break;
> > > - case 3: b |= ((u64)end[2]) << 16; /* fall through */
> > > + case 3: b |= ((u64)end[2]) << 16; fallthrough;
> > > case 2: b |= le16_to_cpup(data); break;
> > > case 1: b |= end[0];
> > > }
> > > @@ -101,11 +101,11 @@ u64 __siphash_unaligned(const void *data, size_t len, const siphash_key_t *key)
> > > bytemask_from_count(left)));
> > > #else
> > > switch (left) {
> > > - case 7: b |= ((u64)end[6]) << 48; /* fall through */
> > > - case 6: b |= ((u64)end[5]) << 40; /* fall through */
> > > - case 5: b |= ((u64)end[4]) << 32; /* fall through */
> > > + case 7: b |= ((u64)end[6]) << 48; fallthrough;
> > > + case 6: b |= ((u64)end[5]) << 40; fallthrough;
> > > + case 5: b |= ((u64)end[4]) << 32; fallthrough;
> > > case 4: b |= get_unaligned_le32(end); break;
> > > - case 3: b |= ((u64)end[2]) << 16; /* fall through */
> > > + case 3: b |= ((u64)end[2]) << 16; fallthrough;
> > > case 2: b |= get_unaligned_le16(end); break;
> > > case 1: b |= end[0];
> > > }
> > > @@ -268,11 +268,11 @@ u32 __hsiphash_aligned(const void *data, size_t len, const hsiphash_key_t *key)
> > > bytemask_from_count(left)));
> > > #else
> > > switch (left) {
> > > - case 7: b |= ((u64)end[6]) << 48; /* fall through */
> > > - case 6: b |= ((u64)end[5]) << 40; /* fall through */
> > > - case 5: b |= ((u64)end[4]) << 32; /* fall through */
> > > + case 7: b |= ((u64)end[6]) << 48; fallthrough;
> > > + case 6: b |= ((u64)end[5]) << 40; fallthrough;
> > > + case 5: b |= ((u64)end[4]) << 32; fallthrough;
> > > case 4: b |= le32_to_cpup(data); break;
> > > - case 3: b |= ((u64)end[2]) << 16; /* fall through */
> > > + case 3: b |= ((u64)end[2]) << 16; fallthrough;
> > > case 2: b |= le16_to_cpup(data); break;
> > > case 1: b |= end[0];
> > > }
> > > @@ -301,11 +301,11 @@ u32 __hsiphash_unaligned(const void *data, size_t len,
> > > bytemask_from_count(left)));
> > > #else
> > > switch (left) {
> > > - case 7: b |= ((u64)end[6]) << 48; /* fall through */
> > > - case 6: b |= ((u64)end[5]) << 40; /* fall through */
> > > - case 5: b |= ((u64)end[4]) << 32; /* fall through */
> > > + case 7: b |= ((u64)end[6]) << 48; fallthrough;
> > > + case 6: b |= ((u64)end[5]) << 40; fallthrough;
> > > + case 5: b |= ((u64)end[4]) << 32; fallthrough;
> > > case 4: b |= get_unaligned_le32(end); break;
> > > - case 3: b |= ((u64)end[2]) << 16; /* fall through */
> > > + case 3: b |= ((u64)end[2]) << 16; fallthrough;
> > > case 2: b |= get_unaligned_le16(end); break;
> > > case 1: b |= end[0];
> > > }
> > > @@ -431,7 +431,7 @@ u32 __hsiphash_aligned(const void *data, size_t len, const hsiphash_key_t *key)
> > > v0 ^= m;
> > > }
> > > switch (left) {
> > > - case 3: b |= ((u32)end[2]) << 16; /* fall through */
> > > + case 3: b |= ((u32)end[2]) << 16; fallthrough;
> > > case 2: b |= le16_to_cpup(data); break;
> > > case 1: b |= end[0];
> > > }
> > > @@ -454,7 +454,7 @@ u32 __hsiphash_unaligned(const void *data, size_t len,
> > > v0 ^= m;
> > > }
> > > switch (left) {
> > > - case 3: b |= ((u32)end[2]) << 16; /* fall through */
> > > + case 3: b |= ((u32)end[2]) << 16; fallthrough;
> > > case 2: b |= get_unaligned_le16(end); break;
> > > case 1: b |= end[0];
> > > }
> > > diff --git a/lib/ts_fsm.c b/lib/ts_fsm.c
> > > index ab749ec10ab5..64fd9015ad80 100644
> > > --- a/lib/ts_fsm.c
> > > +++ b/lib/ts_fsm.c
> > > @@ -193,7 +193,7 @@ static unsigned int fsm_find(struct ts_config *conf, struct ts_state *state)
> > > TOKEN_MISMATCH();
> > >
> > > block_idx++;
> > > - /* fall through */
> > > + fallthrough;
> > >
> > > case TS_FSM_ANY:
> > > if (next == NULL)
> > > diff --git a/lib/vsprintf.c b/lib/vsprintf.c
> > > index 14c9a6af1b23..d3c5c16f391c 100644
> > > --- a/lib/vsprintf.c
> > > +++ b/lib/vsprintf.c
> > > @@ -1265,7 +1265,7 @@ char *mac_address_string(char *buf, char *end, u8 *addr,
> > >
> > > case 'R':
> > > reversed = true;
> > > - /* fall through */
> > > + fallthrough;
> > >
> > > default:
> > > separator = ':';
> > > @@ -1682,7 +1682,7 @@ char *uuid_string(char *buf, char *end, const u8 *addr,
> > > switch (*(++fmt)) {
> > > case 'L':
> > > uc = true;
> > > - /* fall through */
> > > + fallthrough;
> > > case 'l':
> > > index = guid_index;
> > > break;
> > > @@ -2219,7 +2219,7 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr,
> > > case 'S':
> > > case 's':
> > > ptr = dereference_symbol_descriptor(ptr);
> > > - /* fall through */
> > > + fallthrough;
> > > case 'B':
> > > return symbol_string(buf, end, ptr, spec, fmt);
> > > case 'R':
> > > @@ -2450,7 +2450,7 @@ int format_decode(const char *fmt, struct printf_spec *spec)
> > >
> > > case 'x':
> > > spec->flags |= SMALL;
> > > - /* fall through */
> > > + fallthrough;
> > >
> > > case 'X':
> > > spec->base = 16;
> > > @@ -2468,7 +2468,7 @@ int format_decode(const char *fmt, struct printf_spec *spec)
> > > * utility, treat it as any other invalid or
> > > * unsupported format specifier.
> > > */
> > > - /* fall through */
> > > + fallthrough;
> > >
> > > default:
> > > WARN_ONCE(1, "Please remove unsupported %%%c in format string\n", *fmt);
> > > @@ -3411,10 +3411,10 @@ int vsscanf(const char *buf, const char *fmt, va_list args)
> > > break;
> > > case 'i':
> > > base = 0;
> > > - /* fall through */
> > > + fallthrough;
> > > case 'd':
> > > is_sign = true;
> > > - /* fall through */
> > > + fallthrough;
> > > case 'u':
> > > break;
> > > case '%':
> > > diff --git a/lib/xz/xz_dec_lzma2.c b/lib/xz/xz_dec_lzma2.c
> > > index 65a1aad8c223..ca2603abee08 100644
> > > --- a/lib/xz/xz_dec_lzma2.c
> > > +++ b/lib/xz/xz_dec_lzma2.c
> > > @@ -1043,7 +1043,7 @@ XZ_EXTERN enum xz_ret xz_dec_lzma2_run(struct xz_dec_lzma2 *s,
> > >
> > > s->lzma2.sequence = SEQ_LZMA_PREPARE;
> > >
> > > - /* fall through */
> > > + fallthrough;
> > >
> > > case SEQ_LZMA_PREPARE:
> > > if (s->lzma2.compressed < RC_INIT_BYTES)
> > > @@ -1055,7 +1055,7 @@ XZ_EXTERN enum xz_ret xz_dec_lzma2_run(struct xz_dec_lzma2 *s,
> > > s->lzma2.compressed -= RC_INIT_BYTES;
> > > s->lzma2.sequence = SEQ_LZMA_RUN;
> > >
> > > - /* fall through */
> > > + fallthrough;
> > >
> > > case SEQ_LZMA_RUN:
> > > /*
> > > diff --git a/lib/xz/xz_dec_stream.c b/lib/xz/xz_dec_stream.c
> > > index 32ab2a08b7cb..fea86deaaa01 100644
> > > --- a/lib/xz/xz_dec_stream.c
> > > +++ b/lib/xz/xz_dec_stream.c
> > > @@ -583,7 +583,7 @@ static enum xz_ret dec_main(struct xz_dec *s, struct xz_buf *b)
> > > if (ret != XZ_OK)
> > > return ret;
> > >
> > > - /* fall through */
> > > + fallthrough;
> > >
> > > case SEQ_BLOCK_START:
> > > /* We need one byte of input to continue. */
> > > @@ -608,7 +608,7 @@ static enum xz_ret dec_main(struct xz_dec *s, struct xz_buf *b)
> > > s->temp.pos = 0;
> > > s->sequence = SEQ_BLOCK_HEADER;
> > >
> > > - /* fall through */
> > > + fallthrough;
> > >
> > > case SEQ_BLOCK_HEADER:
> > > if (!fill_temp(s, b))
> > > @@ -620,7 +620,7 @@ static enum xz_ret dec_main(struct xz_dec *s, struct xz_buf *b)
> > >
> > > s->sequence = SEQ_BLOCK_UNCOMPRESS;
> > >
> > > - /* fall through */
> > > + fallthrough;
> > >
> > > case SEQ_BLOCK_UNCOMPRESS:
> > > ret = dec_block(s, b);
> > > @@ -629,7 +629,7 @@ static enum xz_ret dec_main(struct xz_dec *s, struct xz_buf *b)
> > >
> > > s->sequence = SEQ_BLOCK_PADDING;
> > >
> > > - /* fall through */
> > > + fallthrough;
> > >
> > > case SEQ_BLOCK_PADDING:
> > > /*
> > > @@ -651,7 +651,7 @@ static enum xz_ret dec_main(struct xz_dec *s, struct xz_buf *b)
> > >
> > > s->sequence = SEQ_BLOCK_CHECK;
> > >
> > > - /* fall through */
> > > + fallthrough;
> > >
> > > case SEQ_BLOCK_CHECK:
> > > if (s->check_type == XZ_CHECK_CRC32) {
> > > @@ -675,7 +675,7 @@ static enum xz_ret dec_main(struct xz_dec *s, struct xz_buf *b)
> > >
> > > s->sequence = SEQ_INDEX_PADDING;
> > >
> > > - /* fall through */
> > > + fallthrough;
> > >
> > > case SEQ_INDEX_PADDING:
> > > while ((s->index.size + (b->in_pos - s->in_start))
> > > @@ -699,7 +699,7 @@ static enum xz_ret dec_main(struct xz_dec *s, struct xz_buf *b)
> > >
> > > s->sequence = SEQ_INDEX_CRC32;
> > >
> > > - /* fall through */
> > > + fallthrough;
> > >
> > > case SEQ_INDEX_CRC32:
> > > ret = crc32_validate(s, b);
> > > @@ -709,7 +709,7 @@ static enum xz_ret dec_main(struct xz_dec *s, struct xz_buf *b)
> > > s->temp.size = STREAM_HEADER_SIZE;
> > > s->sequence = SEQ_STREAM_FOOTER;
> > >
> > > - /* fall through */
> > > + fallthrough;
> > >
> > > case SEQ_STREAM_FOOTER:
> > > if (!fill_temp(s, b))
> > > diff --git a/lib/zstd/bitstream.h b/lib/zstd/bitstream.h
> > > index 3a49784d5c61..7c65c66e41fd 100644
> > > --- a/lib/zstd/bitstream.h
> > > +++ b/lib/zstd/bitstream.h
> > > @@ -259,15 +259,15 @@ ZSTD_STATIC size_t BIT_initDStream(BIT_DStream_t *bitD, const void *srcBuffer, s
> > > bitD->bitContainer = *(const BYTE *)(bitD->start);
> > > switch (srcSize) {
> > > case 7: bitD->bitContainer += (size_t)(((const BYTE *)(srcBuffer))[6]) << (sizeof(bitD->bitContainer) * 8 - 16);
> > > - /* fall through */
> > > + fallthrough;
> > > case 6: bitD->bitContainer += (size_t)(((const BYTE *)(srcBuffer))[5]) << (sizeof(bitD->bitContainer) * 8 - 24);
> > > - /* fall through */
> > > + fallthrough;
> > > case 5: bitD->bitContainer += (size_t)(((const BYTE *)(srcBuffer))[4]) << (sizeof(bitD->bitContainer) * 8 - 32);
> > > - /* fall through */
> > > + fallthrough;
> > > case 4: bitD->bitContainer += (size_t)(((const BYTE *)(srcBuffer))[3]) << 24;
> > > - /* fall through */
> > > + fallthrough;
> > > case 3: bitD->bitContainer += (size_t)(((const BYTE *)(srcBuffer))[2]) << 16;
> > > - /* fall through */
> > > + fallthrough;
> > > case 2: bitD->bitContainer += (size_t)(((const BYTE *)(srcBuffer))[1]) << 8;
> > > default:;
> > > }
> > > diff --git a/lib/zstd/compress.c b/lib/zstd/compress.c
> > > index 5e0b67003e55..b080264ed3ad 100644
> > > --- a/lib/zstd/compress.c
> > > +++ b/lib/zstd/compress.c
> > > @@ -3182,7 +3182,7 @@ static size_t ZSTD_compressStream_generic(ZSTD_CStream *zcs, void *dst, size_t *
> > > zcs->outBuffFlushedSize = 0;
> > > zcs->stage = zcss_flush; /* pass-through to flush stage */
> > > }
> > > - /* fall through */
> > > + fallthrough;
> > >
> > > case zcss_flush: {
> > > size_t const toFlush = zcs->outBuffContentSize - zcs->outBuffFlushedSize;
> > > diff --git a/lib/zstd/decompress.c b/lib/zstd/decompress.c
> > > index db6761ea4deb..66cd487a326a 100644
> > > --- a/lib/zstd/decompress.c
> > > +++ b/lib/zstd/decompress.c
> > > @@ -442,7 +442,7 @@ size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx *dctx, const void *src, size_t srcSize
> > > case set_repeat:
> > > if (dctx->litEntropy == 0)
> > > return ERROR(dictionary_corrupted);
> > > - /* fall through */
> > > + fallthrough;
> > > case set_compressed:
> > > if (srcSize < 5)
> > > return ERROR(corruption_detected); /* srcSize >= MIN_CBLOCK_SIZE == 3; here we need up to 5 for case 3 */
> > > @@ -1768,7 +1768,7 @@ size_t ZSTD_decompressContinue(ZSTD_DCtx *dctx, void *dst, size_t dstCapacity, c
> > > return 0;
> > > }
> > > dctx->expected = 0; /* not necessary to copy more */
> > > - /* fall through */
> > > + fallthrough;
> > >
> > > case ZSTDds_decodeFrameHeader:
> > > memcpy(dctx->headerBuffer + ZSTD_frameHeaderSize_prefix, src, dctx->expected);
> > > @@ -2309,7 +2309,7 @@ size_t ZSTD_decompressStream(ZSTD_DStream *zds, ZSTD_outBuffer *output, ZSTD_inB
> > > switch (zds->stage) {
> > > case zdss_init:
> > > ZSTD_resetDStream(zds); /* transparent reset on starting decoding a new frame */
> > > - /* fall through */
> > > + fallthrough;
> > >
> > > case zdss_loadHeader: {
> > > size_t const hSize = ZSTD_getFrameParams(&zds->fParams, zds->headerBuffer, zds->lhSize);
> > > @@ -2376,7 +2376,7 @@ size_t ZSTD_decompressStream(ZSTD_DStream *zds, ZSTD_outBuffer *output, ZSTD_inB
> > > }
> > > zds->stage = zdss_read;
> > > }
> > > - /* fall through */
> > > + fallthrough;
> > >
> > > case zdss_read: {
> > > size_t const neededInSize = ZSTD_nextSrcSizeToDecompress(zds->dctx);
> > > @@ -2405,7 +2405,7 @@ size_t ZSTD_decompressStream(ZSTD_DStream *zds, ZSTD_outBuffer *output, ZSTD_inB
> > > zds->stage = zdss_load;
> > > /* pass-through */
> > > }
> > > - /* fall through */
> > > + fallthrough;
> > >
> > > case zdss_load: {
> > > size_t const neededInSize = ZSTD_nextSrcSizeToDecompress(zds->dctx);
> > > @@ -2438,7 +2438,7 @@ size_t ZSTD_decompressStream(ZSTD_DStream *zds, ZSTD_outBuffer *output, ZSTD_inB
> > > /* pass-through */
> > > }
> > > }
> > > - /* fall through */
> > > + fallthrough;
> > >
> > > case zdss_flush: {
> > > size_t const toFlushSize = zds->outEnd - zds->outStart;
> > > diff --git a/lib/zstd/huf_compress.c b/lib/zstd/huf_compress.c
> > > index e727812d12aa..08b4ae80aed4 100644
> > > --- a/lib/zstd/huf_compress.c
> > > +++ b/lib/zstd/huf_compress.c
> > > @@ -556,9 +556,9 @@ size_t HUF_compress1X_usingCTable(void *dst, size_t dstSize, const void *src, si
> > > n = srcSize & ~3; /* join to mod 4 */
> > > switch (srcSize & 3) {
> > > case 3: HUF_encodeSymbol(&bitC, ip[n + 2], CTable); HUF_FLUSHBITS_2(&bitC);
> > > - /* fall through */
> > > + fallthrough;
> > > case 2: HUF_encodeSymbol(&bitC, ip[n + 1], CTable); HUF_FLUSHBITS_1(&bitC);
> > > - /* fall through */
> > > + fallthrough;
> > > case 1: HUF_encodeSymbol(&bitC, ip[n + 0], CTable); HUF_FLUSHBITS(&bitC);
> > > case 0:
> > > default:;
> > > --
> > > 2.29.2.299.gdc1121823c-goog
> > >
>
>
>
> --
> Thanks,
> ~Nick Desaulniers
^ permalink raw reply
* Re: [PATCH 3/6] ibmvfc: add new fields for version 2 of several MADs
From: Brian King @ 2020-11-17 22:06 UTC (permalink / raw)
To: Tyrel Datwyler, james.bottomley
Cc: brking, linuxppc-dev, linux-scsi, martin.petersen, linux-kernel
In-Reply-To: <20201112010442.102589-3-tyreld@linux.ibm.com>
On 11/11/20 7:04 PM, Tyrel Datwyler wrote:
> @@ -211,7 +214,9 @@ struct ibmvfc_npiv_login_resp {
> __be64 capabilities;
> #define IBMVFC_CAN_FLUSH_ON_HALT 0x08
> #define IBMVFC_CAN_SUPPRESS_ABTS 0x10
> -#define IBMVFC_CAN_SUPPORT_CHANNELS 0x20
> +#define IBMVFC_MAD_VERSION_CAP 0x20
> +#define IBMVFC_HANDLE_VF_WWPN 0x40
> +#define IBMVFC_CAN_SUPPORT_CHANNELS 0x80
> __be32 max_cmds;
> __be32 scsi_id_sz;
> __be64 max_dma_len;
> @@ -293,6 +298,7 @@ struct ibmvfc_port_login {
> __be32 reserved2;
> struct ibmvfc_service_parms service_parms;
> struct ibmvfc_service_parms service_parms_change;
> + __be64 targetWWPN;
For consistency, can you make this target_wwpn?
> __be64 reserved3[2];
> } __packed __aligned(8);
>
> @@ -344,6 +350,7 @@ struct ibmvfc_process_login {
> __be16 status;
> __be16 error; /* also fc_reason */
> __be32 reserved2;
> + __be64 targetWWPN;
For consistency, can you make this target_wwpn?
> __be64 reserved3[2];
> } __packed __aligned(8);
>
> @@ -378,6 +385,8 @@ struct ibmvfc_tmf {
> __be32 cancel_key;
> __be32 my_cancel_key;
> __be32 pad;
> + __be64 targetWWPN;
For consistency, can you make this target_wwpn?
> + __be64 taskTag;
and make this task_tag.
> __be64 reserved[2];
> } __packed __aligned(8);
>
> @@ -474,9 +483,19 @@ struct ibmvfc_cmd {
> __be64 correlation;
> __be64 tgt_scsi_id;
> __be64 tag;
> - __be64 reserved3[2];
> - struct ibmvfc_fcp_cmd_iu iu;
> - struct ibmvfc_fcp_rsp rsp;
> + __be64 targetWWPN;
For consistency, can you make this target_wwpn?
> + __be64 reserved3;
> + union {
> + struct {
> + struct ibmvfc_fcp_cmd_iu iu;
> + struct ibmvfc_fcp_rsp rsp;
> + } v1;
> + struct {
> + __be64 reserved4;
> + struct ibmvfc_fcp_cmd_iu iu;
> + struct ibmvfc_fcp_rsp rsp;
> + } v2;
> + };
> } __packed __aligned(8);
>
> struct ibmvfc_passthru_fc_iu {
> @@ -503,6 +522,7 @@ struct ibmvfc_passthru_iu {
> __be64 correlation;
> __be64 scsi_id;
> __be64 tag;
> + __be64 targetWWPN;
For consistency, can you make this target_wwpn?
> __be64 reserved2[2];
> } __packed __aligned(8);
>
>
--
Brian King
Power Linux I/O
IBM Linux Technology Center
^ permalink raw reply
* Re: [PATCH 1/2] kbuild: Hoist '--orphan-handling' into Kconfig
From: Kees Cook @ 2020-11-17 21:52 UTC (permalink / raw)
To: Nathan Chancellor
Cc: Michal Marek, linux-kbuild, Catalin Marinas, Masahiro Yamada, x86,
Nick Desaulniers, Russell King, linux-kernel, linuxppc-dev,
Arvind Sankar, Ingo Molnar, Borislav Petkov, clang-built-linux,
Thomas Gleixner, Will Deacon, linux-arm-kernel
In-Reply-To: <20201113195553.1487659-1-natechancellor@gmail.com>
On Fri, Nov 13, 2020 at 12:55:52PM -0700, Nathan Chancellor wrote:
> Currently, '--orphan-handling=warn' is spread out across four different
> architectures in their respective Makefiles, which makes it a little
> unruly to deal with in case it needs to be disabled for a specific
> linker version (in this case, ld.lld 10.0.1).
>
> To make it easier to control this, hoist this warning into Kconfig and
> the main Makefile so that disabling it is simpler, as the warning will
> only be enabled in a couple places (main Makefile and a couple of
> compressed boot folders that blow away LDFLAGS_vmlinx) and making it
> conditional is easier due to Kconfig syntax. One small additional
> benefit of this is saving a call to ld-option on incremental builds
> because we will have already evaluated it for CONFIG_LD_ORPHAN_WARN.
>
> To keep the list of supported architectures the same, introduce
> CONFIG_ARCH_WANT_LD_ORPHAN_WARN, which an architecture can select to
> gain this automatically after all of the sections are specified and size
> asserted. A special thanks to Kees Cook for the help text on this
> config.
>
> Link: https://github.com/ClangBuiltLinux/linux/issues/1187
> Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
Looks good to me. With the other suggestions from the thread added,
please consider it:
Acked-by: Kees Cook <keescook@chromium.org>
--
Kees Cook
^ permalink raw reply
* Re: [PATCH 2/2] kbuild: Disable CONFIG_LD_ORPHAN_WARN for ld.lld 10.0.1
From: Kees Cook @ 2020-11-17 21:51 UTC (permalink / raw)
To: Nathan Chancellor
Cc: Michal Marek, kernelci . org bot, linux-kbuild, Mark Brown,
Catalin Marinas, Masahiro Yamada, x86, Nick Desaulniers,
Russell King, linux-kernel, linuxppc-dev, Arvind Sankar,
Ingo Molnar, Borislav Petkov, clang-built-linux, Thomas Gleixner,
Will Deacon, linux-arm-kernel
In-Reply-To: <20201113195553.1487659-2-natechancellor@gmail.com>
On Fri, Nov 13, 2020 at 12:55:53PM -0700, Nathan Chancellor wrote:
> config LD_ORPHAN_WARN
> - def_bool ARCH_WANT_LD_ORPHAN_WARN && $(ld-option,--orphan-handling=warn)
> + def_bool ARCH_WANT_LD_ORPHAN_WARN && $(ld-option,--orphan-handling=warn) && (!LD_IS_LLD || LLD_VERSION >= 110000)
Readability nit-pick... I prefer separate "depends" lines to make things
a little easier to parse, change, etc:
config LD_ORPHAN_WARN
def_bool y
depends on ARCH_WANT_LD_ORPHAN_WARN
depends on !LD_IS_LLD || LLD_VERSION >= 110000
depends on $(ld-option,--orphan-handling=warn)
Otherwise, yeah, looks good to me. With this and the other suggestions,
please consider it:
Reviewed-by: Kees Cook <keescook@chromium.org>
--
Kees Cook
^ permalink raw reply
* Re: [PATCH seccomp v2 0/8] seccomp: add bitmap cache support on remaining arches and report cache in procfs
From: Kees Cook @ 2020-11-17 21:11 UTC (permalink / raw)
To: containers, YiFei Zhu
Cc: linux-sh, Tobin Feldman-Fitzthum, Hubertus Franke, Jack Chen,
linux-riscv, Andrea Arcangeli, linux-s390, YiFei Zhu, linux-csky,
Tianyin Xu, linux-xtensa, Kees Cook, Jann Horn, Valentin Rothberg,
Aleksa Sarai, Josep Torrellas, Will Drewry, linux-parisc,
linux-kernel, Andy Lutomirski, Dimitrios Skarlatos, David Laight,
Giuseppe Scrivano, linuxppc-dev
In-Reply-To: <cover.1605101222.git.yifeifz2@illinois.edu>
On Wed, 11 Nov 2020 07:33:46 -0600, YiFei Zhu wrote:
> This patch series enables bitmap cache for the remaining arches with
> SECCOMP_FILTER, other than MIPS.
>
> I was unable to find any of the arches having subarch-specific NR_syscalls
> macros, so generic NR_syscalls is used. SH's syscall_get_arch seems to
> only have the 32-bit subarch implementation. I'm not sure if this is
> expected.
>
> [...]
Applied to for-next/seccomp, thanks!
I made a small tweak to the last patch to add more details to the per-ARCH
help text, and to drop the needless "depends on SECCOMP" (which "depends
on SECCOMP_FILTER" was already present).
I successfully build-tested on parisc, powerpc, riscv, s390, and
sh. xtensa doesn't build using the existing Debian cross-compiler, and
I can't make csky with clang work, but they look correct. *cross fingers*
[1/8] csky: Enable seccomp architecture tracking
https://git.kernel.org/kees/c/ee7ce951028f
[2/8] parisc: Enable seccomp architecture tracking
https://git.kernel.org/kees/c/7f049cc068a3
[3/8] powerpc: Enable seccomp architecture tracking
https://git.kernel.org/kees/c/95f8ae2624a0
[4/8] riscv: Enable seccomp architecture tracking
https://git.kernel.org/kees/c/8f9f0f44a37b
[5/8] s390: Enable seccomp architecture tracking
https://git.kernel.org/kees/c/5897106c6902
[6/8] sh: Enable seccomp architecture tracking
https://git.kernel.org/kees/c/75186111c257
[7/8] xtensa: Enable seccomp architecture tracking
https://git.kernel.org/kees/c/4f408bc643aa
[8/8] seccomp/cache: Report cache data through /proc/pid/seccomp_cache
https://git.kernel.org/kees/c/49a6968cc78f
--
Kees Cook
^ permalink raw reply
* Re: [PATCH 2/2] kbuild: Disable CONFIG_LD_ORPHAN_WARN for ld.lld 10.0.1
From: Nick Desaulniers @ 2020-11-17 19:41 UTC (permalink / raw)
To: Nathan Chancellor
Cc: Michal Marek, Kees Cook, kernelci . org bot,
Linux Kbuild mailing list, Mark Brown, Catalin Marinas,
Masahiro Yamada, maintainer:X86 ARCHITECTURE (32-BIT AND 64-BIT),
Russell King, LKML, linuxppc-dev, Arvind Sankar, Ingo Molnar,
Borislav Petkov, clang-built-linux, Thomas Gleixner, Will Deacon,
Linux ARM
In-Reply-To: <20201113195553.1487659-2-natechancellor@gmail.com>
On Fri, Nov 13, 2020 at 11:56 AM Nathan Chancellor
<natechancellor@gmail.com> wrote:
>
> ld.lld 10.0.1 spews a bunch of various warnings about .rela sections,
> along with a few others. Newer versions of ld.lld do not have these
> warnings. As a result, do not add '--orphan-handling=warn' to
> LDFLAGS_vmlinux if ld.lld's version is not new enough.
>
> Reported-by: Arvind Sankar <nivedita@alum.mit.edu>
> Reported-by: kernelci.org bot <bot@kernelci.org>
> Reported-by: Mark Brown <broonie@kernel.org>
> Link: https://github.com/ClangBuiltLinux/linux/issues/1187
> Link: https://github.com/ClangBuiltLinux/linux/issues/1193
> Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
> ---
> MAINTAINERS | 1 +
> init/Kconfig | 6 +++++-
> scripts/lld-version.sh | 20 ++++++++++++++++++++
> 3 files changed, 26 insertions(+), 1 deletion(-)
> create mode 100755 scripts/lld-version.sh
>
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 3da6d8c154e4..4b83d3591ec7 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -4284,6 +4284,7 @@ B: https://github.com/ClangBuiltLinux/linux/issues
> C: irc://chat.freenode.net/clangbuiltlinux
> F: Documentation/kbuild/llvm.rst
> F: scripts/clang-tools/
> +F: scripts/lld-version.sh
> K: \b(?i:clang|llvm)\b
>
> CLEANCACHE API
> diff --git a/init/Kconfig b/init/Kconfig
> index a270716562de..40c9ca60ac1d 100644
> --- a/init/Kconfig
> +++ b/init/Kconfig
> @@ -47,6 +47,10 @@ config CLANG_VERSION
> int
> default $(shell,$(srctree)/scripts/clang-version.sh $(CC))
>
> +config LLD_VERSION
> + int
> + default $(shell,$(srctree)/scripts/lld-version.sh $(LD))
> +
> config CC_CAN_LINK
> bool
> default $(success,$(srctree)/scripts/cc-can-link.sh $(CC) $(CLANG_FLAGS) $(m64-flag)) if 64BIT
> @@ -1349,7 +1353,7 @@ config LD_DEAD_CODE_DATA_ELIMINATION
> own risk.
>
> config LD_ORPHAN_WARN
> - def_bool ARCH_WANT_LD_ORPHAN_WARN && $(ld-option,--orphan-handling=warn)
> + def_bool ARCH_WANT_LD_ORPHAN_WARN && $(ld-option,--orphan-handling=warn) && (!LD_IS_LLD || LLD_VERSION >= 110000)
>
> config SYSCTL
> bool
> diff --git a/scripts/lld-version.sh b/scripts/lld-version.sh
> new file mode 100755
> index 000000000000..cc779f412e39
> --- /dev/null
> +++ b/scripts/lld-version.sh
> @@ -0,0 +1,20 @@
> +#!/bin/sh
> +# SPDX-License-Identifier: GPL-2.0
> +#
> +# ld.lld-version ld.lld-command
^ it looks like this format was copied from scripts/gcc-version, but
it's kind of curious/cryptic to me for a comment about usage. Is it
necessary? A comment in the form:
# Usage: ./scripts/lld-version.sh ld.lld
Would be clearer to me.
> +#
> +# Print the linker version of `ld.lld-command' in a 5 or 6-digit form
> +# such as `100001' for ld.lld 10.0.1 etc.
> +
> +linker="$*"
> +
> +if ! ( $linker --version | grep -q LLD ); then
> + echo 0
> + exit 1
> +fi
> +
> +VERSION=$($linker --version | cut -d ' ' -f 2)
This is going to invoke the linker potentially twice if it's LLD.
Would it be nicer to capture the output of `$linker --version`, check
which linker it is, then slice that up via `cut` to get the version?
This version is fine to me, but if you're going to send a v2, that
might be a nice slight cleanup. Otherwise,
Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
Tested-by: Nick Desaulniers <ndesaulniers@google.com>
(Please drop those tags if you modify this for v2 and I'll rereview/retest).
> +MAJOR=$(echo $VERSION | cut -d . -f 1)
> +MINOR=$(echo $VERSION | cut -d . -f 2)
> +PATCHLEVEL=$(echo $VERSION | cut -d . -f 3)
> +printf "%d%02d%02d\\n" $MAJOR $MINOR $PATCHLEVEL
> --
> 2.29.2
>
--
Thanks,
~Nick Desaulniers
^ permalink raw reply
* Re: [PATCH 1/2] kbuild: Hoist '--orphan-handling' into Kconfig
From: Nick Desaulniers @ 2020-11-17 19:26 UTC (permalink / raw)
To: Nathan Chancellor
Cc: Michal Marek, Kees Cook, Linux Kbuild mailing list,
Catalin Marinas, Masahiro Yamada,
maintainer:X86 ARCHITECTURE (32-BIT AND 64-BIT), Russell King,
LKML, linuxppc-dev, Arvind Sankar, Ingo Molnar, Borislav Petkov,
clang-built-linux, Thomas Gleixner, Will Deacon, Linux ARM
In-Reply-To: <20201117015438.GA299247@ubuntu-m3-large-x86>
On Mon, Nov 16, 2020 at 5:54 PM Nathan Chancellor
<natechancellor@gmail.com> wrote:
>
> On Mon, Nov 16, 2020 at 05:41:58PM -0800, Nick Desaulniers wrote:
> > On Fri, Nov 13, 2020 at 11:56 AM Nathan Chancellor
> > <natechancellor@gmail.com> wrote:
> > >
> > > Currently, '--orphan-handling=warn' is spread out across four different
> > > architectures in their respective Makefiles, which makes it a little
> > > unruly to deal with in case it needs to be disabled for a specific
> > > linker version (in this case, ld.lld 10.0.1).
> >
> > Hi Nathan,
> > This patch fails to apply for me via b4 on next-20201116 due to a
> > conflict in arch/Kconfig:1028. Would you mind sending a rebased V2?
>
> Hi Nick,
>
> This series is intended to go into v5.10 so rebasing it against -next
> defeats that; please test it against v5.10-rc4, where it still applies
> cleanly. The conflicts will be handled by other entities (Stephen Rothwell
> and Linus).
Got it. Yeah, applies fine to v5.10-rc4.
Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
Tested-by: Nick Desaulniers <ndesaulniers@google.com>
Feel free to carry those with MPE's suggested change added.
>
> If you want to test it against -next, 'git am -3' will allow you to
> easily handle the conflict.
>
> Cheers,
> Nathan
--
Thanks,
~Nick Desaulniers
^ permalink raw reply
* [PATCH v2 6/6] ibmvfc: advertise client support for targetWWPN using v2 commands
From: Tyrel Datwyler @ 2020-11-17 19:16 UTC (permalink / raw)
To: james.bottomley
Cc: Tyrel Datwyler, martin.petersen, linux-scsi, linux-kernel, brking,
linuxppc-dev
In-Reply-To: <20201117191636.131127-1-tyreld@linux.ibm.com>
The previous patch added support for the targetWWPN field in version 2
MADs and vfcFrame structures.
Set the IBMVFC_CAN_SEND_VF_WWPN bit in our capabailites flag during NPIV
Login to inform the VIOS that this client supports this feature.
Signed-off-by: Tyrel Datwyler <tyreld@linux.ibm.com>
---
drivers/scsi/ibmvscsi/ibmvfc.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/scsi/ibmvscsi/ibmvfc.c b/drivers/scsi/ibmvscsi/ibmvfc.c
index 9efc39b60cf7..a150b433f7b1 100644
--- a/drivers/scsi/ibmvscsi/ibmvfc.c
+++ b/drivers/scsi/ibmvscsi/ibmvfc.c
@@ -1255,7 +1255,7 @@ static void ibmvfc_set_login_info(struct ibmvfc_host *vhost)
login_info->flags |= cpu_to_be16(IBMVFC_CLIENT_MIGRATED);
login_info->max_cmds = cpu_to_be32(max_requests + IBMVFC_NUM_INTERNAL_REQ);
- login_info->capabilities = cpu_to_be64(IBMVFC_CAN_MIGRATE);
+ login_info->capabilities = cpu_to_be64(IBMVFC_CAN_MIGRATE | IBMVFC_CAN_SEND_VF_WWPN);
login_info->async.va = cpu_to_be64(vhost->async_crq.msg_token);
login_info->async.len = cpu_to_be32(vhost->async_crq.size * sizeof(*vhost->async_crq.msgs));
strncpy(login_info->partition_name, vhost->partition_name, IBMVFC_MAX_NAME);
--
2.27.0
^ permalink raw reply related
* [PATCH v2 5/6] ibmvfc: add support for targetWWPN field in v2 MADs and vfcFrame
From: Tyrel Datwyler @ 2020-11-17 19:16 UTC (permalink / raw)
To: james.bottomley
Cc: Tyrel Datwyler, martin.petersen, linux-scsi, linux-kernel, brking,
linuxppc-dev
In-Reply-To: <20201117191636.131127-1-tyreld@linux.ibm.com>
Several version 2 MADs and the version 2 vfcFrame structures introduced
a new targetWWPN field for better identification of the target then
simply the scsi_id.
Set this field and MAD versioning fields when the VIOS advertises the
IBMVFC_HANDLE_VF_WWPN capability.
Signed-off-by: Tyrel Datwyler <tyreld@linux.ibm.com>
---
drivers/scsi/ibmvscsi/ibmvfc.c | 39 ++++++++++++++++++++++++++++------
1 file changed, 33 insertions(+), 6 deletions(-)
diff --git a/drivers/scsi/ibmvscsi/ibmvfc.c b/drivers/scsi/ibmvscsi/ibmvfc.c
index 4549cdee2cc0..9efc39b60cf7 100644
--- a/drivers/scsi/ibmvscsi/ibmvfc.c
+++ b/drivers/scsi/ibmvscsi/ibmvfc.c
@@ -1683,9 +1683,10 @@ static struct ibmvfc_cmd *ibmvfc_init_vfc_cmd(struct ibmvfc_event *evt, struct s
size_t offset;
memset(vfc_cmd, 0, sizeof(*vfc_cmd));
- if (be64_to_cpu(vhost->login_buf->resp.capabilities) & IBMVFC_HANDLE_VF_WWPN)
+ if (ibmvfc_check_caps(vhost, IBMVFC_HANDLE_VF_WWPN)) {
offset = offsetof(struct ibmvfc_cmd, v2.rsp);
- else
+ vfc_cmd->targetWWPN = cpu_to_be64(rport->port_name);
+ } else
offset = offsetof(struct ibmvfc_cmd, v1.rsp);
vfc_cmd->resp.va = cpu_to_be64(be64_to_cpu(evt->crq.ioba) + offset);
vfc_cmd->resp.len = cpu_to_be32(sizeof(*rsp));
@@ -2062,6 +2063,7 @@ static int ibmvfc_bsg_request(struct bsg_job *job)
static int ibmvfc_reset_device(struct scsi_device *sdev, int type, char *desc)
{
struct ibmvfc_host *vhost = shost_priv(sdev->host);
+ struct fc_rport *rport = starget_to_rport(scsi_target(sdev));
struct ibmvfc_cmd *tmf;
struct ibmvfc_event *evt = NULL;
union ibmvfc_iu rsp_iu;
@@ -2079,6 +2081,8 @@ static int ibmvfc_reset_device(struct scsi_device *sdev, int type, char *desc)
iu = ibmvfc_get_fcp_iu(vhost, tmf);
tmf->flags = cpu_to_be16((IBMVFC_NO_MEM_DESC | IBMVFC_TMF));
+ if (ibmvfc_check_caps(vhost, IBMVFC_HANDLE_VF_WWPN))
+ tmf->targetWWPN = cpu_to_be64(rport->port_name);
iu->tmf_flags = type;
evt->sync_iu = &rsp_iu;
@@ -2269,7 +2273,12 @@ static int ibmvfc_cancel_all(struct scsi_device *sdev, int type)
tmf = &evt->iu.tmf;
memset(tmf, 0, sizeof(*tmf));
- tmf->common.version = cpu_to_be32(1);
+ if (ibmvfc_check_caps(vhost, IBMVFC_HANDLE_VF_WWPN)) {
+ tmf->common.version = cpu_to_be32(2);
+ tmf->targetWWPN = cpu_to_be64(rport->port_name);
+ } else {
+ tmf->common.version = cpu_to_be32(1);
+ }
tmf->common.opcode = cpu_to_be32(IBMVFC_TMF_MAD);
tmf->common.length = cpu_to_be16(sizeof(*tmf));
tmf->scsi_id = cpu_to_be64(rport->port_id);
@@ -2369,6 +2378,7 @@ static int ibmvfc_match_evt(struct ibmvfc_event *evt, void *match)
static int ibmvfc_abort_task_set(struct scsi_device *sdev)
{
struct ibmvfc_host *vhost = shost_priv(sdev->host);
+ struct fc_rport *rport = starget_to_rport(scsi_target(sdev));
struct ibmvfc_cmd *tmf;
struct ibmvfc_event *evt, *found_evt;
union ibmvfc_iu rsp_iu;
@@ -2400,6 +2410,8 @@ static int ibmvfc_abort_task_set(struct scsi_device *sdev)
tmf = ibmvfc_init_vfc_cmd(evt, sdev);
iu = ibmvfc_get_fcp_iu(vhost, tmf);
+ if (ibmvfc_check_caps(vhost, IBMVFC_HANDLE_VF_WWPN))
+ tmf->targetWWPN = cpu_to_be64(rport->port_name);
iu->tmf_flags = IBMVFC_ABORT_TASK_SET;
tmf->flags = cpu_to_be16((IBMVFC_NO_MEM_DESC | IBMVFC_TMF));
evt->sync_iu = &rsp_iu;
@@ -3481,7 +3493,12 @@ static void ibmvfc_tgt_send_prli(struct ibmvfc_target *tgt)
evt->tgt = tgt;
prli = &evt->iu.prli;
memset(prli, 0, sizeof(*prli));
- prli->common.version = cpu_to_be32(1);
+ if (ibmvfc_check_caps(vhost, IBMVFC_HANDLE_VF_WWPN)) {
+ prli->common.version = cpu_to_be32(2);
+ prli->targetWWPN = cpu_to_be64(tgt->wwpn);
+ } else {
+ prli->common.version = cpu_to_be32(1);
+ }
prli->common.opcode = cpu_to_be32(IBMVFC_PROCESS_LOGIN);
prli->common.length = cpu_to_be16(sizeof(*prli));
prli->scsi_id = cpu_to_be64(tgt->scsi_id);
@@ -3584,7 +3601,12 @@ static void ibmvfc_tgt_send_plogi(struct ibmvfc_target *tgt)
evt->tgt = tgt;
plogi = &evt->iu.plogi;
memset(plogi, 0, sizeof(*plogi));
- plogi->common.version = cpu_to_be32(1);
+ if (ibmvfc_check_caps(vhost, IBMVFC_HANDLE_VF_WWPN)) {
+ plogi->common.version = cpu_to_be32(2);
+ plogi->targetWWPN = cpu_to_be64(tgt->wwpn);
+ } else {
+ plogi->common.version = cpu_to_be32(1);
+ }
plogi->common.opcode = cpu_to_be32(IBMVFC_PORT_LOGIN);
plogi->common.length = cpu_to_be16(sizeof(*plogi));
plogi->scsi_id = cpu_to_be64(tgt->scsi_id);
@@ -3984,7 +4006,12 @@ static void ibmvfc_adisc_timeout(struct timer_list *t)
evt->tgt = tgt;
tmf = &evt->iu.tmf;
memset(tmf, 0, sizeof(*tmf));
- tmf->common.version = cpu_to_be32(1);
+ if (ibmvfc_check_caps(vhost, IBMVFC_HANDLE_VF_WWPN)) {
+ tmf->common.version = cpu_to_be32(2);
+ tmf->targetWWPN = cpu_to_be64(tgt->wwpn);
+ } else {
+ tmf->common.version = cpu_to_be32(1);
+ }
tmf->common.opcode = cpu_to_be32(IBMVFC_TMF_MAD);
tmf->common.length = cpu_to_be16(sizeof(*tmf));
tmf->scsi_id = cpu_to_be64(tgt->scsi_id);
--
2.27.0
^ permalink raw reply related
* [PATCH v2 3/6] ibmvfc: add helper for testing capability flags
From: Tyrel Datwyler @ 2020-11-17 19:16 UTC (permalink / raw)
To: james.bottomley
Cc: Tyrel Datwyler, martin.petersen, linux-scsi, linux-kernel, brking,
linuxppc-dev
In-Reply-To: <20201117191636.131127-1-tyreld@linux.ibm.com>
Testing the NPIV Login response capabilities is a long winded process of
dereferencing the vhost->login_buf->resp.capabilities field byte
swapping that value to host endian and performing the bitwise test.
Currently we only ever check this in ibmvfc_cancel_all(), but follow-up
patches will need to regularly check for targetWWPN and channelization
support.
Add a helper to simplify checking various VIOS capabilities.
Signed-off-by: Tyrel Datwyler <tyreld@linux.ibm.com>
---
drivers/scsi/ibmvscsi/ibmvfc.c | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/drivers/scsi/ibmvscsi/ibmvfc.c b/drivers/scsi/ibmvscsi/ibmvfc.c
index d33b24668367..a68602cd1255 100644
--- a/drivers/scsi/ibmvscsi/ibmvfc.c
+++ b/drivers/scsi/ibmvscsi/ibmvfc.c
@@ -138,6 +138,13 @@ static void ibmvfc_tgt_move_login(struct ibmvfc_target *);
static const char *unknown_error = "unknown error";
+static int ibmvfc_check_caps(struct ibmvfc_host *vhost, unsigned long cap_flags)
+{
+ u64 host_caps = be64_to_cpu(vhost->login_buf->resp.capabilities);
+
+ return (host_caps & cap_flags) ? 1 : 0;
+}
+
#ifdef CONFIG_SCSI_IBMVFC_TRACE
/**
* ibmvfc_trc_start - Log a start trace entry
@@ -2240,7 +2247,7 @@ static int ibmvfc_cancel_all(struct scsi_device *sdev, int type)
tmf->common.length = cpu_to_be16(sizeof(*tmf));
tmf->scsi_id = cpu_to_be64(rport->port_id);
int_to_scsilun(sdev->lun, &tmf->lun);
- if (!(be64_to_cpu(vhost->login_buf->resp.capabilities) & IBMVFC_CAN_SUPPRESS_ABTS))
+ if (!ibmvfc_check_caps(vhost, IBMVFC_CAN_SUPPRESS_ABTS))
type &= ~IBMVFC_TMF_SUPPRESS_ABTS;
if (vhost->state == IBMVFC_ACTIVE)
tmf->flags = cpu_to_be32((type | IBMVFC_TMF_LUA_VALID));
--
2.27.0
^ permalink raw reply related
* [PATCH v2 4/6] ibmvfc: add FC payload retrieval routines for versioned vfcFrames
From: Tyrel Datwyler @ 2020-11-17 19:16 UTC (permalink / raw)
To: james.bottomley
Cc: Tyrel Datwyler, martin.petersen, linux-scsi, linux-kernel, brking,
linuxppc-dev
In-Reply-To: <20201117191636.131127-1-tyreld@linux.ibm.com>
The FC iu and response payloads are located at different offsets
depending on the ibmvfc_cmd version. This is a result of the version 2
vfcFrame definition adding an extra 64bytes of reserved space to the
structure prior to the payloads.
Add helper routines to determine the current vfcFrame version and
returning pointers to the proper iu or response structures within that
ibmvfc_cmd.
Signed-off-by: Tyrel Datwyler <tyreld@linux.ibm.com>
---
drivers/scsi/ibmvscsi/ibmvfc.c | 75 +++++++++++++++++++++++-----------
1 file changed, 52 insertions(+), 23 deletions(-)
diff --git a/drivers/scsi/ibmvscsi/ibmvfc.c b/drivers/scsi/ibmvscsi/ibmvfc.c
index a68602cd1255..4549cdee2cc0 100644
--- a/drivers/scsi/ibmvscsi/ibmvfc.c
+++ b/drivers/scsi/ibmvscsi/ibmvfc.c
@@ -145,6 +145,24 @@ static int ibmvfc_check_caps(struct ibmvfc_host *vhost, unsigned long cap_flags)
return (host_caps & cap_flags) ? 1 : 0;
}
+static struct ibmvfc_fcp_cmd_iu *ibmvfc_get_fcp_iu(struct ibmvfc_host *vhost,
+ struct ibmvfc_cmd *vfc_cmd)
+{
+ if (ibmvfc_check_caps(vhost, IBMVFC_HANDLE_VF_WWPN))
+ return &vfc_cmd->v2.iu;
+ else
+ return &vfc_cmd->v1.iu;
+}
+
+static struct ibmvfc_fcp_rsp *ibmvfc_get_fcp_rsp(struct ibmvfc_host *vhost,
+ struct ibmvfc_cmd *vfc_cmd)
+{
+ if (ibmvfc_check_caps(vhost, IBMVFC_HANDLE_VF_WWPN))
+ return &vfc_cmd->v2.rsp;
+ else
+ return &vfc_cmd->v1.rsp;
+}
+
#ifdef CONFIG_SCSI_IBMVFC_TRACE
/**
* ibmvfc_trc_start - Log a start trace entry
@@ -156,7 +174,7 @@ static void ibmvfc_trc_start(struct ibmvfc_event *evt)
struct ibmvfc_host *vhost = evt->vhost;
struct ibmvfc_cmd *vfc_cmd = &evt->iu.cmd;
struct ibmvfc_mad_common *mad = &evt->iu.mad_common;
- struct ibmvfc_fcp_cmd_iu *iu = &vfc_cmd->v1.iu;
+ struct ibmvfc_fcp_cmd_iu *iu = ibmvfc_get_fcp_iu(vhost, vfc_cmd);
struct ibmvfc_trace_entry *entry;
entry = &vhost->trace[vhost->trace_index++];
@@ -191,8 +209,8 @@ static void ibmvfc_trc_end(struct ibmvfc_event *evt)
struct ibmvfc_host *vhost = evt->vhost;
struct ibmvfc_cmd *vfc_cmd = &evt->xfer_iu->cmd;
struct ibmvfc_mad_common *mad = &evt->xfer_iu->mad_common;
- struct ibmvfc_fcp_cmd_iu *iu = &vfc_cmd->v1.iu;
- struct ibmvfc_fcp_rsp *rsp = &vfc_cmd->v1.rsp;
+ struct ibmvfc_fcp_cmd_iu *iu = ibmvfc_get_fcp_iu(vhost, vfc_cmd);
+ struct ibmvfc_fcp_rsp *rsp = ibmvfc_get_fcp_rsp(vhost, vfc_cmd);
struct ibmvfc_trace_entry *entry = &vhost->trace[vhost->trace_index++];
entry->evt = evt;
@@ -270,10 +288,10 @@ static const char *ibmvfc_get_cmd_error(u16 status, u16 error)
* Return value:
* SCSI result value to return for completed command
**/
-static int ibmvfc_get_err_result(struct ibmvfc_cmd *vfc_cmd)
+static int ibmvfc_get_err_result(struct ibmvfc_host *vhost, struct ibmvfc_cmd *vfc_cmd)
{
int err;
- struct ibmvfc_fcp_rsp *rsp = &vfc_cmd->v1.rsp;
+ struct ibmvfc_fcp_rsp *rsp = ibmvfc_get_fcp_rsp(vhost, vfc_cmd);
int fc_rsp_len = be32_to_cpu(rsp->fcp_rsp_len);
if ((rsp->flags & FCP_RSP_LEN_VALID) &&
@@ -1388,7 +1406,7 @@ static int ibmvfc_map_sg_data(struct scsi_cmnd *scmd,
int sg_mapped;
struct srp_direct_buf *data = &vfc_cmd->ioba;
struct ibmvfc_host *vhost = dev_get_drvdata(dev);
- struct ibmvfc_fcp_cmd_iu *iu = &vfc_cmd->v1.iu;
+ struct ibmvfc_fcp_cmd_iu *iu = ibmvfc_get_fcp_iu(evt->vhost, vfc_cmd);
if (cls3_error)
vfc_cmd->flags |= cpu_to_be16(IBMVFC_CLASS_3_ERR);
@@ -1527,7 +1545,7 @@ static void ibmvfc_log_error(struct ibmvfc_event *evt)
{
struct ibmvfc_cmd *vfc_cmd = &evt->xfer_iu->cmd;
struct ibmvfc_host *vhost = evt->vhost;
- struct ibmvfc_fcp_rsp *rsp = &vfc_cmd->v1.rsp;
+ struct ibmvfc_fcp_rsp *rsp = ibmvfc_get_fcp_rsp(vhost, vfc_cmd);
struct scsi_cmnd *cmnd = evt->cmnd;
const char *err = unknown_error;
int index = ibmvfc_get_err_index(be16_to_cpu(vfc_cmd->status), be16_to_cpu(vfc_cmd->error));
@@ -1581,7 +1599,7 @@ static void ibmvfc_relogin(struct scsi_device *sdev)
static void ibmvfc_scsi_done(struct ibmvfc_event *evt)
{
struct ibmvfc_cmd *vfc_cmd = &evt->xfer_iu->cmd;
- struct ibmvfc_fcp_rsp *rsp = &vfc_cmd->v1.rsp;
+ struct ibmvfc_fcp_rsp *rsp = ibmvfc_get_fcp_rsp(evt->vhost, vfc_cmd);
struct scsi_cmnd *cmnd = evt->cmnd;
u32 rsp_len = 0;
u32 sense_len = be32_to_cpu(rsp->fcp_sense_len);
@@ -1595,7 +1613,7 @@ static void ibmvfc_scsi_done(struct ibmvfc_event *evt)
scsi_set_resid(cmnd, 0);
if (vfc_cmd->status) {
- cmnd->result = ibmvfc_get_err_result(vfc_cmd);
+ cmnd->result = ibmvfc_get_err_result(evt->vhost, vfc_cmd);
if (rsp->flags & FCP_RSP_LEN_VALID)
rsp_len = be32_to_cpu(rsp->fcp_rsp_len);
@@ -1660,18 +1678,23 @@ static inline int ibmvfc_host_chkready(struct ibmvfc_host *vhost)
static struct ibmvfc_cmd *ibmvfc_init_vfc_cmd(struct ibmvfc_event *evt, struct scsi_device *sdev)
{
struct fc_rport *rport = starget_to_rport(scsi_target(sdev));
+ struct ibmvfc_host *vhost = evt->vhost;
struct ibmvfc_cmd *vfc_cmd = &evt->iu.cmd;
- size_t offset = offsetof(struct ibmvfc_cmd, v1.rsp);
+ size_t offset;
memset(vfc_cmd, 0, sizeof(*vfc_cmd));
+ if (be64_to_cpu(vhost->login_buf->resp.capabilities) & IBMVFC_HANDLE_VF_WWPN)
+ offset = offsetof(struct ibmvfc_cmd, v2.rsp);
+ else
+ offset = offsetof(struct ibmvfc_cmd, v1.rsp);
vfc_cmd->resp.va = cpu_to_be64(be64_to_cpu(evt->crq.ioba) + offset);
- vfc_cmd->resp.len = cpu_to_be32(sizeof(vfc_cmd->v1.rsp));
+ vfc_cmd->resp.len = cpu_to_be32(sizeof(*rsp));
vfc_cmd->frame_type = cpu_to_be32(IBMVFC_SCSI_FCP_TYPE);
- vfc_cmd->payload_len = cpu_to_be32(sizeof(vfc_cmd->v1.iu));
- vfc_cmd->resp_len = cpu_to_be32(sizeof(vfc_cmd->v1.rsp));
+ vfc_cmd->payload_len = cpu_to_be32(sizeof(*iu));
+ vfc_cmd->resp_len = cpu_to_be32(sizeof(*rsp));
vfc_cmd->cancel_key = cpu_to_be32((unsigned long)sdev->hostdata);
vfc_cmd->tgt_scsi_id = cpu_to_be64(rport->port_id);
- int_to_scsilun(sdev->lun, &vfc_cmd->v1.iu.lun);
+ int_to_scsilun(sdev->lun, &iu->lun);
return vfc_cmd;
}
@@ -1690,6 +1713,7 @@ static int ibmvfc_queuecommand_lck(struct scsi_cmnd *cmnd,
struct ibmvfc_host *vhost = shost_priv(cmnd->device->host);
struct fc_rport *rport = starget_to_rport(scsi_target(cmnd->device));
struct ibmvfc_cmd *vfc_cmd;
+ struct ibmvfc_fcp_cmd_iu *iu;
struct ibmvfc_event *evt;
int rc;
@@ -1707,13 +1731,14 @@ static int ibmvfc_queuecommand_lck(struct scsi_cmnd *cmnd,
cmnd->scsi_done = done;
vfc_cmd = ibmvfc_init_vfc_cmd(evt, cmnd->device);
+ iu = ibmvfc_get_fcp_iu(vhost, vfc_cmd);
- vfc_cmd->v1.iu.xfer_len = cpu_to_be32(scsi_bufflen(cmnd));
- memcpy(vfc_cmd->v1.iu.cdb, cmnd->cmnd, cmnd->cmd_len);
+ iu->xfer_len = cpu_to_be32(scsi_bufflen(cmnd));
+ memcpy(iu->cdb, cmnd->cmnd, cmnd->cmd_len);
if (cmnd->flags & SCMD_TAGGED) {
vfc_cmd->task_tag = cpu_to_be64(cmnd->tag);
- vfc_cmd->v1.iu.pri_task_attr = IBMVFC_SIMPLE_TASK;
+ iu->pri_task_attr = IBMVFC_SIMPLE_TASK;
}
vfc_cmd->correlation = cpu_to_be64(evt);
@@ -2040,7 +2065,8 @@ static int ibmvfc_reset_device(struct scsi_device *sdev, int type, char *desc)
struct ibmvfc_cmd *tmf;
struct ibmvfc_event *evt = NULL;
union ibmvfc_iu rsp_iu;
- struct ibmvfc_fcp_rsp *fc_rsp = &rsp_iu.cmd.v1.rsp;
+ struct ibmvfc_fcp_cmd_iu *iu;
+ struct ibmvfc_fcp_rsp *fc_rsp = ibmvfc_get_fcp_rsp(vhost, &rsp_iu.cmd);
int rsp_rc = -EBUSY;
unsigned long flags;
int rsp_code = 0;
@@ -2050,9 +2076,10 @@ static int ibmvfc_reset_device(struct scsi_device *sdev, int type, char *desc)
evt = ibmvfc_get_event(vhost);
ibmvfc_init_event(evt, ibmvfc_sync_completion, IBMVFC_CMD_FORMAT);
tmf = ibmvfc_init_vfc_cmd(evt, sdev);
+ iu = ibmvfc_get_fcp_iu(vhost, tmf);
tmf->flags = cpu_to_be16((IBMVFC_NO_MEM_DESC | IBMVFC_TMF));
- tmf->v1.iu.tmf_flags = type;
+ iu->tmf_flags = type;
evt->sync_iu = &rsp_iu;
init_completion(&evt->comp);
@@ -2070,7 +2097,7 @@ static int ibmvfc_reset_device(struct scsi_device *sdev, int type, char *desc)
wait_for_completion(&evt->comp);
if (rsp_iu.cmd.status)
- rsp_code = ibmvfc_get_err_result(&rsp_iu.cmd);
+ rsp_code = ibmvfc_get_err_result(vhost, &rsp_iu.cmd);
if (rsp_code) {
if (fc_rsp->flags & FCP_RSP_LEN_VALID)
@@ -2345,7 +2372,8 @@ static int ibmvfc_abort_task_set(struct scsi_device *sdev)
struct ibmvfc_cmd *tmf;
struct ibmvfc_event *evt, *found_evt;
union ibmvfc_iu rsp_iu;
- struct ibmvfc_fcp_rsp *fc_rsp = &rsp_iu.cmd.v1.rsp;
+ struct ibmvfc_fcp_cmd_iu *iu;
+ struct ibmvfc_fcp_rsp *fc_rsp = ibmvfc_get_fcp_rsp(vhost, &rsp_iu.cmd);
int rc, rsp_rc = -EBUSY;
unsigned long flags, timeout = IBMVFC_ABORT_TIMEOUT;
int rsp_code = 0;
@@ -2370,9 +2398,10 @@ static int ibmvfc_abort_task_set(struct scsi_device *sdev)
evt = ibmvfc_get_event(vhost);
ibmvfc_init_event(evt, ibmvfc_sync_completion, IBMVFC_CMD_FORMAT);
tmf = ibmvfc_init_vfc_cmd(evt, sdev);
+ iu = ibmvfc_get_fcp_iu(vhost, tmf);
+ iu->tmf_flags = IBMVFC_ABORT_TASK_SET;
tmf->flags = cpu_to_be16((IBMVFC_NO_MEM_DESC | IBMVFC_TMF));
- tmf->v1.iu.tmf_flags = IBMVFC_ABORT_TASK_SET;
evt->sync_iu = &rsp_iu;
tmf->correlation = cpu_to_be64(evt);
@@ -2421,7 +2450,7 @@ static int ibmvfc_abort_task_set(struct scsi_device *sdev)
}
if (rsp_iu.cmd.status)
- rsp_code = ibmvfc_get_err_result(&rsp_iu.cmd);
+ rsp_code = ibmvfc_get_err_result(vhost, &rsp_iu.cmd);
if (rsp_code) {
if (fc_rsp->flags & FCP_RSP_LEN_VALID)
--
2.27.0
^ permalink raw reply related
* [PATCH v2 0/6] ibmvfc: Protocol definition updates and new targetWWPN Support
From: Tyrel Datwyler @ 2020-11-17 19:16 UTC (permalink / raw)
To: james.bottomley
Cc: Tyrel Datwyler, martin.petersen, linux-scsi, linux-kernel, brking,
linuxppc-dev
Several Management Datagrams (MADs) have been reversioned to add a targetWWPN
field that is intended to better identify a target over a scsi_id. Further, a
couple new MADs have been introduced to the protocol to be used for negotiation
of channels/hw queues resources when the VIOS is using SLI-4 capable adapters.
This patchset adds the new protocol definitions and implements support for using
the new targetWWPN field and exposing the capability to the VIOS. This
targetWWPN support is a prerequisuite for upcoming channelization/MQ support.
changes in v2:
Removed bug fixes to separate patchset
Fixed up checkpatch warnings
Tyrel Datwyler (6):
ibmvfc: deduplicate common ibmvfc_cmd init code
ibmvfc: add new fields for version 2 of several MADs
ibmvfc: add helper for testing capability flags
ibmvfc: add FC payload retrieval routines for versioned vfcFrames
ibmvfc: add support for targetWWPN field in v2 MADs and vfcFrame
ibmvfc: advertise client support for targetWWPN using v2 commands
drivers/scsi/ibmvscsi/ibmvfc.c | 183 ++++++++++++++++++++++-----------
drivers/scsi/ibmvscsi/ibmvfc.h | 28 ++++-
2 files changed, 145 insertions(+), 66 deletions(-)
--
2.27.0
^ permalink raw reply
* [PATCH v2 2/6] ibmvfc: add new fields for version 2 of several MADs
From: Tyrel Datwyler @ 2020-11-17 19:16 UTC (permalink / raw)
To: james.bottomley
Cc: Tyrel Datwyler, martin.petersen, linux-scsi, linux-kernel, brking,
linuxppc-dev
In-Reply-To: <20201117191636.131127-1-tyreld@linux.ibm.com>
Introduce a targetWWPN field to several MADs. Its possible that a scsi
ID of a target can change due to some fabric changes. The WWPN of the
scsi target provides a better way to identify the target. Also, add
flags for receiving MAD versioning information and advertising client
support for targetWWPN with the VIOS. This latter capability flag will
be required for future clients capable of requesting multiple hardware
queues from the host adapter.
Signed-off-by: Tyrel Datwyler <tyreld@linux.ibm.com>
---
drivers/scsi/ibmvscsi/ibmvfc.c | 58 ++++++++++++++++++----------------
drivers/scsi/ibmvscsi/ibmvfc.h | 28 +++++++++++++---
2 files changed, 55 insertions(+), 31 deletions(-)
diff --git a/drivers/scsi/ibmvscsi/ibmvfc.c b/drivers/scsi/ibmvscsi/ibmvfc.c
index 316902074abe..d33b24668367 100644
--- a/drivers/scsi/ibmvscsi/ibmvfc.c
+++ b/drivers/scsi/ibmvscsi/ibmvfc.c
@@ -149,6 +149,7 @@ static void ibmvfc_trc_start(struct ibmvfc_event *evt)
struct ibmvfc_host *vhost = evt->vhost;
struct ibmvfc_cmd *vfc_cmd = &evt->iu.cmd;
struct ibmvfc_mad_common *mad = &evt->iu.mad_common;
+ struct ibmvfc_fcp_cmd_iu *iu = &vfc_cmd->v1.iu;
struct ibmvfc_trace_entry *entry;
entry = &vhost->trace[vhost->trace_index++];
@@ -159,11 +160,11 @@ static void ibmvfc_trc_start(struct ibmvfc_event *evt)
switch (entry->fmt) {
case IBMVFC_CMD_FORMAT:
- entry->op_code = vfc_cmd->iu.cdb[0];
+ entry->op_code = iu->cdb[0];
entry->scsi_id = be64_to_cpu(vfc_cmd->tgt_scsi_id);
- entry->lun = scsilun_to_int(&vfc_cmd->iu.lun);
- entry->tmf_flags = vfc_cmd->iu.tmf_flags;
- entry->u.start.xfer_len = be32_to_cpu(vfc_cmd->iu.xfer_len);
+ entry->lun = scsilun_to_int(&iu->lun);
+ entry->tmf_flags = iu->tmf_flags;
+ entry->u.start.xfer_len = be32_to_cpu(iu->xfer_len);
break;
case IBMVFC_MAD_FORMAT:
entry->op_code = be32_to_cpu(mad->opcode);
@@ -183,6 +184,8 @@ static void ibmvfc_trc_end(struct ibmvfc_event *evt)
struct ibmvfc_host *vhost = evt->vhost;
struct ibmvfc_cmd *vfc_cmd = &evt->xfer_iu->cmd;
struct ibmvfc_mad_common *mad = &evt->xfer_iu->mad_common;
+ struct ibmvfc_fcp_cmd_iu *iu = &vfc_cmd->v1.iu;
+ struct ibmvfc_fcp_rsp *rsp = &vfc_cmd->v1.rsp;
struct ibmvfc_trace_entry *entry = &vhost->trace[vhost->trace_index++];
entry->evt = evt;
@@ -192,15 +195,15 @@ static void ibmvfc_trc_end(struct ibmvfc_event *evt)
switch (entry->fmt) {
case IBMVFC_CMD_FORMAT:
- entry->op_code = vfc_cmd->iu.cdb[0];
+ entry->op_code = iu->cdb[0];
entry->scsi_id = be64_to_cpu(vfc_cmd->tgt_scsi_id);
- entry->lun = scsilun_to_int(&vfc_cmd->iu.lun);
- entry->tmf_flags = vfc_cmd->iu.tmf_flags;
+ entry->lun = scsilun_to_int(&iu->lun);
+ entry->tmf_flags = iu->tmf_flags;
entry->u.end.status = be16_to_cpu(vfc_cmd->status);
entry->u.end.error = be16_to_cpu(vfc_cmd->error);
- entry->u.end.fcp_rsp_flags = vfc_cmd->rsp.flags;
- entry->u.end.rsp_code = vfc_cmd->rsp.data.info.rsp_code;
- entry->u.end.scsi_status = vfc_cmd->rsp.scsi_status;
+ entry->u.end.fcp_rsp_flags = rsp->flags;
+ entry->u.end.rsp_code = rsp->data.info.rsp_code;
+ entry->u.end.scsi_status = rsp->scsi_status;
break;
case IBMVFC_MAD_FORMAT:
entry->op_code = be32_to_cpu(mad->opcode);
@@ -263,7 +266,7 @@ static const char *ibmvfc_get_cmd_error(u16 status, u16 error)
static int ibmvfc_get_err_result(struct ibmvfc_cmd *vfc_cmd)
{
int err;
- struct ibmvfc_fcp_rsp *rsp = &vfc_cmd->rsp;
+ struct ibmvfc_fcp_rsp *rsp = &vfc_cmd->v1.rsp;
int fc_rsp_len = be32_to_cpu(rsp->fcp_rsp_len);
if ((rsp->flags & FCP_RSP_LEN_VALID) &&
@@ -1378,6 +1381,7 @@ static int ibmvfc_map_sg_data(struct scsi_cmnd *scmd,
int sg_mapped;
struct srp_direct_buf *data = &vfc_cmd->ioba;
struct ibmvfc_host *vhost = dev_get_drvdata(dev);
+ struct ibmvfc_fcp_cmd_iu *iu = &vfc_cmd->v1.iu;
if (cls3_error)
vfc_cmd->flags |= cpu_to_be16(IBMVFC_CLASS_3_ERR);
@@ -1394,10 +1398,10 @@ static int ibmvfc_map_sg_data(struct scsi_cmnd *scmd,
if (scmd->sc_data_direction == DMA_TO_DEVICE) {
vfc_cmd->flags |= cpu_to_be16(IBMVFC_WRITE);
- vfc_cmd->iu.add_cdb_len |= IBMVFC_WRDATA;
+ iu->add_cdb_len |= IBMVFC_WRDATA;
} else {
vfc_cmd->flags |= cpu_to_be16(IBMVFC_READ);
- vfc_cmd->iu.add_cdb_len |= IBMVFC_RDDATA;
+ iu->add_cdb_len |= IBMVFC_RDDATA;
}
if (sg_mapped == 1) {
@@ -1516,7 +1520,7 @@ static void ibmvfc_log_error(struct ibmvfc_event *evt)
{
struct ibmvfc_cmd *vfc_cmd = &evt->xfer_iu->cmd;
struct ibmvfc_host *vhost = evt->vhost;
- struct ibmvfc_fcp_rsp *rsp = &vfc_cmd->rsp;
+ struct ibmvfc_fcp_rsp *rsp = &vfc_cmd->v1.rsp;
struct scsi_cmnd *cmnd = evt->cmnd;
const char *err = unknown_error;
int index = ibmvfc_get_err_index(be16_to_cpu(vfc_cmd->status), be16_to_cpu(vfc_cmd->error));
@@ -1570,7 +1574,7 @@ static void ibmvfc_relogin(struct scsi_device *sdev)
static void ibmvfc_scsi_done(struct ibmvfc_event *evt)
{
struct ibmvfc_cmd *vfc_cmd = &evt->xfer_iu->cmd;
- struct ibmvfc_fcp_rsp *rsp = &vfc_cmd->rsp;
+ struct ibmvfc_fcp_rsp *rsp = &vfc_cmd->v1.rsp;
struct scsi_cmnd *cmnd = evt->cmnd;
u32 rsp_len = 0;
u32 sense_len = be32_to_cpu(rsp->fcp_sense_len);
@@ -1650,17 +1654,17 @@ static struct ibmvfc_cmd *ibmvfc_init_vfc_cmd(struct ibmvfc_event *evt, struct s
{
struct fc_rport *rport = starget_to_rport(scsi_target(sdev));
struct ibmvfc_cmd *vfc_cmd = &evt->iu.cmd;
- size_t offset = offsetof(struct ibmvfc_cmd, rsp);
+ size_t offset = offsetof(struct ibmvfc_cmd, v1.rsp);
memset(vfc_cmd, 0, sizeof(*vfc_cmd));
vfc_cmd->resp.va = cpu_to_be64(be64_to_cpu(evt->crq.ioba) + offset);
- vfc_cmd->resp.len = cpu_to_be32(sizeof(vfc_cmd->rsp));
+ vfc_cmd->resp.len = cpu_to_be32(sizeof(vfc_cmd->v1.rsp));
vfc_cmd->frame_type = cpu_to_be32(IBMVFC_SCSI_FCP_TYPE);
- vfc_cmd->payload_len = cpu_to_be32(sizeof(vfc_cmd->iu));
- vfc_cmd->resp_len = cpu_to_be32(sizeof(vfc_cmd->rsp));
+ vfc_cmd->payload_len = cpu_to_be32(sizeof(vfc_cmd->v1.iu));
+ vfc_cmd->resp_len = cpu_to_be32(sizeof(vfc_cmd->v1.rsp));
vfc_cmd->cancel_key = cpu_to_be32((unsigned long)sdev->hostdata);
vfc_cmd->tgt_scsi_id = cpu_to_be64(rport->port_id);
- int_to_scsilun(sdev->lun, &vfc_cmd->iu.lun);
+ int_to_scsilun(sdev->lun, &vfc_cmd->v1.iu.lun);
return vfc_cmd;
}
@@ -1697,12 +1701,12 @@ static int ibmvfc_queuecommand_lck(struct scsi_cmnd *cmnd,
vfc_cmd = ibmvfc_init_vfc_cmd(evt, cmnd->device);
- vfc_cmd->iu.xfer_len = cpu_to_be32(scsi_bufflen(cmnd));
- memcpy(vfc_cmd->iu.cdb, cmnd->cmnd, cmnd->cmd_len);
+ vfc_cmd->v1.iu.xfer_len = cpu_to_be32(scsi_bufflen(cmnd));
+ memcpy(vfc_cmd->v1.iu.cdb, cmnd->cmnd, cmnd->cmd_len);
if (cmnd->flags & SCMD_TAGGED) {
vfc_cmd->task_tag = cpu_to_be64(cmnd->tag);
- vfc_cmd->iu.pri_task_attr = IBMVFC_SIMPLE_TASK;
+ vfc_cmd->v1.iu.pri_task_attr = IBMVFC_SIMPLE_TASK;
}
vfc_cmd->correlation = cpu_to_be64(evt);
@@ -2029,7 +2033,7 @@ static int ibmvfc_reset_device(struct scsi_device *sdev, int type, char *desc)
struct ibmvfc_cmd *tmf;
struct ibmvfc_event *evt = NULL;
union ibmvfc_iu rsp_iu;
- struct ibmvfc_fcp_rsp *fc_rsp = &rsp_iu.cmd.rsp;
+ struct ibmvfc_fcp_rsp *fc_rsp = &rsp_iu.cmd.v1.rsp;
int rsp_rc = -EBUSY;
unsigned long flags;
int rsp_code = 0;
@@ -2041,7 +2045,7 @@ static int ibmvfc_reset_device(struct scsi_device *sdev, int type, char *desc)
tmf = ibmvfc_init_vfc_cmd(evt, sdev);
tmf->flags = cpu_to_be16((IBMVFC_NO_MEM_DESC | IBMVFC_TMF));
- tmf->iu.tmf_flags = type;
+ tmf->v1.iu.tmf_flags = type;
evt->sync_iu = &rsp_iu;
init_completion(&evt->comp);
@@ -2334,7 +2338,7 @@ static int ibmvfc_abort_task_set(struct scsi_device *sdev)
struct ibmvfc_cmd *tmf;
struct ibmvfc_event *evt, *found_evt;
union ibmvfc_iu rsp_iu;
- struct ibmvfc_fcp_rsp *fc_rsp = &rsp_iu.cmd.rsp;
+ struct ibmvfc_fcp_rsp *fc_rsp = &rsp_iu.cmd.v1.rsp;
int rc, rsp_rc = -EBUSY;
unsigned long flags, timeout = IBMVFC_ABORT_TIMEOUT;
int rsp_code = 0;
@@ -2361,7 +2365,7 @@ static int ibmvfc_abort_task_set(struct scsi_device *sdev)
tmf = ibmvfc_init_vfc_cmd(evt, sdev);
tmf->flags = cpu_to_be16((IBMVFC_NO_MEM_DESC | IBMVFC_TMF));
- tmf->iu.tmf_flags = IBMVFC_ABORT_TASK_SET;
+ tmf->v1.iu.tmf_flags = IBMVFC_ABORT_TASK_SET;
evt->sync_iu = &rsp_iu;
tmf->correlation = cpu_to_be64(evt);
diff --git a/drivers/scsi/ibmvscsi/ibmvfc.h b/drivers/scsi/ibmvscsi/ibmvfc.h
index 34debccfb142..65092812bd4a 100644
--- a/drivers/scsi/ibmvscsi/ibmvfc.h
+++ b/drivers/scsi/ibmvscsi/ibmvfc.h
@@ -54,6 +54,7 @@
#define IBMVFC_MAD_SUCCESS 0x00
#define IBMVFC_MAD_NOT_SUPPORTED 0xF1
+#define IBMVFC_MAD_VERSION_NOT_SUPP 0xF2
#define IBMVFC_MAD_FAILED 0xF7
#define IBMVFC_MAD_DRIVER_FAILED 0xEE
#define IBMVFC_MAD_CRQ_ERROR 0xEF
@@ -168,6 +169,8 @@ struct ibmvfc_npiv_login {
#define IBMVFC_CAN_MIGRATE 0x01
#define IBMVFC_CAN_USE_CHANNELS 0x02
#define IBMVFC_CAN_HANDLE_FPIN 0x04
+#define IBMVFC_CAN_USE_MAD_VERSION 0x08
+#define IBMVFC_CAN_SEND_VF_WWPN 0x10
__be64 node_name;
struct srp_direct_buf async;
u8 partition_name[IBMVFC_MAX_NAME];
@@ -211,7 +214,9 @@ struct ibmvfc_npiv_login_resp {
__be64 capabilities;
#define IBMVFC_CAN_FLUSH_ON_HALT 0x08
#define IBMVFC_CAN_SUPPRESS_ABTS 0x10
-#define IBMVFC_CAN_SUPPORT_CHANNELS 0x20
+#define IBMVFC_MAD_VERSION_CAP 0x20
+#define IBMVFC_HANDLE_VF_WWPN 0x40
+#define IBMVFC_CAN_SUPPORT_CHANNELS 0x80
__be32 max_cmds;
__be32 scsi_id_sz;
__be64 max_dma_len;
@@ -293,6 +298,7 @@ struct ibmvfc_port_login {
__be32 reserved2;
struct ibmvfc_service_parms service_parms;
struct ibmvfc_service_parms service_parms_change;
+ __be64 targetWWPN;
__be64 reserved3[2];
} __packed __aligned(8);
@@ -344,6 +350,7 @@ struct ibmvfc_process_login {
__be16 status;
__be16 error; /* also fc_reason */
__be32 reserved2;
+ __be64 targetWWPN;
__be64 reserved3[2];
} __packed __aligned(8);
@@ -378,6 +385,8 @@ struct ibmvfc_tmf {
__be32 cancel_key;
__be32 my_cancel_key;
__be32 pad;
+ __be64 targetWWPN;
+ __be64 taskTag;
__be64 reserved[2];
} __packed __aligned(8);
@@ -474,9 +483,19 @@ struct ibmvfc_cmd {
__be64 correlation;
__be64 tgt_scsi_id;
__be64 tag;
- __be64 reserved3[2];
- struct ibmvfc_fcp_cmd_iu iu;
- struct ibmvfc_fcp_rsp rsp;
+ __be64 targetWWPN;
+ __be64 reserved3;
+ union {
+ struct {
+ struct ibmvfc_fcp_cmd_iu iu;
+ struct ibmvfc_fcp_rsp rsp;
+ } v1;
+ struct {
+ __be64 reserved4;
+ struct ibmvfc_fcp_cmd_iu iu;
+ struct ibmvfc_fcp_rsp rsp;
+ } v2;
+ };
} __packed __aligned(8);
struct ibmvfc_passthru_fc_iu {
@@ -503,6 +522,7 @@ struct ibmvfc_passthru_iu {
__be64 correlation;
__be64 scsi_id;
__be64 tag;
+ __be64 targetWWPN;
__be64 reserved2[2];
} __packed __aligned(8);
--
2.27.0
^ permalink raw reply related
* [PATCH v2 1/6] ibmvfc: deduplicate common ibmvfc_cmd init code
From: Tyrel Datwyler @ 2020-11-17 19:16 UTC (permalink / raw)
To: james.bottomley
Cc: Tyrel Datwyler, martin.petersen, linux-scsi, linux-kernel, brking,
linuxppc-dev
In-Reply-To: <20201117191636.131127-1-tyreld@linux.ibm.com>
The virtual FC frame command exchaned with the VIOS is used for device
reset and command abort TMF as well as normally queued commands. When
initializing the ibmvfc_cmd there several elements of the command that
are set the same way regardless of the command type.
Deduplicate code by moving these commonally set fields into a
initialization helper routine, namely ibmvfc_init_vfc_cmd().
Signed-off-by: Tyrel Datwyler <tyreld@linux.ibm.com>
---
drivers/scsi/ibmvscsi/ibmvfc.c | 56 +++++++++++++++-------------------
1 file changed, 24 insertions(+), 32 deletions(-)
diff --git a/drivers/scsi/ibmvscsi/ibmvfc.c b/drivers/scsi/ibmvscsi/ibmvfc.c
index 3922441a117d..316902074abe 100644
--- a/drivers/scsi/ibmvscsi/ibmvfc.c
+++ b/drivers/scsi/ibmvscsi/ibmvfc.c
@@ -1646,6 +1646,25 @@ static inline int ibmvfc_host_chkready(struct ibmvfc_host *vhost)
return result;
}
+static struct ibmvfc_cmd *ibmvfc_init_vfc_cmd(struct ibmvfc_event *evt, struct scsi_device *sdev)
+{
+ struct fc_rport *rport = starget_to_rport(scsi_target(sdev));
+ struct ibmvfc_cmd *vfc_cmd = &evt->iu.cmd;
+ size_t offset = offsetof(struct ibmvfc_cmd, rsp);
+
+ memset(vfc_cmd, 0, sizeof(*vfc_cmd));
+ vfc_cmd->resp.va = cpu_to_be64(be64_to_cpu(evt->crq.ioba) + offset);
+ vfc_cmd->resp.len = cpu_to_be32(sizeof(vfc_cmd->rsp));
+ vfc_cmd->frame_type = cpu_to_be32(IBMVFC_SCSI_FCP_TYPE);
+ vfc_cmd->payload_len = cpu_to_be32(sizeof(vfc_cmd->iu));
+ vfc_cmd->resp_len = cpu_to_be32(sizeof(vfc_cmd->rsp));
+ vfc_cmd->cancel_key = cpu_to_be32((unsigned long)sdev->hostdata);
+ vfc_cmd->tgt_scsi_id = cpu_to_be64(rport->port_id);
+ int_to_scsilun(sdev->lun, &vfc_cmd->iu.lun);
+
+ return vfc_cmd;
+}
+
/**
* ibmvfc_queuecommand - The queuecommand function of the scsi template
* @cmnd: struct scsi_cmnd to be executed
@@ -1675,17 +1694,10 @@ static int ibmvfc_queuecommand_lck(struct scsi_cmnd *cmnd,
ibmvfc_init_event(evt, ibmvfc_scsi_done, IBMVFC_CMD_FORMAT);
evt->cmnd = cmnd;
cmnd->scsi_done = done;
- vfc_cmd = &evt->iu.cmd;
- memset(vfc_cmd, 0, sizeof(*vfc_cmd));
- vfc_cmd->resp.va = cpu_to_be64(be64_to_cpu(evt->crq.ioba) + offsetof(struct ibmvfc_cmd, rsp));
- vfc_cmd->resp.len = cpu_to_be32(sizeof(vfc_cmd->rsp));
- vfc_cmd->frame_type = cpu_to_be32(IBMVFC_SCSI_FCP_TYPE);
- vfc_cmd->payload_len = cpu_to_be32(sizeof(vfc_cmd->iu));
- vfc_cmd->resp_len = cpu_to_be32(sizeof(vfc_cmd->rsp));
- vfc_cmd->cancel_key = cpu_to_be32((unsigned long)cmnd->device->hostdata);
- vfc_cmd->tgt_scsi_id = cpu_to_be64(rport->port_id);
+
+ vfc_cmd = ibmvfc_init_vfc_cmd(evt, cmnd->device);
+
vfc_cmd->iu.xfer_len = cpu_to_be32(scsi_bufflen(cmnd));
- int_to_scsilun(cmnd->device->lun, &vfc_cmd->iu.lun);
memcpy(vfc_cmd->iu.cdb, cmnd->cmnd, cmnd->cmd_len);
if (cmnd->flags & SCMD_TAGGED) {
@@ -2014,7 +2026,6 @@ static int ibmvfc_bsg_request(struct bsg_job *job)
static int ibmvfc_reset_device(struct scsi_device *sdev, int type, char *desc)
{
struct ibmvfc_host *vhost = shost_priv(sdev->host);
- struct fc_rport *rport = starget_to_rport(scsi_target(sdev));
struct ibmvfc_cmd *tmf;
struct ibmvfc_event *evt = NULL;
union ibmvfc_iu rsp_iu;
@@ -2027,17 +2038,8 @@ static int ibmvfc_reset_device(struct scsi_device *sdev, int type, char *desc)
if (vhost->state == IBMVFC_ACTIVE) {
evt = ibmvfc_get_event(vhost);
ibmvfc_init_event(evt, ibmvfc_sync_completion, IBMVFC_CMD_FORMAT);
+ tmf = ibmvfc_init_vfc_cmd(evt, sdev);
- tmf = &evt->iu.cmd;
- memset(tmf, 0, sizeof(*tmf));
- tmf->resp.va = cpu_to_be64(be64_to_cpu(evt->crq.ioba) + offsetof(struct ibmvfc_cmd, rsp));
- tmf->resp.len = cpu_to_be32(sizeof(tmf->rsp));
- tmf->frame_type = cpu_to_be32(IBMVFC_SCSI_FCP_TYPE);
- tmf->payload_len = cpu_to_be32(sizeof(tmf->iu));
- tmf->resp_len = cpu_to_be32(sizeof(tmf->rsp));
- tmf->cancel_key = cpu_to_be32((unsigned long)sdev->hostdata);
- tmf->tgt_scsi_id = cpu_to_be64(rport->port_id);
- int_to_scsilun(sdev->lun, &tmf->iu.lun);
tmf->flags = cpu_to_be16((IBMVFC_NO_MEM_DESC | IBMVFC_TMF));
tmf->iu.tmf_flags = type;
evt->sync_iu = &rsp_iu;
@@ -2329,7 +2331,6 @@ static int ibmvfc_match_evt(struct ibmvfc_event *evt, void *match)
static int ibmvfc_abort_task_set(struct scsi_device *sdev)
{
struct ibmvfc_host *vhost = shost_priv(sdev->host);
- struct fc_rport *rport = starget_to_rport(scsi_target(sdev));
struct ibmvfc_cmd *tmf;
struct ibmvfc_event *evt, *found_evt;
union ibmvfc_iu rsp_iu;
@@ -2357,17 +2358,8 @@ static int ibmvfc_abort_task_set(struct scsi_device *sdev)
if (vhost->state == IBMVFC_ACTIVE) {
evt = ibmvfc_get_event(vhost);
ibmvfc_init_event(evt, ibmvfc_sync_completion, IBMVFC_CMD_FORMAT);
+ tmf = ibmvfc_init_vfc_cmd(evt, sdev);
- tmf = &evt->iu.cmd;
- memset(tmf, 0, sizeof(*tmf));
- tmf->resp.va = cpu_to_be64(be64_to_cpu(evt->crq.ioba) + offsetof(struct ibmvfc_cmd, rsp));
- tmf->resp.len = cpu_to_be32(sizeof(tmf->rsp));
- tmf->frame_type = cpu_to_be32(IBMVFC_SCSI_FCP_TYPE);
- tmf->payload_len = cpu_to_be32(sizeof(tmf->iu));
- tmf->resp_len = cpu_to_be32(sizeof(tmf->rsp));
- tmf->cancel_key = cpu_to_be32((unsigned long)sdev->hostdata);
- tmf->tgt_scsi_id = cpu_to_be64(rport->port_id);
- int_to_scsilun(sdev->lun, &tmf->iu.lun);
tmf->flags = cpu_to_be16((IBMVFC_NO_MEM_DESC | IBMVFC_TMF));
tmf->iu.tmf_flags = IBMVFC_ABORT_TASK_SET;
evt->sync_iu = &rsp_iu;
--
2.27.0
^ permalink raw reply related
* Re: [PATCH 2/3] Revert "lib: Revert use of fallthrough pseudo-keyword in lib/"
From: Nick Desaulniers @ 2020-11-17 19:10 UTC (permalink / raw)
To: Gustavo A . R . Silva, Michael Ellerman
Cc: Miguel Ojeda, LKML, clang-built-linux, Paul Mackerras,
Nathan Chancellor, linuxppc-dev
In-Reply-To: <20201117030214.GB1340689@ubuntu-m3-large-x86>
On Mon, Nov 16, 2020 at 7:02 PM Nathan Chancellor
<natechancellor@gmail.com> wrote:
>
> On Sun, Nov 15, 2020 at 08:35:31PM -0800, Nick Desaulniers wrote:
> > This reverts commit 6a9dc5fd6170 ("lib: Revert use of fallthrough
> > pseudo-keyword in lib/")
Gustavo, whose tree did 6a9dc5fd6170 and df561f6688fe go up to
mainline in? I'm not sure whether you or MPE (ppc) or someone else
should pick it this series?
> >
> > Now that we can build arch/powerpc/boot/ free of -Wimplicit-fallthrough,
> > re-enable these fixes for lib/.
> >
> > Link: https://github.com/ClangBuiltLinux/linux/issues/236
> > Signed-off-by: Nick Desaulniers <ndesaulniers@google.com>
>
> Reviewed-by: Nathan Chancellor <natechancellor@gmail.com>
> Tested-by: Nathan Chancellor <natechancellor@gmail.com>
>
> > ---
> > lib/asn1_decoder.c | 4 ++--
> > lib/assoc_array.c | 2 +-
> > lib/bootconfig.c | 4 ++--
> > lib/cmdline.c | 10 +++++-----
> > lib/dim/net_dim.c | 2 +-
> > lib/dim/rdma_dim.c | 4 ++--
> > lib/glob.c | 2 +-
> > lib/siphash.c | 36 ++++++++++++++++++------------------
> > lib/ts_fsm.c | 2 +-
> > lib/vsprintf.c | 14 +++++++-------
> > lib/xz/xz_dec_lzma2.c | 4 ++--
> > lib/xz/xz_dec_stream.c | 16 ++++++++--------
> > lib/zstd/bitstream.h | 10 +++++-----
> > lib/zstd/compress.c | 2 +-
> > lib/zstd/decompress.c | 12 ++++++------
> > lib/zstd/huf_compress.c | 4 ++--
> > 16 files changed, 64 insertions(+), 64 deletions(-)
> >
> > diff --git a/lib/asn1_decoder.c b/lib/asn1_decoder.c
> > index 58f72b25f8e9..13da529e2e72 100644
> > --- a/lib/asn1_decoder.c
> > +++ b/lib/asn1_decoder.c
> > @@ -381,7 +381,7 @@ int asn1_ber_decoder(const struct asn1_decoder *decoder,
> > case ASN1_OP_END_SET_ACT:
> > if (unlikely(!(flags & FLAG_MATCHED)))
> > goto tag_mismatch;
> > - /* fall through */
> > + fallthrough;
> >
> > case ASN1_OP_END_SEQ:
> > case ASN1_OP_END_SET_OF:
> > @@ -448,7 +448,7 @@ int asn1_ber_decoder(const struct asn1_decoder *decoder,
> > pc += asn1_op_lengths[op];
> > goto next_op;
> > }
> > - /* fall through */
> > + fallthrough;
> >
> > case ASN1_OP_ACT:
> > ret = actions[machine[pc + 1]](context, hdr, tag, data + tdp, len);
> > diff --git a/lib/assoc_array.c b/lib/assoc_array.c
> > index 6f4bcf524554..04c98799c3ba 100644
> > --- a/lib/assoc_array.c
> > +++ b/lib/assoc_array.c
> > @@ -1113,7 +1113,7 @@ struct assoc_array_edit *assoc_array_delete(struct assoc_array *array,
> > index_key))
> > goto found_leaf;
> > }
> > - /* fall through */
> > + fallthrough;
> > case assoc_array_walk_tree_empty:
> > case assoc_array_walk_found_wrong_shortcut:
> > default:
> > diff --git a/lib/bootconfig.c b/lib/bootconfig.c
> > index 649ed44f199c..9f8c70a98fcf 100644
> > --- a/lib/bootconfig.c
> > +++ b/lib/bootconfig.c
> > @@ -827,7 +827,7 @@ int __init xbc_init(char *buf, const char **emsg, int *epos)
> > q - 2);
> > break;
> > }
> > - /* fall through */
> > + fallthrough;
> > case '=':
> > ret = xbc_parse_kv(&p, q, c);
> > break;
> > @@ -836,7 +836,7 @@ int __init xbc_init(char *buf, const char **emsg, int *epos)
> > break;
> > case '#':
> > q = skip_comment(q);
> > - /* fall through */
> > + fallthrough;
> > case ';':
> > case '\n':
> > ret = xbc_parse_key(&p, q);
> > diff --git a/lib/cmdline.c b/lib/cmdline.c
> > index 9e186234edc0..46f2cb4ce6d1 100644
> > --- a/lib/cmdline.c
> > +++ b/lib/cmdline.c
> > @@ -144,23 +144,23 @@ unsigned long long memparse(const char *ptr, char **retptr)
> > case 'E':
> > case 'e':
> > ret <<= 10;
> > - /* fall through */
> > + fallthrough;
> > case 'P':
> > case 'p':
> > ret <<= 10;
> > - /* fall through */
> > + fallthrough;
> > case 'T':
> > case 't':
> > ret <<= 10;
> > - /* fall through */
> > + fallthrough;
> > case 'G':
> > case 'g':
> > ret <<= 10;
> > - /* fall through */
> > + fallthrough;
> > case 'M':
> > case 'm':
> > ret <<= 10;
> > - /* fall through */
> > + fallthrough;
> > case 'K':
> > case 'k':
> > ret <<= 10;
> > diff --git a/lib/dim/net_dim.c b/lib/dim/net_dim.c
> > index a4db51c21266..06811d866775 100644
> > --- a/lib/dim/net_dim.c
> > +++ b/lib/dim/net_dim.c
> > @@ -233,7 +233,7 @@ void net_dim(struct dim *dim, struct dim_sample end_sample)
> > schedule_work(&dim->work);
> > break;
> > }
> > - /* fall through */
> > + fallthrough;
> > case DIM_START_MEASURE:
> > dim_update_sample(end_sample.event_ctr, end_sample.pkt_ctr,
> > end_sample.byte_ctr, &dim->start_sample);
> > diff --git a/lib/dim/rdma_dim.c b/lib/dim/rdma_dim.c
> > index f7e26c7b4749..15462d54758d 100644
> > --- a/lib/dim/rdma_dim.c
> > +++ b/lib/dim/rdma_dim.c
> > @@ -59,7 +59,7 @@ static bool rdma_dim_decision(struct dim_stats *curr_stats, struct dim *dim)
> > break;
> > case DIM_STATS_WORSE:
> > dim_turn(dim);
> > - /* fall through */
> > + fallthrough;
> > case DIM_STATS_BETTER:
> > step_res = rdma_dim_step(dim);
> > if (step_res == DIM_ON_EDGE)
> > @@ -94,7 +94,7 @@ void rdma_dim(struct dim *dim, u64 completions)
> > schedule_work(&dim->work);
> > break;
> > }
> > - /* fall through */
> > + fallthrough;
> > case DIM_START_MEASURE:
> > dim->state = DIM_MEASURE_IN_PROGRESS;
> > dim_update_sample_with_comps(curr_sample->event_ctr, 0, 0,
> > diff --git a/lib/glob.c b/lib/glob.c
> > index 52e3ed7e4a9b..85ecbda45cd8 100644
> > --- a/lib/glob.c
> > +++ b/lib/glob.c
> > @@ -102,7 +102,7 @@ bool __pure glob_match(char const *pat, char const *str)
> > break;
> > case '\\':
> > d = *pat++;
> > - /* fall through */
> > + fallthrough;
> > default: /* Literal character */
> > literal:
> > if (c == d) {
> > diff --git a/lib/siphash.c b/lib/siphash.c
> > index c47bb6ff2149..a90112ee72a1 100644
> > --- a/lib/siphash.c
> > +++ b/lib/siphash.c
> > @@ -68,11 +68,11 @@ u64 __siphash_aligned(const void *data, size_t len, const siphash_key_t *key)
> > bytemask_from_count(left)));
> > #else
> > switch (left) {
> > - case 7: b |= ((u64)end[6]) << 48; /* fall through */
> > - case 6: b |= ((u64)end[5]) << 40; /* fall through */
> > - case 5: b |= ((u64)end[4]) << 32; /* fall through */
> > + case 7: b |= ((u64)end[6]) << 48; fallthrough;
> > + case 6: b |= ((u64)end[5]) << 40; fallthrough;
> > + case 5: b |= ((u64)end[4]) << 32; fallthrough;
> > case 4: b |= le32_to_cpup(data); break;
> > - case 3: b |= ((u64)end[2]) << 16; /* fall through */
> > + case 3: b |= ((u64)end[2]) << 16; fallthrough;
> > case 2: b |= le16_to_cpup(data); break;
> > case 1: b |= end[0];
> > }
> > @@ -101,11 +101,11 @@ u64 __siphash_unaligned(const void *data, size_t len, const siphash_key_t *key)
> > bytemask_from_count(left)));
> > #else
> > switch (left) {
> > - case 7: b |= ((u64)end[6]) << 48; /* fall through */
> > - case 6: b |= ((u64)end[5]) << 40; /* fall through */
> > - case 5: b |= ((u64)end[4]) << 32; /* fall through */
> > + case 7: b |= ((u64)end[6]) << 48; fallthrough;
> > + case 6: b |= ((u64)end[5]) << 40; fallthrough;
> > + case 5: b |= ((u64)end[4]) << 32; fallthrough;
> > case 4: b |= get_unaligned_le32(end); break;
> > - case 3: b |= ((u64)end[2]) << 16; /* fall through */
> > + case 3: b |= ((u64)end[2]) << 16; fallthrough;
> > case 2: b |= get_unaligned_le16(end); break;
> > case 1: b |= end[0];
> > }
> > @@ -268,11 +268,11 @@ u32 __hsiphash_aligned(const void *data, size_t len, const hsiphash_key_t *key)
> > bytemask_from_count(left)));
> > #else
> > switch (left) {
> > - case 7: b |= ((u64)end[6]) << 48; /* fall through */
> > - case 6: b |= ((u64)end[5]) << 40; /* fall through */
> > - case 5: b |= ((u64)end[4]) << 32; /* fall through */
> > + case 7: b |= ((u64)end[6]) << 48; fallthrough;
> > + case 6: b |= ((u64)end[5]) << 40; fallthrough;
> > + case 5: b |= ((u64)end[4]) << 32; fallthrough;
> > case 4: b |= le32_to_cpup(data); break;
> > - case 3: b |= ((u64)end[2]) << 16; /* fall through */
> > + case 3: b |= ((u64)end[2]) << 16; fallthrough;
> > case 2: b |= le16_to_cpup(data); break;
> > case 1: b |= end[0];
> > }
> > @@ -301,11 +301,11 @@ u32 __hsiphash_unaligned(const void *data, size_t len,
> > bytemask_from_count(left)));
> > #else
> > switch (left) {
> > - case 7: b |= ((u64)end[6]) << 48; /* fall through */
> > - case 6: b |= ((u64)end[5]) << 40; /* fall through */
> > - case 5: b |= ((u64)end[4]) << 32; /* fall through */
> > + case 7: b |= ((u64)end[6]) << 48; fallthrough;
> > + case 6: b |= ((u64)end[5]) << 40; fallthrough;
> > + case 5: b |= ((u64)end[4]) << 32; fallthrough;
> > case 4: b |= get_unaligned_le32(end); break;
> > - case 3: b |= ((u64)end[2]) << 16; /* fall through */
> > + case 3: b |= ((u64)end[2]) << 16; fallthrough;
> > case 2: b |= get_unaligned_le16(end); break;
> > case 1: b |= end[0];
> > }
> > @@ -431,7 +431,7 @@ u32 __hsiphash_aligned(const void *data, size_t len, const hsiphash_key_t *key)
> > v0 ^= m;
> > }
> > switch (left) {
> > - case 3: b |= ((u32)end[2]) << 16; /* fall through */
> > + case 3: b |= ((u32)end[2]) << 16; fallthrough;
> > case 2: b |= le16_to_cpup(data); break;
> > case 1: b |= end[0];
> > }
> > @@ -454,7 +454,7 @@ u32 __hsiphash_unaligned(const void *data, size_t len,
> > v0 ^= m;
> > }
> > switch (left) {
> > - case 3: b |= ((u32)end[2]) << 16; /* fall through */
> > + case 3: b |= ((u32)end[2]) << 16; fallthrough;
> > case 2: b |= get_unaligned_le16(end); break;
> > case 1: b |= end[0];
> > }
> > diff --git a/lib/ts_fsm.c b/lib/ts_fsm.c
> > index ab749ec10ab5..64fd9015ad80 100644
> > --- a/lib/ts_fsm.c
> > +++ b/lib/ts_fsm.c
> > @@ -193,7 +193,7 @@ static unsigned int fsm_find(struct ts_config *conf, struct ts_state *state)
> > TOKEN_MISMATCH();
> >
> > block_idx++;
> > - /* fall through */
> > + fallthrough;
> >
> > case TS_FSM_ANY:
> > if (next == NULL)
> > diff --git a/lib/vsprintf.c b/lib/vsprintf.c
> > index 14c9a6af1b23..d3c5c16f391c 100644
> > --- a/lib/vsprintf.c
> > +++ b/lib/vsprintf.c
> > @@ -1265,7 +1265,7 @@ char *mac_address_string(char *buf, char *end, u8 *addr,
> >
> > case 'R':
> > reversed = true;
> > - /* fall through */
> > + fallthrough;
> >
> > default:
> > separator = ':';
> > @@ -1682,7 +1682,7 @@ char *uuid_string(char *buf, char *end, const u8 *addr,
> > switch (*(++fmt)) {
> > case 'L':
> > uc = true;
> > - /* fall through */
> > + fallthrough;
> > case 'l':
> > index = guid_index;
> > break;
> > @@ -2219,7 +2219,7 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr,
> > case 'S':
> > case 's':
> > ptr = dereference_symbol_descriptor(ptr);
> > - /* fall through */
> > + fallthrough;
> > case 'B':
> > return symbol_string(buf, end, ptr, spec, fmt);
> > case 'R':
> > @@ -2450,7 +2450,7 @@ int format_decode(const char *fmt, struct printf_spec *spec)
> >
> > case 'x':
> > spec->flags |= SMALL;
> > - /* fall through */
> > + fallthrough;
> >
> > case 'X':
> > spec->base = 16;
> > @@ -2468,7 +2468,7 @@ int format_decode(const char *fmt, struct printf_spec *spec)
> > * utility, treat it as any other invalid or
> > * unsupported format specifier.
> > */
> > - /* fall through */
> > + fallthrough;
> >
> > default:
> > WARN_ONCE(1, "Please remove unsupported %%%c in format string\n", *fmt);
> > @@ -3411,10 +3411,10 @@ int vsscanf(const char *buf, const char *fmt, va_list args)
> > break;
> > case 'i':
> > base = 0;
> > - /* fall through */
> > + fallthrough;
> > case 'd':
> > is_sign = true;
> > - /* fall through */
> > + fallthrough;
> > case 'u':
> > break;
> > case '%':
> > diff --git a/lib/xz/xz_dec_lzma2.c b/lib/xz/xz_dec_lzma2.c
> > index 65a1aad8c223..ca2603abee08 100644
> > --- a/lib/xz/xz_dec_lzma2.c
> > +++ b/lib/xz/xz_dec_lzma2.c
> > @@ -1043,7 +1043,7 @@ XZ_EXTERN enum xz_ret xz_dec_lzma2_run(struct xz_dec_lzma2 *s,
> >
> > s->lzma2.sequence = SEQ_LZMA_PREPARE;
> >
> > - /* fall through */
> > + fallthrough;
> >
> > case SEQ_LZMA_PREPARE:
> > if (s->lzma2.compressed < RC_INIT_BYTES)
> > @@ -1055,7 +1055,7 @@ XZ_EXTERN enum xz_ret xz_dec_lzma2_run(struct xz_dec_lzma2 *s,
> > s->lzma2.compressed -= RC_INIT_BYTES;
> > s->lzma2.sequence = SEQ_LZMA_RUN;
> >
> > - /* fall through */
> > + fallthrough;
> >
> > case SEQ_LZMA_RUN:
> > /*
> > diff --git a/lib/xz/xz_dec_stream.c b/lib/xz/xz_dec_stream.c
> > index 32ab2a08b7cb..fea86deaaa01 100644
> > --- a/lib/xz/xz_dec_stream.c
> > +++ b/lib/xz/xz_dec_stream.c
> > @@ -583,7 +583,7 @@ static enum xz_ret dec_main(struct xz_dec *s, struct xz_buf *b)
> > if (ret != XZ_OK)
> > return ret;
> >
> > - /* fall through */
> > + fallthrough;
> >
> > case SEQ_BLOCK_START:
> > /* We need one byte of input to continue. */
> > @@ -608,7 +608,7 @@ static enum xz_ret dec_main(struct xz_dec *s, struct xz_buf *b)
> > s->temp.pos = 0;
> > s->sequence = SEQ_BLOCK_HEADER;
> >
> > - /* fall through */
> > + fallthrough;
> >
> > case SEQ_BLOCK_HEADER:
> > if (!fill_temp(s, b))
> > @@ -620,7 +620,7 @@ static enum xz_ret dec_main(struct xz_dec *s, struct xz_buf *b)
> >
> > s->sequence = SEQ_BLOCK_UNCOMPRESS;
> >
> > - /* fall through */
> > + fallthrough;
> >
> > case SEQ_BLOCK_UNCOMPRESS:
> > ret = dec_block(s, b);
> > @@ -629,7 +629,7 @@ static enum xz_ret dec_main(struct xz_dec *s, struct xz_buf *b)
> >
> > s->sequence = SEQ_BLOCK_PADDING;
> >
> > - /* fall through */
> > + fallthrough;
> >
> > case SEQ_BLOCK_PADDING:
> > /*
> > @@ -651,7 +651,7 @@ static enum xz_ret dec_main(struct xz_dec *s, struct xz_buf *b)
> >
> > s->sequence = SEQ_BLOCK_CHECK;
> >
> > - /* fall through */
> > + fallthrough;
> >
> > case SEQ_BLOCK_CHECK:
> > if (s->check_type == XZ_CHECK_CRC32) {
> > @@ -675,7 +675,7 @@ static enum xz_ret dec_main(struct xz_dec *s, struct xz_buf *b)
> >
> > s->sequence = SEQ_INDEX_PADDING;
> >
> > - /* fall through */
> > + fallthrough;
> >
> > case SEQ_INDEX_PADDING:
> > while ((s->index.size + (b->in_pos - s->in_start))
> > @@ -699,7 +699,7 @@ static enum xz_ret dec_main(struct xz_dec *s, struct xz_buf *b)
> >
> > s->sequence = SEQ_INDEX_CRC32;
> >
> > - /* fall through */
> > + fallthrough;
> >
> > case SEQ_INDEX_CRC32:
> > ret = crc32_validate(s, b);
> > @@ -709,7 +709,7 @@ static enum xz_ret dec_main(struct xz_dec *s, struct xz_buf *b)
> > s->temp.size = STREAM_HEADER_SIZE;
> > s->sequence = SEQ_STREAM_FOOTER;
> >
> > - /* fall through */
> > + fallthrough;
> >
> > case SEQ_STREAM_FOOTER:
> > if (!fill_temp(s, b))
> > diff --git a/lib/zstd/bitstream.h b/lib/zstd/bitstream.h
> > index 3a49784d5c61..7c65c66e41fd 100644
> > --- a/lib/zstd/bitstream.h
> > +++ b/lib/zstd/bitstream.h
> > @@ -259,15 +259,15 @@ ZSTD_STATIC size_t BIT_initDStream(BIT_DStream_t *bitD, const void *srcBuffer, s
> > bitD->bitContainer = *(const BYTE *)(bitD->start);
> > switch (srcSize) {
> > case 7: bitD->bitContainer += (size_t)(((const BYTE *)(srcBuffer))[6]) << (sizeof(bitD->bitContainer) * 8 - 16);
> > - /* fall through */
> > + fallthrough;
> > case 6: bitD->bitContainer += (size_t)(((const BYTE *)(srcBuffer))[5]) << (sizeof(bitD->bitContainer) * 8 - 24);
> > - /* fall through */
> > + fallthrough;
> > case 5: bitD->bitContainer += (size_t)(((const BYTE *)(srcBuffer))[4]) << (sizeof(bitD->bitContainer) * 8 - 32);
> > - /* fall through */
> > + fallthrough;
> > case 4: bitD->bitContainer += (size_t)(((const BYTE *)(srcBuffer))[3]) << 24;
> > - /* fall through */
> > + fallthrough;
> > case 3: bitD->bitContainer += (size_t)(((const BYTE *)(srcBuffer))[2]) << 16;
> > - /* fall through */
> > + fallthrough;
> > case 2: bitD->bitContainer += (size_t)(((const BYTE *)(srcBuffer))[1]) << 8;
> > default:;
> > }
> > diff --git a/lib/zstd/compress.c b/lib/zstd/compress.c
> > index 5e0b67003e55..b080264ed3ad 100644
> > --- a/lib/zstd/compress.c
> > +++ b/lib/zstd/compress.c
> > @@ -3182,7 +3182,7 @@ static size_t ZSTD_compressStream_generic(ZSTD_CStream *zcs, void *dst, size_t *
> > zcs->outBuffFlushedSize = 0;
> > zcs->stage = zcss_flush; /* pass-through to flush stage */
> > }
> > - /* fall through */
> > + fallthrough;
> >
> > case zcss_flush: {
> > size_t const toFlush = zcs->outBuffContentSize - zcs->outBuffFlushedSize;
> > diff --git a/lib/zstd/decompress.c b/lib/zstd/decompress.c
> > index db6761ea4deb..66cd487a326a 100644
> > --- a/lib/zstd/decompress.c
> > +++ b/lib/zstd/decompress.c
> > @@ -442,7 +442,7 @@ size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx *dctx, const void *src, size_t srcSize
> > case set_repeat:
> > if (dctx->litEntropy == 0)
> > return ERROR(dictionary_corrupted);
> > - /* fall through */
> > + fallthrough;
> > case set_compressed:
> > if (srcSize < 5)
> > return ERROR(corruption_detected); /* srcSize >= MIN_CBLOCK_SIZE == 3; here we need up to 5 for case 3 */
> > @@ -1768,7 +1768,7 @@ size_t ZSTD_decompressContinue(ZSTD_DCtx *dctx, void *dst, size_t dstCapacity, c
> > return 0;
> > }
> > dctx->expected = 0; /* not necessary to copy more */
> > - /* fall through */
> > + fallthrough;
> >
> > case ZSTDds_decodeFrameHeader:
> > memcpy(dctx->headerBuffer + ZSTD_frameHeaderSize_prefix, src, dctx->expected);
> > @@ -2309,7 +2309,7 @@ size_t ZSTD_decompressStream(ZSTD_DStream *zds, ZSTD_outBuffer *output, ZSTD_inB
> > switch (zds->stage) {
> > case zdss_init:
> > ZSTD_resetDStream(zds); /* transparent reset on starting decoding a new frame */
> > - /* fall through */
> > + fallthrough;
> >
> > case zdss_loadHeader: {
> > size_t const hSize = ZSTD_getFrameParams(&zds->fParams, zds->headerBuffer, zds->lhSize);
> > @@ -2376,7 +2376,7 @@ size_t ZSTD_decompressStream(ZSTD_DStream *zds, ZSTD_outBuffer *output, ZSTD_inB
> > }
> > zds->stage = zdss_read;
> > }
> > - /* fall through */
> > + fallthrough;
> >
> > case zdss_read: {
> > size_t const neededInSize = ZSTD_nextSrcSizeToDecompress(zds->dctx);
> > @@ -2405,7 +2405,7 @@ size_t ZSTD_decompressStream(ZSTD_DStream *zds, ZSTD_outBuffer *output, ZSTD_inB
> > zds->stage = zdss_load;
> > /* pass-through */
> > }
> > - /* fall through */
> > + fallthrough;
> >
> > case zdss_load: {
> > size_t const neededInSize = ZSTD_nextSrcSizeToDecompress(zds->dctx);
> > @@ -2438,7 +2438,7 @@ size_t ZSTD_decompressStream(ZSTD_DStream *zds, ZSTD_outBuffer *output, ZSTD_inB
> > /* pass-through */
> > }
> > }
> > - /* fall through */
> > + fallthrough;
> >
> > case zdss_flush: {
> > size_t const toFlushSize = zds->outEnd - zds->outStart;
> > diff --git a/lib/zstd/huf_compress.c b/lib/zstd/huf_compress.c
> > index e727812d12aa..08b4ae80aed4 100644
> > --- a/lib/zstd/huf_compress.c
> > +++ b/lib/zstd/huf_compress.c
> > @@ -556,9 +556,9 @@ size_t HUF_compress1X_usingCTable(void *dst, size_t dstSize, const void *src, si
> > n = srcSize & ~3; /* join to mod 4 */
> > switch (srcSize & 3) {
> > case 3: HUF_encodeSymbol(&bitC, ip[n + 2], CTable); HUF_FLUSHBITS_2(&bitC);
> > - /* fall through */
> > + fallthrough;
> > case 2: HUF_encodeSymbol(&bitC, ip[n + 1], CTable); HUF_FLUSHBITS_1(&bitC);
> > - /* fall through */
> > + fallthrough;
> > case 1: HUF_encodeSymbol(&bitC, ip[n + 0], CTable); HUF_FLUSHBITS(&bitC);
> > case 0:
> > default:;
> > --
> > 2.29.2.299.gdc1121823c-goog
> >
--
Thanks,
~Nick Desaulniers
^ permalink raw reply
* [PATCH 3/3] ibmvfc: use correlation token to tag commands
From: Tyrel Datwyler @ 2020-11-17 18:50 UTC (permalink / raw)
To: james.bottomley
Cc: Tyrel Datwyler, martin.petersen, linux-scsi, linux-kernel, brking,
linuxppc-dev
In-Reply-To: <20201117185031.129939-1-tyreld@linux.ibm.com>
The vfcFrame correlation field is 64bit handle that is intended to trace
I/O operations through both the client stack and VIOS stack when the
underlying physical FC adapter supports tagging.
Tag vfcFrames with the associated ibmvfc_event pointer handle.
Signed-off-by: Tyrel Datwyler <tyreld@linux.ibm.com>
---
drivers/scsi/ibmvscsi/ibmvfc.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/drivers/scsi/ibmvscsi/ibmvfc.c b/drivers/scsi/ibmvscsi/ibmvfc.c
index 0cab4b852b48..3922441a117d 100644
--- a/drivers/scsi/ibmvscsi/ibmvfc.c
+++ b/drivers/scsi/ibmvscsi/ibmvfc.c
@@ -1693,6 +1693,8 @@ static int ibmvfc_queuecommand_lck(struct scsi_cmnd *cmnd,
vfc_cmd->iu.pri_task_attr = IBMVFC_SIMPLE_TASK;
}
+ vfc_cmd->correlation = cpu_to_be64(evt);
+
if (likely(!(rc = ibmvfc_map_sg_data(cmnd, evt, vfc_cmd, vhost->dev))))
return ibmvfc_send_event(evt, vhost, 0);
@@ -2370,6 +2372,8 @@ static int ibmvfc_abort_task_set(struct scsi_device *sdev)
tmf->iu.tmf_flags = IBMVFC_ABORT_TASK_SET;
evt->sync_iu = &rsp_iu;
+ tmf->correlation = cpu_to_be64(evt);
+
init_completion(&evt->comp);
rsp_rc = ibmvfc_send_event(evt, vhost, default_timeout);
}
--
2.27.0
^ permalink raw reply related
* [PATCH 2/3] ibmvfc: remove trailing semicolon
From: Tyrel Datwyler @ 2020-11-17 18:50 UTC (permalink / raw)
To: james.bottomley
Cc: Tyrel Datwyler, martin.petersen, linux-scsi, linux-kernel, brking,
linuxppc-dev
In-Reply-To: <20201117185031.129939-1-tyreld@linux.ibm.com>
Remove a superfluous semicolon following a closing function block
bracket.
Signed-off-by: Tyrel Datwyler <tyreld@linux.ibm.com>
---
drivers/scsi/ibmvscsi/ibmvfc.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/scsi/ibmvscsi/ibmvfc.c b/drivers/scsi/ibmvscsi/ibmvfc.c
index 01fe65de9086..0cab4b852b48 100644
--- a/drivers/scsi/ibmvscsi/ibmvfc.c
+++ b/drivers/scsi/ibmvscsi/ibmvfc.c
@@ -4391,7 +4391,7 @@ static void ibmvfc_npiv_login(struct ibmvfc_host *vhost)
ibmvfc_dbg(vhost, "Sent NPIV login\n");
else
ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD);
-};
+}
/**
* ibmvfc_npiv_logout_done - Completion handler for NPIV Logout
--
2.27.0
^ permalink raw reply related
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox